<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Web Developer Platform WebApps Japan</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://azure.github.io/jpazpaas/</id>
  <link href="https://azure.github.io/jpazpaas/" rel="alternate"/>
  <link href="https://azure.github.io/jpazpaas/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Web Developer Platform WebApps Japan</rights>
  <subtitle>日本マイクロソフトの App Service, Service Bus, Service Fabric, Communication Services に関するサポート情報のブログです。サポートエンジニアがもつ知見や経験事例をご紹介していきます。</subtitle>
  <title>Japan PaaS Support Team Blog</title>
  <updated>2026-04-08T05:14:28.284Z</updated>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="AI Search" scheme="https://azure.github.io/jpazpaas/tags/AI-Search/"/>
    <content>
      <![CDATA[<p>Azure AI Search サービスでパブリック ネットワーク アクセスを無効化し、プライベート エンドポイント経由のみでアクセス可能な構成としています。</p><p>この状態で Azure ポータルの Azure AI Search から</p><ul><li>「インデックス」</li><li>「インデクサー」</li><li>「データソース」</li><li>「スキルセット」</li></ul><p>などの画面で、次のようなエラーが表示されます。</p><ul><li><strong>「インデックスの一覧の読み込み中にエラーが発生しました」</strong></li><li>概要欄のエラーメッセージに <strong>“Failed to fetch”</strong></li></ul><p><img src="/jpazpaas/2026/02/17/How-to-resolve-failed-to-fetch-on-azure-ai-search-when-using-private-endpoint/image-e35b4520-5f43-4e98-98ab-e46b675e9c51.png" alt="インデックスの一覧の読み込み中にエラーが発生"></p><p>ネットワークや DNS は問題なく、VM から <code>curl</code> や SDK 経由で AI Search エンドポイントへは正常に到達できています。<br>このようなケースでは何が原因で、どのように対処すればよいでしょうか？</p><hr><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><p>この事象はAzure ポータルから Azure AI Search 内部 API を呼び出す際、<strong>ブラウザ側のローカル ネットワーク アクセス制限機能により通信がブロックされる</strong>ことが原因で発生する可能性があります。</p><p>これにより、Azure ポータルのデータ取得 API が実行されず “Failed to fetch” が返る状況が発生します。</p><hr><h2 id="発生しやすいケース"><a href="#発生しやすいケース" class="headerlink" title="発生しやすいケース"></a>発生しやすいケース</h2><ul><li>Azure AI Search へのアクセスが <strong>Private Endpoint 経由のみ許可</strong>されている  </li><li>同一環境でもユーザーによって再現したりしなかったりする（＝ブラウザの個別設定差による）</li></ul><hr><h2 id="対処方法"><a href="#対処方法" class="headerlink" title="対処方法"></a>対処方法</h2><p>Azure ポータル (portal.azure.com) に対して、ブラウザ側のローカル ネットワーク アクセスを許可する。</p><h3 id="Microsoft-Edge-を利用する場合の対応"><a href="#Microsoft-Edge-を利用する場合の対応" class="headerlink" title="Microsoft Edge を利用する場合の対応"></a>Microsoft Edge を利用する場合の対応</h3><p>エラーが発生する画面において、以下の設定を実施する<br>        <img src="/jpazpaas/2026/02/17/How-to-resolve-failed-to-fetch-on-azure-ai-search-when-using-private-endpoint/==image_0==-a8a2a9af-c36e-4545-bf41-d6461f53dcc5.png" alt="Microsoft Edge のローカル ネットワーク アクセスを許可する"> </p><h3 id="Google-Chrome-を利用する場合の対応"><a href="#Google-Chrome-を利用する場合の対応" class="headerlink" title="Google Chrome を利用する場合の対応"></a>Google Chrome を利用する場合の対応</h3><p>エラーが発生する画面において、以下の設定を実施する<br>        <img src="/jpazpaas/2026/02/17/How-to-resolve-failed-to-fetch-on-azure-ai-search-when-using-private-endpoint/==image_0==-cb60a7ca-420f-4a3f-b7ed-3f1c7659d723.png" alt="Google Chrome のローカル ネットワーク アクセスを許可する"> </p><hr><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://learn.microsoft.com/ja-jp/azure/search/service-create-private-endpoint#use-the-azure-portal-to-access-a-private-search-service">安全な接続のためにプライベート エンドポイントを作成する - Azure AI Search | Microsoft Learn</a><br><br><br><br></p><hr><br><br><p>2026 年 02 月 17 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2026/02/17/How-to-resolve-failed-to-fetch-on-azure-ai-search-when-using-private-endpoint.html</id>
    <link href="https://azure.github.io/jpazpaas/2026/02/17/How-to-resolve-failed-to-fetch-on-azure-ai-search-when-using-private-endpoint.html"/>
    <published>2026-04-08T05:15:31.290Z</published>
    <summary>
      <![CDATA[<p>Azure AI Search サービスでパブリック ネットワーク アクセスを無効化し、プライベート エンドポイント経由のみでアクセス可能な構成としています。</p>
<p>この状態で Azure ポータルの Azure AI Search から</p>
<ul>
<li>]]>
    </summary>
    <title>プライベートエンドポイント経由で Azure ポータルから Azure AI Search にアクセスした際に &quot;Failed to fetch&quot; が表示される場合の対処方法</title>
    <updated>2026-04-08T05:14:28.284Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <content>
      <![CDATA[<p>Azure Functions に<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-deployment-technologies?tabs=windows#trigger-syncing">トリガーの同期</a>がありますが何の機能ですか。</p><blockquote><p>トリガーのいずれかを変更する場合、Functions インフラストラクチャにその変更を認識させる必要があります。 同期は、多くのデプロイ テクノロジでは自動的に実行されます。 ただし、場合によっては、トリガーを手動で同期する必要があります。</p></blockquote><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><p>Azure Functions にデプロイされたアプリケーションのトリガーの情報を Azure Functions のバックエンドに同期するための機能です。</p><h2 id="なぜトリガーの同期が必要か"><a href="#なぜトリガーの同期が必要か" class="headerlink" title="なぜトリガーの同期が必要か"></a>なぜトリガーの同期が必要か</h2><p>Azure Functions は、アプリケーション ルート(&#x2F;home&#x2F;site&#x2F;wwwroot&#x2F;)を基幹として複数のトリガーごとにフォルダを分割した構造となっています。下記は C#(インプロセス) の場合の<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-dotnet-class-library?tabs=v4,cmd#functions-class-library-project">フォルダ階層</a>の例です。</p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-7da7eea6-9e7d-4aec-852d-34ac06f2cff2.png" alt="image-7da7eea6-9e7d-4aec-852d-34ac06f2cff2.png"></p><p>host.json と呼ばれる Azure Functions 全体の設定ファイルに加えて、ご利用の各トリガーごとに function.json と呼ばれる定義ファイルを保持しております。どういったバインディングを利用しているかの一覧などの情報を知るためにはファイル名などの表面的な情報では不足しており、すべての設定ファイルを読み込み・解釈する必要があります。</p><p>例えば、Azure ポータルの関数一覧に実装したトリガーを表示することを考えます。下記のような複数のトリガーを実装した場合には、この Azure Functions リソースにデプロイされているアプリケーションには、BLOBTrigger~TimerTrigger まで 15 個のトリガーが実装されていますが、この一覧という情報はどの設定ファイルにも無く、それぞれのトリガーごとのフォルダに含まれている functions.json を確認する必要があります。</p><p><strong>関数一覧</strong></p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-46fd2f8a-e707-4450-8525-fe6f71bcebdc.png" alt="image-46fd2f8a-e707-4450-8525-fe6f71bcebdc.png"></p><p><strong>BLOBTrigger の function.json の例</strong></p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-b6c0a2a3-1896-4566-9365-d3d18a9650d6.png" alt="image-b6c0a2a3-1896-4566-9365-d3d18a9650d6.png"></p><p>こういった情報(いわば Azure Functions のメタデータ)を更新するための契機としてトリガーの同期が存在しています。</p><h2 id="動作シーケンス"><a href="#動作シーケンス" class="headerlink" title="動作シーケンス"></a>動作シーケンス</h2><p>前述の解説と<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-deployment-technologies?tabs=windows#trigger-syncing">こちら</a>にある通り、トリガーの同期はデプロイ時に実施する必要があります。Azure Functions での推奨としている ZIP デプロイの場合の動作を確認します。</p><ol><li><p><a href="https://github.com/projectkudu/kudu/wiki/Deploying-from-a-zip-file-or-url">ZIP デプロイ</a>とは、Kudu(SCM サイト) の <code>/api/zipdeploy</code> エンドポイントにアプリケーション コンテンツと一緒に POST 通信することです。このデプロイ時に、Kudu の PostDeploymentHelper クラスの中で Azure Functions の場合には<a href="https://github.com/projectkudu/kudu/blob/98d12cf400675bf0c5fefffd92c4dc6f36d6e33b/Kudu.Core/Helpers/PostDeploymentHelper.cs#L299-L300">トリガーの同期</a> (<code>/admin/host/synctriggers</code> へのリクエスト)が呼び出されています。</p></li><li><p>このトリガーの同期のエンドポイント <code>/admin/host/synctriggers</code> は Azure Functions がリスンしているエンドポイントです。<a href="https://github.com/Azure/azure-functions-host/blob/ed7e802e2e48d31754bf2ce9ee7033a4f0ab9c00/src/WebJobs.Script.WebHost/Management/FunctionsSyncManager.cs#L725-L726">FunctionsSyncManager クラス</a>で、<code>/admin/host/synctriggers</code> を受けたら <code>/operation/settriggers</code> を呼び出しています。</p></li></ol><p>以上の2段の HTTP リクエストが発出されることでトリガーの同期が行われます。<code>/operation/settriggers</code> を受け付けた以降の処理は Azure Functions 内部動作となっており現時点で公開情報はございません。</p><p>VNet 統合している場合の動作シーケンスのイメージは下記となります。<br><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-63418e81-91c7-4edb-8fd0-148e98fa756d.png" alt="image-63418e81-91c7-4edb-8fd0-148e98fa756d.png"></p><h2 id="トリガーの同期失敗による影響と対策"><a href="#トリガーの同期失敗による影響と対策" class="headerlink" title="トリガーの同期失敗による影響と対策"></a>トリガーの同期失敗による影響と対策</h2><p>トリガーの同期が失敗するとどういった影響があるか解説します。<br>構成例として、ある Azure Functions が VNet 統合を設定しており、サブネットに適用された NSG で外部接続（Outbound）がすべて拒否されている場合を考えます。</p><h3 id="1-Azure-ポータルにトリガーが表示されない"><a href="#1-Azure-ポータルにトリガーが表示されない" class="headerlink" title="1. Azure ポータルにトリガーが表示されない"></a>1. Azure ポータルにトリガーが表示されない</h3><p>Kudu から確認するとアプリケーション ルート(&#x2F;home&#x2F;site&#x2F;wwwroot&#x2F;)にアプリケーション コードは配置されていますが、Azure ポータルの関数には一切の関数が表示されず、あたかも何もデプロイされていないように見えてしまいます。この状態ではデプロイされているアプリケーション コードは起動するため、処理は行われます。画面表示との乖離が問題となります。</p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-31938ab1-6302-4bfb-88ff-d50e2443ba5d.png" alt="image-31938ab1-6302-4bfb-88ff-d50e2443ba5d.png"></p><p>また関数は確認できるものの、エラーが発生した旨を警告するメッセージが出力される場合もあります。</p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/==image_0==-1312773e-66c0-407a-84bd-45b9e99c9a7d.png" alt="&#x3D;&#x3D;image_0&#x3D;&#x3D;-1312773e-66c0-407a-84bd-45b9e99c9a7d.png"> </p><p>この時 Azure Functions のアクティビティ ログを確認すると、直前のトリガーの同期が失敗していることがわかります。</p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-6bb326fd-1d34-4c04-b4b5-7fae36e5233d.png" alt="image-6bb326fd-1d34-4c04-b4b5-7fae36e5233d.png"></p><p>さらに、<a href="https://learn.microsoft.com/ja-jp/rest/api/appservice/web-apps/sync-function-triggers">こちら</a>から手動でトリガーの同期を実行することができます。実際にトリガーの同期を行ってみると 400 BadRequest が応答されます。</p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-6e6ef434-b0e5-460b-a33f-2e309c0cc4dd.png" alt="image-6e6ef434-b0e5-460b-a33f-2e309c0cc4dd.png"></p><p>トリガーの同期の失敗については Application Insights 上でも以下のクエリを実行することで確認できます。<br>本確認手順の場合には、より詳細なエラー内容を確認することができ、下記の例の場合には、ネットワーク接続によるエラーであることまで確認できます。</p><h2 id="Application-Insights-で利用するクエリ例"><a href="#Application-Insights-で利用するクエリ例" class="headerlink" title="Application Insights で利用するクエリ例"></a>Application Insights で利用するクエリ例</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">exceptions</span><br><span class="line">| where customDimensions.FormattedMessage startswith &quot;SyncTrigger&quot;</span><br></pre></td></tr></table></figure><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-a35a2e6f-f2bf-4437-ad5e-593fda0dabc9.png" alt="image-a35a2e6f-f2bf-4437-ad5e-593fda0dabc9.png"></p><h3 id="2-従量課金プランまたは-EP-プランのスケーリングが動作しない"><a href="#2-従量課金プランまたは-EP-プランのスケーリングが動作しない" class="headerlink" title="2. 従量課金プランまたは EP プランのスケーリングが動作しない"></a>2. 従量課金プランまたは EP プランのスケーリングが動作しない</h3><p>従量課金プラン及び EP プランでは、<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/event-driven-scaling?tabs=azure-cli#runtime-scaling">イベントドリブン スケーリング</a>と呼ばれる動作で Azure Functions プラットフォームにてスケール イン&#x2F;アウトが行われます。この際に Azure Functions のスケール コントローラーと呼ばれるコンポーネントが動作しスケール イン&#x2F;アウトの決定をしてますが、このスケール コントローラーも Azure Functions のメタデータを利用します。</p><p>キュー トリガーを例とすると、対象のキューの長さを基にスケール コントローラーがスケール イン&#x2F;アウトの決定をします。トリガーの同期が失敗している場合には、そもそもスケール コントローラーが対象のキューの長さを参照するように動作せず、スケール イン&#x2F;アウトの決定を行いません。結果として、多量のキュー メッセージがあるにもかかわらず、スケール アウトされない(性能上のボトルネック)や、従量課金プランの場合には 0 インスタンスとなる場合があるため、いつまで経ってもキュー メッセージが処理されないことが発生し得ます。</p><h3 id="3-アプリ-キーの更新が反映されない"><a href="#3-アプリ-キーの更新が反映されない" class="headerlink" title="3. アプリ キーの更新が反映されない"></a>3. アプリ キーの更新が反映されない</h3><p>更新したアプリ キーの反映にはキーを格納している Blob ストレージへの更新操作と、Azure Functions のキャッシュ情報を更新するためのトリガーの同期が行うことで実現しています。トリガーの同期が失敗している場合にはこの更新状態の不整合が生じ、更新したアプリ キーでアクセスするとアクセス エラーとなります。</p><h3 id="対策"><a href="#対策" class="headerlink" title="対策"></a>対策</h3><p>動作シーケンスの通りトリガーの同期の通信が通るように通信許可設定を追加します。<br>前述の NSG によって通信が拒否されている場合には、AppService のサービスタグを通信許可ルールとして追加します。AzureFirewall などを利用の場合には、<code>*.azurewebsites.net</code> の FQDN で 80 番及び 443 番ポートの外部通信を許可します。<br>またプライベート エンドポイントをご利用いただいている場合には、サービス タグの許可ではなく、IP アドレスの許可にてプライベート エンドポイントに対する通信を許可ルールに追加します。</p><p><strong>NSG の送信ルール例</strong></p><p><img src="/jpazpaas/2023/09/15/what-is-sync-trigger/image-c22289ef-2b81-459f-a953-57b9e050a74b.png" alt="image-c22289ef-2b81-459f-a953-57b9e050a74b.png"></p><p>また、一時的なネットワークによる失敗である場合には<a href="https://learn.microsoft.com/ja-jp/rest/api/appservice/web-apps/sync-function-triggers">手動にてトリガーの同期</a>を行うことも有効となります。</p><p>以上が Azure Functions におけるトリガーの同期の解説となります。Azure Functions にアプリケーションをデプロイしたけど、ポータルで参照できないなどトラブルシューティングにお役に立てば幸いです。</p><br><br><hr><br><br><p>2026 年 04 月 01 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2023/09/15/what-is-sync-trigger.html</id>
    <link href="https://azure.github.io/jpazpaas/2023/09/15/what-is-sync-trigger.html"/>
    <published>2026-03-31T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Azure Functions に<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-deployment-technologies?tabs=windows#trigger-]]>
    </summary>
    <title>Azure Functions のトリガーの同期とは</title>
    <updated>2026-04-08T05:14:28.105Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="App Service" scheme="https://azure.github.io/jpazpaas/tags/App-Service/"/>
    <category term="Web Apps" scheme="https://azure.github.io/jpazpaas/tags/Web-Apps/"/>
    <category term="WebJobs" scheme="https://azure.github.io/jpazpaas/tags/WebJobs/"/>
    <content>
      <![CDATA[<p>お世話になっております。Azure App Service サポート担当の押田です。<br>本記事は、Azure App Service の <strong>Triggered WebJob</strong> において、デプロイ直後に WebJob が意図せず即実行されるケースについて解説します。</p><p>Triggered WebJob は Cron 式でスケジュールを設定できますが、削除方法とデプロイのタイミングによっては、次のスケジュール時刻を待たずに直後に実行されることがあります。これは <strong>Kudu のスケジューラに実装されている「10 分間のグレース期間（grace period）」</strong> に起因する設計上の動作です。</p><p>公式ドキュメントにはこのグレース期間に関する詳細な記載がないため、本記事ではソースコードの実装を根拠として動作を説明し、回避策を紹介します。</p><h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><h2 id="Triggered-WebJob-のスケジュール実行の仕組み"><a href="#Triggered-WebJob-のスケジュール実行の仕組み" class="headerlink" title="Triggered WebJob のスケジュール実行の仕組み"></a>Triggered WebJob のスケジュール実行の仕組み</h2><p>Azure App Service の Triggered WebJob では、<code>settings.job</code> ファイルに Cron 式を記述することでスケジュール実行が可能です。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;schedule&quot;</span><span class="punctuation">:</span> <span class="string">&quot;0 0,30 * * * *&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>このスケジュールは Kudu（App Service のデプロイエンジン &#x2F; 管理サイト）内のスケジューラ（<code>TriggeredJobsScheduler</code>）によって管理されます。WebJob がデプロイされると、スケジューラはジョブの <strong>前回実行時刻（<code>LatestRun</code>）</strong> と <strong>Cron 式</strong> をもとに次回実行タイミングを計算します。</p><h2 id="問題-—-デプロイ直後の意図しない即実行"><a href="#問題-—-デプロイ直後の意図しない即実行" class="headerlink" title="問題 — デプロイ直後の意図しない即実行"></a>問題 — デプロイ直後の意図しない即実行</h2><p>以下のようなシナリオで問題が発生します。</p><ol><li>Cron 式 <code>0 0,30 * * * *</code>（毎時 00 分と 30 分に実行）で WebJob を運用中</li><li>13:00 に WebJob がスケジュール通り実行される（次回スケジュールは 13:30）</li><li>VFS API や FTP、Kudu ファイルブラウザ等で <strong>WebJob のバイナリファイルを手動削除する</strong><ul><li>ファイルウォッチャーが削除を検知し、スケジューラが 13:30 のスケジュールを <strong>即座に解除</strong> する（ログ: <code>Removing current schedule from WebJob</code>）</li><li>ただし実行履歴データ（<code>C:\home\data\</code>）は残るため <code>LatestRun = 13:00</code> が保持される</li></ul></li><li><strong>13:35 に WebJob を再デプロイする</strong></li><li>スケジューラが <code>LatestRun = 13:00</code> を基に次回スケジュール（13:30）を再計算し、10 分以内の過去と判定して <strong>即実行する</strong></li></ol><p>※ 3 のステップにおいて、ポータルからの操作や <code>DELETE /api/triggeredwebjobs/{job name}</code> を用いた場合は実行履歴データも削除されるため、この記事で紹介する内容には該当しません。</p><h2 id="再現検証"><a href="#再現検証" class="headerlink" title="再現検証"></a>再現検証</h2><p>以下の 2 つのケースで検証を行いました。</p><p><strong>検証環境</strong>: App Service（B1 プラン, Always On 有効）<br><strong>Cron 式</strong>: <code>0 */30 * * * *</code>（毎時 00 分と 30 分）</p><p>前述 1 ~ 3 のステップ実行後、4 のステップを行うタイミングで動作が変わることを確認します。</p><h3 id="Case-A-—-スケジュール時刻の-5-分後にデプロイ-→-即実行される"><a href="#Case-A-—-スケジュール時刻の-5-分後にデプロイ-→-即実行される" class="headerlink" title="Case A — スケジュール時刻の 5 分後にデプロイ → 即実行される"></a>Case A — スケジュール時刻の 5 分後にデプロイ → 即実行される</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[03/31/2026 12:35:16 &gt; 11d75b: SYS INFO] Scheduling WebJob with 0 0,30 * * * * next schedule expected in 00:00:00</span><br><span class="line">[03/31/2026 12:35:16 &gt; 11d75b: SYS INFO] Invoking triggered web job on instance 11d75bcbb6c00295b0add383ae24b636e2d6a516557a878b08e12c19251084e4 at UTC datetime 3/31/2026 12:35:16 PM</span><br><span class="line">[03/31/2026 12:35:16 &gt; 11d75b: SYS INFO] WebJob invoked</span><br></pre></td></tr></table></figure><p><code>next schedule expected in 00:00:00</code> — 次回までの待機時間が 0 と判定され、即実行されています。</p><h3 id="Case-B-—-スケジュール時刻の-15-分後にデプロイ-→-即実行されない"><a href="#Case-B-—-スケジュール時刻の-15-分後にデプロイ-→-即実行されない" class="headerlink" title="Case B — スケジュール時刻の 15 分後にデプロイ → 即実行されない"></a>Case B — スケジュール時刻の 15 分後にデプロイ → 即実行されない</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[03/31/2026 13:15:18 &gt; 11d75b: SYS WARN] Missed 1 schedules, most recent at 3/31/2026 1:00:00 PM</span><br><span class="line">[03/31/2026 13:15:18 &gt; 11d75b: SYS INFO] Scheduling WebJob with 0 0,30 * * * * next schedule expected in 00:14:41.7471271</span><br></pre></td></tr></table></figure><p>スケジュールのミスが検出されましたが、即実行はされず、次回スケジュール（約 15 分後）まで待機しています。</p><h2 id="なぜこのような動作となるのか"><a href="#なぜこのような動作となるのか" class="headerlink" title="なぜこのような動作となるのか"></a>なぜこのような動作となるのか</h2><h3 id="実装から確認"><a href="#実装から確認" class="headerlink" title="実装から確認"></a>実装から確認</h3><p>Kudu のスケジューラ実装（<a href="https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Jobs/Schedule.cs">Schedule.cs</a>）の <code>GetNextInterval</code> メソッドに、以下のロジックがあります。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (ignoreMissed || nextOccurrence &gt;= now - TimeSpan.FromMinutes(<span class="number">10</span>))</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> TimeSpan.Zero;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>このコードは次のように動作します：</p><ul><li>スケジューラが次回の実行予定時刻（<code>nextOccurrence</code>）を計算する</li><li>その時刻が <strong>現在時刻から 10 分以内の過去</strong> であれば、待機時間を <code>TimeSpan.Zero</code>（&#x3D; 即実行）として返す</li><li>10 分を超えて過去であれば、ミスしたスケジュールとして扱い、次の未来のスケジュールまで待機する</li></ul><p>この <strong>10 分間のグレース期間</strong>が設けられていることから、Case A と Case B のようにデプロイタイミングによって動作が異なるものとなります。</p><h2 id="削除方法による-LatestRun-への影響"><a href="#削除方法による-LatestRun-への影響" class="headerlink" title="削除方法による LatestRun への影響"></a>削除方法による LatestRun への影響</h2><p>WebJob の削除方法によって、実行履歴（<code>LatestRun</code>）の残り方が異なります。これはグレース期間の判定に影響するため注意が必要です。</p><h3 id="Kudu-DELETE-API-Azure-ポータルからの削除"><a href="#Kudu-DELETE-API-Azure-ポータルからの削除" class="headerlink" title="Kudu DELETE API &#x2F; Azure ポータルからの削除"></a>Kudu DELETE API &#x2F; Azure ポータルからの削除</h3><p>Kudu DELETE API(<code> DELETE /api/triggeredwebjobs/{job name}</code>)を呼びだした場合、 <a href="https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Jobs/JobsManagerBase.cs#L245"><code>DeleteJob</code> メソッド</a>は、ジョブのバイナリと実行履歴データの <strong>両方</strong> を削除します。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Remove both job binaries and data directories</span></span><br><span class="line">FileSystemHelpers.DeleteDirectorySafe(jobDirectory.FullName, ignoreErrors: <span class="literal">false</span>);</span><br><span class="line">FileSystemHelpers.DeleteDirectorySafe(jobsSpecificDataPath, ignoreErrors: <span class="literal">false</span>);</span><br></pre></td></tr></table></figure><p>この方法で削除した場合、再デプロイ時に <code>LatestRun</code> は <code>2026 年 04 月 01 日時点の内容となります。&lt;br&gt;</code>（&#x3D; <code>DateTime.MinValue</code>）となります。<code>GetNextInterval</code> メソッドでは <code>DateTime.MinValue</code> を <code>now</code> に置き換えるため、<code>GetNextOccurrence(now)</code> は常に未来の時刻を返し、<strong>グレース期間による即実行は発生しません</strong>。</p><h3 id="VFS-FTP-でファイルを手動削除した場合"><a href="#VFS-FTP-でファイルを手動削除した場合" class="headerlink" title="VFS &#x2F; FTP でファイルを手動削除した場合"></a>VFS &#x2F; FTP でファイルを手動削除した場合</h3><p>VFS API や FTP を使ってジョブのバイナリファイルのみを手動削除した場合、実行履歴データ（<code>C:\home\data\jobs\triggered\&lt;job-name&gt;\</code> 配下）は残ります。そのため再デプロイ時に前回の <code>LatestRun</code> が保持され、グレース期間の判定に影響します。</p><h2 id="回避策"><a href="#回避策" class="headerlink" title="回避策"></a>回避策</h2><p>デプロイ直後の意図しない即実行を防ぐには、以下の方法があります。</p><h3 id="方法-1-WebJob-DELETE-API-で削除してから再デプロイする（推奨）"><a href="#方法-1-WebJob-DELETE-API-で削除してから再デプロイする（推奨）" class="headerlink" title="方法 1: WebJob DELETE API で削除してから再デプロイする（推奨）"></a>方法 1: WebJob DELETE API で削除してから再デプロイする（推奨）</h3><p>VFS &#x2F; FTP による手動削除ではなく、Kudu の DELETE API または Azure ポータルから WebJob を削除することで、実行履歴（<code>LatestRun</code>）も含めてクリーンな状態にできます。再デプロイ時に <code>LatestRun = null</code> となるため、グレース期間による即実行は発生しません。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># WebJob を DELETE API で削除（バイナリ + 実行履歴の両方が削除される）</span></span><br><span class="line"><span class="built_in">Invoke-RestMethod</span> <span class="literal">-Uri</span> <span class="string">&quot;https://&lt;your-app-name&gt;.scm.azurewebsites.net/api/triggeredwebjobs/&lt;your-job-name&gt;&quot;</span> `</span><br><span class="line">    <span class="literal">-Method</span> Delete `</span><br><span class="line">    <span class="literal">-Headers</span> <span class="selector-tag">@</span>&#123; Authorization = <span class="string">&quot;Basic &lt;credentials&gt;&quot;</span> &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># WebJob を再デプロイ（任意のタイミングで実行可能、即実行されない）</span></span><br><span class="line"><span class="built_in">Invoke-RestMethod</span> <span class="literal">-Uri</span> <span class="string">&quot;https://&lt;your-app-name&gt;.scm.azurewebsites.net/api/triggeredwebjobs/&lt;your-job-name&gt;&quot;</span> `</span><br><span class="line">    <span class="literal">-Method</span> Put `</span><br><span class="line">    <span class="literal">-Headers</span> <span class="selector-tag">@</span>&#123;</span><br><span class="line">        Authorization = <span class="string">&quot;Basic &lt;credentials&gt;&quot;</span></span><br><span class="line">        <span class="string">&quot;Content-Disposition&quot;</span> = <span class="string">&quot;attachment; filename=&lt;your-job-name&gt;.zip&quot;</span></span><br><span class="line">    &#125; `</span><br><span class="line">    <span class="literal">-InFile</span> <span class="string">&quot;&lt;your-job-name&gt;.zip&quot;</span> `</span><br><span class="line">    <span class="literal">-ContentType</span> <span class="string">&quot;application/zip&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>: 実行履歴も削除されるため、履歴を保持したい場合は事前に <a href="https://github.com/projectkudu/kudu/wiki/WebJobs-API">Kudu の History API</a>（<code>GET /api/triggeredwebjobs/&lt;name&gt;/history</code>）でバックアップしてください。</p></blockquote><h3 id="方法-2-WEBJOBS-STOPPED-アプリケーション設定を使用する"><a href="#方法-2-WEBJOBS-STOPPED-アプリケーション設定を使用する" class="headerlink" title="方法 2: WEBJOBS_STOPPED アプリケーション設定を使用する"></a>方法 2: <code>WEBJOBS_STOPPED</code> アプリケーション設定を使用する</h3><p>デプロイ前にすべての WebJob を停止し、デプロイ完了後に解除します。</p><ol><li>Azure ポータルまたは Azure CLI でアプリケーション設定 <code>WEBJOBS_STOPPED</code> を <code>1</code> に設定</li><li>WebJob をデプロイ</li><li>デプロイ完了後、<code>WEBJOBS_STOPPED</code> を削除（または <code>0</code> に設定）</li></ol><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># デプロイ前: WebJob を停止</span></span><br><span class="line">az webapp config appsettings <span class="built_in">set</span> <span class="literal">--name</span> &lt;your<span class="literal">-app-name</span>&gt; <span class="literal">--resource-group</span> &lt;your<span class="literal">-resource-group</span>&gt; <span class="literal">--settings</span> WEBJOBS_STOPPED=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># デプロイ実行（zip deploy 等）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># デプロイ後: WebJob を再開</span></span><br><span class="line">az webapp config appsettings delete <span class="literal">--name</span> &lt;your<span class="literal">-app-name</span>&gt; <span class="literal">--resource-group</span> &lt;your<span class="literal">-resource-group</span>&gt; <span class="literal">--setting-names</span> WEBJOBS_STOPPED</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>: <code>WEBJOBS_STOPPED</code> は App 上のすべての WebJob に影響します。</p></blockquote><h3 id="方法-3-デプロイタイミングを調整する"><a href="#方法-3-デプロイタイミングを調整する" class="headerlink" title="方法 3: デプロイタイミングを調整する"></a>方法 3: デプロイタイミングを調整する</h3><p>スケジュール時刻から <strong>10 分以上経過してから</strong> デプロイすることで、グレース期間を回避できます。</p><ul><li>例: Cron 式が <code>0 0,30 * * * *</code> の場合、xx:10〜xx:20 または xx:40〜xx:50 の間にデプロイする</li></ul><p>ただし、CI&#x2F;CD パイプラインの実行タイミングを正確に制御することが難しい場合もあるため、方法 1 または方法 2 を推奨します。</p><h2 id="参考情報"><a href="#参考情報" class="headerlink" title="参考情報"></a>参考情報</h2><ul><li><p><a href="https://learn.microsoft.com/ja-jp/azure/app-service/webjobs-create">Azure App Service で WebJob を使用してバックグラウンド タスクを実行する - Microsoft Learn</a></p></li><li><p><a href="https://learn.microsoft.com/ja-jp/azure/app-service/webjobs-sdk-how-to">Azure WebJobs SDK の使用方法 - Microsoft Learn</a></p></li><li><p><a href="https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Jobs/Schedule.cs">Kudu - Schedule.cs（GetNextInterval メソッド）</a></p></li><li><p><a href="https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Jobs/TriggeredJobsScheduler.cs">Kudu - TriggeredJobsScheduler.cs</a></p></li><li><p><a href="https://github.com/projectkudu/kudu/blob/master/Kudu.Core/Jobs/JobsManagerBase.cs#L245">Kudu - JobsManagerBase.cs（DeleteJob メソッド）</a></p></li></ul>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2026/04/01/notes-on-webjobs-delete-and-deploy.html</id>
    <link href="https://azure.github.io/jpazpaas/2026/04/01/notes-on-webjobs-delete-and-deploy.html"/>
    <published>2026-03-31T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>お世話になっております。Azure App Service サポート担当の押田です。<br>本記事は、Azure App Service の <strong>Triggered WebJob</strong> において、デプロイ直後に WebJob が意図せず即実行されるケ]]>
    </summary>
    <title>Azure App Service Triggered WebJob がデプロイ直後に即実行される場合がある — 10 分間のグレース期間について</title>
    <updated>2026-04-08T05:14:28.291Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="App Service" scheme="https://azure.github.io/jpazpaas/tags/App-Service/"/>
    <category term="Web Apps" scheme="https://azure.github.io/jpazpaas/tags/Web-Apps/"/>
    <content>
      <![CDATA[<p>お世話になっております。Azure App Service サポート担当の押田です。<br>本記事では、App Service &#x2F; Azure Functions の Windows 環境において、 <code>Node.js 24</code> を利用する際の注意点を記載します。<br>結論から先にお伝えしますと、<strong>プラットフォームの設定</strong> にて <code>64bit</code> プロセスの有効化をしていただく必要がございます。</p><h1 id="Windows-環境で-Node-js-24-を利用する方法"><a href="#Windows-環境で-Node-js-24-を利用する方法" class="headerlink" title="Windows 環境で Node.js 24 を利用する方法"></a>Windows 環境で <code>Node.js 24</code> を利用する方法</h1><p>App Service &#x2F; Azure Functions の Windows 環境においては、Azure ポータルから <code>Node.js 24</code> が選択可能な状態となっています。</p><p><img src="/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process/image-d6ac67a5-c68b-4528-afb7-bc663ce85014.png" alt="image-d6ac67a5-c68b-4528-afb7-bc663ce85014.png"></p><p>ここで選択した Node.js バージョンは、App Settings <code>WEBSITE_NODE_DEFAULT_VERSION</code> に <code>~24</code> を指定する動作となります。<br>App Service では <code>WEBSITE_NODE_DEFAULT_VERSION</code> に指定された値に応じて、プラットフォーム側があらかじめ配置したバイナリに対してパスが通るような仕組みとなっています。<br>ただし、32 bit プロセス用(<code>C:\Program Files (x86)\nodejs</code> 配下) には 24 系のバイナリファイルが用意されていません。24 系のバイナリは 64 bit プロセス用(<code>C:\Program Files\nodejs</code> 配下) のみに提供されているものとなります。</p><h2 id="64-bit-プロセスを有効にする"><a href="#64-bit-プロセスを有効にする" class="headerlink" title="64 bit プロセスを有効にする"></a>64 bit プロセスを有効にする</h2><h3 id="ポータルから操作する"><a href="#ポータルから操作する" class="headerlink" title="ポータルから操作する"></a>ポータルから操作する</h3><p>App Service &#x2F; Azure Functions いずれもポータルでは [構成] メニューから変更可能です。</p><p><img src="/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process/image-113ac236-99be-41fa-94ae-9be9478b0e67.png" alt="image-113ac236-99be-41fa-94ae-9be9478b0e67.png"></p><h3 id="Az-CLI-から操作する"><a href="#Az-CLI-から操作する" class="headerlink" title="Az CLI から操作する"></a>Az CLI から操作する</h3><p><a href="https://learn.microsoft.com/ja-jp/cli/azure/webapp/config?view=azure-cli-latest#az-webapp-config-set"><code>az webapp config set</code></a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">az webapp config <span class="built_in">set</span> \</span><br><span class="line">  --resource-group &lt;RG名&gt; \</span><br><span class="line">  --name &lt;WebApp名&gt; \</span><br><span class="line">  --use-32bit-worker-process <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>あるいは <a href="https://learn.microsoft.com/ja-jp/cli/azure/functionapp/config?view=azure-cli-latest#az-functionapp-config-set"><code>az functionapp config set</code></a> を利用します。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">az functionapp config <span class="built_in">set</span> \</span><br><span class="line">  --resource-group &lt;RG名&gt; \</span><br><span class="line">  --name &lt;WebApp名&gt; \</span><br><span class="line">  --use-32bit-worker-process <span class="literal">false</span></span><br></pre></td></tr></table></figure><h2 id="Node-24-が利用されていることを確認する"><a href="#Node-24-が利用されていることを確認する" class="headerlink" title="Node 24 が利用されていることを確認する"></a>Node 24 が利用されていることを確認する</h2><p>Kudu Process Explorer から node プロセスの情報を確認することができます。</p><p><img src="/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process/image-ad6881ba-231f-4969-ac15-9dea34bb221a.png" alt="image-ad6881ba-231f-4969-ac15-9dea34bb221a.png"></p><h2 id="32-bit-プロセスを指定した場合のエラー例"><a href="#32-bit-プロセスを指定した場合のエラー例" class="headerlink" title="32 bit プロセスを指定した場合のエラー例"></a>32 bit プロセスを指定した場合のエラー例</h2><h3 id="App-Service-の場合"><a href="#App-Service-の場合" class="headerlink" title="App Service の場合"></a>App Service の場合</h3><p>IIS Node で実行する Node プロセスが見つからないため、500 エラーとなります。<br>下記ドキュメント [node アプリケーションが起動しない] シナリオに該当します。</p><ul><li><a href="https://learn.microsoft.com/ja-jp/troubleshoot/azure/app-service/app-service-web-nodejs-best-practices-troubleshoot-guide#iisnode-http-status-and-substatus">Node.js のベスト プラクティスとトラブルシューティング ガイド - Azure</a></li><li><a href="https://azureossd.github.io/2022/06/24/Avoiding-hardcoding-Node-versions-on-App-Service-Windows/">Avoiding hardcoding Node versions on App Service Windows</a></li></ul><h3 id="Azure-Functions-の場合"><a href="#Azure-Functions-の場合" class="headerlink" title="Azure Functions の場合"></a>Azure Functions の場合</h3><p>Node Language Worker プロセスを起動できないため、Functions Host が正常起動しません。</p><p>[概要] に下記のように表示されます。</p><p><img src="/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process/image-ac42b9df-47ed-44b6-b146-8dd4c3acf5aa.png" alt="image-ac42b9df-47ed-44b6-b146-8dd4c3acf5aa.png"></p><p>また、<code>exceptions</code> テーブルには、<code>RecordAndThrowExternalStartupException</code> として、<code>node exited with code 1 (0x1)</code> といった情報が確認できます。</p><p><img src="/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process/image-23cd3aef-a60e-48fa-aef4-5594aa08bf47.png" alt="image-23cd3aef-a60e-48fa-aef4-5594aa08bf47.png"></p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><ul><li><a href="https://learn.microsoft.com/ja-jp/azure/app-service/language-support-policy?tabs=windows">言語ランタイム サポート ポリシー - Azure App Service</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/app-service/configure-language-nodejs?pivots=platform-windows#set-the-nodejs-version">Node.js Apps の構成 - Azure App Service</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/app-service/configure-common?tabs=portal#configure-general-settings">App Service アプリを構成する - Azure App Service</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-reference-node?tabs=javascript,windows,azure-cli&pivots=nodejs-model-v4#supported-versions">Azure Functions 用 Node.js 開発者向けリファレンス</a></li><li><a href="/blog/Runtime_Support/node_support/">app-service-linux-docs&#x2F;Runtime_Support&#x2F;node_support.md at master · Azure&#x2F;app-service-linux-docs</a></li><li><a href="https://nodejs.org/ja/about/previous-releases">Node.js — Node.js リリース</a></li><li><a href="https://nodejs.org/en/blog/migrations/v22-to-v24">Node.js — Node.js v22 to v24</a></li></ul><br><br>2026 年 03 月 03 日時点の内容となります。<br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。<br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process.html</id>
    <link href="https://azure.github.io/jpazpaas/2026/03/03/AppService-Node24-on-windows-needs-64bit-process.html"/>
    <published>2026-03-02T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>お世話になっております。Azure App Service サポート担当の押田です。<br>本記事では、App Service &#x2F; Azure Functions の Windows 環境において、 <code>Node.js 24</code> を利用する際の注]]>
    </summary>
    <title>App Service / Azure Functions の Windows 環境において `Node.js 24` を利用する場合は 64 bit process の有効化を行ってください。</title>
    <updated>2026-04-08T05:14:28.287Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Azure Communication Services" scheme="https://azure.github.io/jpazpaas/tags/Azure-Communication-Services/"/>
    <category term="Email" scheme="https://azure.github.io/jpazpaas/tags/Email/"/>
    <content>
      <![CDATA[<p>お世話になっております。Azure Communication Services サポート担当の押田です。</p><p>Azure Communication Services で Email を送信には規定でクォータが設けられております。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email">Azure Communication Services のサービス制限 - An Azure Communication Services article</a></p><blockquote><p>送信できる電子メール メッセージの数には制限があります。 サブスクリプションに応じた<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#rate-limits-for-email">メールのレート制限</a>を超えた場合、要求が拒否されます。 再試行までの時間が経過した後に、これらの要求をもう一度試すことができるようになります。 必要に応じて、送信ボリュームの制限を引き上げるリクエストを行って、制限に達する前に対処してください。</p></blockquote><p>クォータの緩和はサポートリクエストを起票いただき申請いただく必要がございます。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-quota-increase">メール ドメインのクォータの引き上げ - An Azure Communication Services concept document</a></p><p>クォータの引き上げは申請いただいた内容ならびに、当該リソースの状況に応じて審査されます。</p><p><a href="https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html#%E9%80%81%E4%BF%A1%E6%95%B0%E3%81%AE%E5%88%B6%E9%99%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Azure Communication Services メール機能でよく頂くご質問 - Japan PaaS Support Team Blog</a> にて、クォータ引き上げに関する FAQ を記載させていただいております。</p><p>この記事ではクォータの引き上げの際に弊社よりお伺いする情報や、申請が却下される要因について補足します。<br>なお、具体的な審査内容は公開されておりません。この記事で記載する項目がすべてではございませんことご了承くださいませ。</p><blockquote><p>メール クォータの引き上げ要求は自動的に承認されません。 レビュー チームは、承認の状態を決定するときに、送信者の全体的な評判を考慮します。 送信者の評判には、メール配信の失敗率、ドメインの評判、スパムや不正使用のレポートなどの要因が含まれます。</p></blockquote><h1 id="クォータ緩和審査の対策"><a href="#クォータ緩和審査の対策" class="headerlink" title="クォータ緩和審査の対策"></a>クォータ緩和審査の対策</h1><h2 id="ドメインの信頼性の維持"><a href="#ドメインの信頼性の維持" class="headerlink" title="ドメインの信頼性の維持"></a>ドメインの信頼性の維持</h2><h3 id="カスタムドメインの管理"><a href="#カスタムドメインの管理" class="headerlink" title="カスタムドメインの管理"></a>カスタムドメインの管理</h3><p>クォータの緩和対象はカスタムドメインのみとなります。申請にあったってはカスタムドメインを構成ください。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-custom-verified-domains?pivots=platform-azp">カスタム検証済みメール ドメインを追加する - An Azure Communication Services article</a></p><ul><li><a href="https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html">Azure Communication Services メール機能でよく頂くご質問 - Japan PaaS Support Team Blog</a> <blockquote><ul><li>送信数の制限は引き上げられますか？</li></ul></blockquote></li></ul><h3 id="カスタムドメインがブラックリストへの登録されていないこと"><a href="#カスタムドメインがブラックリストへの登録されていないこと" class="headerlink" title="カスタムドメインがブラックリストへの登録されていないこと"></a>カスタムドメインがブラックリストへの登録されていないこと</h3><p>メール送信に用いるドメインが、RBLに登録されていないことが求められます。<br>下記は外部サービスとなりますが、指定したドメインがブラックリスト登録されているかどうかを確認できるサイトとなります。</p><p><a href="https://multirbl.valli.org/lookup/0410mail1.t-oshida.org.html">MultiRBL.valli.org - Results of the query 0410mail1.t-oshida.org</a></p><p>もし、いずれかのリストにお客様の指定したドメインが登録されている場合、当該のリストを管理されているベンダーにお問い合わせいただき、解除の対応を進めていただく必要がございます。</p><p>以下の例では <code>0410mail1.t-oshida.org</code> はいずれのブラックリストにも登録されていないことが確認できます。</p><p><img src="/jpazpaas/2026/01/27/ACS-Email-quota-increase/image-c4655fff-b877-49b2-ba98-b2e8c942946f.png" alt="image-c4655fff-b877-49b2-ba98-b2e8c942946f.png"></p><h3 id="MX-レコードの登録"><a href="#MX-レコードの登録" class="headerlink" title="MX レコードの登録"></a>MX レコードの登録</h3><p>MX レコードを登録することで送信者ドメインの評判を向上に寄与します。</p><p>Azure Communication Serviceにおいて、カスタムドメイン利用時(<a href="https://azure.github.io/jpazpaas/2023/07/06/How-to-add-domain-to-Email-Communication-Service.html">メール通信サービスにドメインを追加する際の DNS 設定について - Japan PaaS Support Team Blog</a>)に MX レコードの登録は必須ではございませんが、<br>Azure Communication Service から送信されたメールを受信するサーバーによっては、受信時に MX レコードの有無を判定に用いられる場合がございますため、<br><code>&lt;お客様のカスタムドメイン&gt;</code> を管理するDNSにて、 <code>&lt;お客様のカスタムドメイン&gt;</code> 宛てのメールを振り分けるべき宛先をご確認、ご設定くださいませ。<br>なお、Azure Communication Service ならびに、Email Serviceについては、Email の送信を行うサービスとなり、Emailの受信機能はございません。<br>そのため、Azure Communication Serviceとして、 MX レコードに登録可能な正当なメールサーバーの IP や FQDN について提供できるものはございません。<br><code>&lt;お客様のカスタムドメイン&gt;</code> 宛てのメールをどのサーバーへ転送すべきかについては、お客様次第となるものとなり、弊社側から具体的なレコードをお出しするものではございません。</p><ul><li><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-quota-increase#3-configure-a-mail-exchange-record-for-your-custom-domain">メール ドメインのクォータの引き上げ - An Azure Communication Services concept document</a></p><blockquote><p>メール交換 (MX) レコードは、ドメイン名に代わって電子メール メッセージを受信する電子メール サーバーを指定します。 MX レコードは、ドメイン ネーム システム (DNS) のリソース レコードです。 基本的に、MX レコードは、ドメインが電子メールを受信できることを示します。</p><p>Azure Communication Service では送信メールのみがサポートされますが、送信者ドメインの評判を向上させるために MX レコードを設定することをお勧めします。 MX レコードがないカスタム ドメインからのメールは、受信者の電子メール サービス プロバイダーによってスパムとしてラベル付けされる可能性があります。 これにより、ドメインの評判が低下する可能性があります。</p></blockquote></li></ul><h3 id="DMARC-レコードの登録"><a href="#DMARC-レコードの登録" class="headerlink" title="DMARC レコードの登録"></a>DMARC レコードの登録</h3><p>MX レコードと同様にカスタムドメイン利用時に DMARC レコードは必須ではございませんが、DMARC レコードを設定いただくことで送信者ドメインの評判を向上に寄与します。</p><ul><li><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-authentication-best-practice#implementing-dmarc">送信者認証のサポートに関するベスト プラクティス - An Azure Communication Services article</a></p></li><li><p><a href="https://learn.microsoft.com/ja-jp/defender-office-365/email-authentication-dmarc-configure?preserve-view=true&view=o365-worldwide#syntax-for-dmarc-txt-records">DMARC を使用してメールを検証する、セットアップ手順 - Microsoft Defender for Office 365</a></p></li></ul><h2 id="送信成功率の維持"><a href="#送信成功率の維持" class="headerlink" title="送信成功率の維持"></a>送信成功率の維持</h2><p>メールの失敗率は 1% 未満であることが求められます。<br>検証目的であったとしても、当該のドメインからの失敗率が高い場合、申請は却下される可能性が高くございます。</p><ul><li><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/sender-reputation-managed-suppression-list#managing-sender-reputation-and-email-complaints-to-enhance-email-delivery">Azure Communication Services 電子メールの送信者の評判を理解する - An Azure Communication Services article</a></p><blockquote><p><strong>送信者の評判と電子メールの苦情を管理してメール配信を強化する</strong></p><p>Azure Communication Services には、顧客の通信を強化できる電子メール機能が用意されています。 ただし、プラットフォーム経由で送信したメールが顧客の受信トレイに届く保証はありません。 配信の問題を事前に特定して回避するには、次のような評判チェックを実行する必要があります。</p><ul><li>正常に配信された電子メールの一貫性と正常な割合を一定期間にわたって確保します。</li><li>電子メール配信の失敗とバウンスに関する特定の詳細の分析。</li><li>スパムおよび不正使用レポートの監視。</li><li>正常な連絡先リストを維持する。</li><li>ユーザーエンゲージメントとメールボックス配置の理解。</li><li>顧客の苦情を理解し、オプトアウトまたは登録解除のための簡単なプロセスを提供します。</li></ul></blockquote></li><li><p><a href="https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html">Azure Communication Services メール機能でよく頂くご質問 - Japan PaaS Support Team Blog</a> </p><blockquote><ul><li>送信数のクォータ引き上げ審査でメール送信失敗率は加味されますか？</li><li>失敗率の監視はどこからできますか？</li></ul></blockquote></li></ul><h2 id="段階的な緩和について"><a href="#段階的な緩和について" class="headerlink" title="段階的な緩和について"></a>段階的な緩和について</h2><p>カスタムドメインに対するデフォルトのレート制限は、30件&#x2F;min、100件&#x2F;hour となります。<br>具体的な値をお伝えすることができず恐縮ではございますが、制限の緩和は送信実績に基づき段階的に実施させていただいております。<br>そのため、現在の制限を大幅に上回るような申請をいただいてもご希望に沿える可能性は低くございます。<br>目安として、現在の制限に抵触する状態が続くようであればその倍の容量をご申請いただければと存じます。</p><ul><li><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email-advanced/throw-exception-when-tier-limit-reached?pivots=programming-language-javascript">メール送信層の制限に達したときに例外をスローする - An Azure Communication Services article</a></p></li><li><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email">Azure Communication Services のサービス制限 - An Azure Communication Services article</a></p><blockquote><p>メールの配信状態を注意深く監視しながら、2 週間から 4 週間かけて、Azure Communication Services Email を使用するメールの量を少しずつ増やすことをお勧めします。 このように段階的に増やすと、サード パーティのメール サービス プロバイダーはドメインのメール トラフィック用の IP の変更に適応できます。 少しずつ変更すると、送信者評価を保護し、メール配信の信頼性を維持する時間が得られます。</p></blockquote></li></ul><p>一方でシステム要件として予定されている送信数があらかじめ定まっている場合なども多かろうと存じます。<br>そのような場合、ビジネスインパクトやスケジュール等の詳細をお伺いさせていただき、可能な範囲で調整させていただくこともございます。一度サポートまでご相談くださいませ。</p><h2 id="弊社からのヒアリング事項"><a href="#弊社からのヒアリング事項" class="headerlink" title="弊社からのヒアリング事項"></a>弊社からのヒアリング事項</h2><p>ドキュメントに沿ってサポートリクエスト起票時に記入くださいませ。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-quota-increase">メール ドメインのクォータの引き上げ - An Azure Communication Services concept document</a></p><p>日本語で記載いただいてもかまいません。<br>未記載の項目がございますと、審査プロセスを進めるまでに時間がかかってしまうことになります。ご注意くださいませ。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">1.送信を利用するお客様の会社名 (英語表記) :</span><br><span class="line">2.送信を利用するお客様の会社のウェブサイト URL :</span><br><span class="line">3.送信を利用するお客様の会社の事業内容について簡潔にご説明ください :</span><br><span class="line"></span><br><span class="line">4.該当の Azure Communication Services リソースでは、既にカスタムドメインを構成し、カスタムドメインからメールを送信できている状態でしょうか :</span><br><span class="line">5.メール送信に利用されているカスタムドメイン名 :</span><br><span class="line">6.Azure Communication Services リソース名および Email Services リソース名</span><br><span class="line">・Azure Communication Servicesリソース名 :</span><br><span class="line">・Email Services リソース名:</span><br><span class="line">7.サブスクリプション ID :</span><br><span class="line">8.テナント名 :</span><br><span class="line">9.テナント ID :</span><br><span class="line"></span><br><span class="line">10.本メール機能をどのような目的でご利用されるか (お客様との取引、売買 (ショッピング等)、宣伝等) :</span><br><span class="line">11.ご希望の上限:</span><br><span class="line"> - 件/1分</span><br><span class="line"> - 件/1時間</span><br><span class="line"> - 件/1日</span><br><span class="line">12.送信先のメールアドレスはどのような方法で取得しましたか :</span><br><span class="line">13.送信先となるユーザーが配信解除を希望、もしくは送信不達となった場合、対象ユーザーをどのように送信先から除外するか :</span><br><span class="line">14.現在該当のドメインにてどのようなプラットフォームをメール送信時に使用されているか教えてください。：例: オンプレミス、Amazon SES 等</span><br></pre></td></tr></table></figure><h1 id="クォータ緩和後のガイドライン"><a href="#クォータ緩和後のガイドライン" class="headerlink" title="クォータ緩和後のガイドライン"></a>クォータ緩和後のガイドライン</h1><p>メール送信量を増やしていく際のガイドラインとなります。ご参考にしてくださいませ。</p><ul><li><p>MXレコードが未設定の場合、MX レコードの追加を実施くださいませ。</p></li><li><p>低い失敗率と良好なNDR（配信不能通知）は、高いメールクォータを維持するために重要です。以下の2つの重要なガイダンスに従っていることを確認してください。<br><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email">Azure Communication Services のサービス制限 - An Azure Communication Services article</a></p><ul><li><ol><li>移行アプローチ<blockquote><p>メールの配信状態を注意深く監視しながら、2 週間から 4 週間かけて、Azure Communication Services Email を使用するメールの量を少しずつ増やすことをお勧めします。 このように段階的に増やすと、サード パーティのメール サービス プロバイダーはドメインのメール トラフィック用の IP の変更に適応できます。 少しずつ変更すると、送信者評価を保護し、メール配信の信頼性を維持する時間が得られます。</p></blockquote></li></ol></li><li><ol start="2"><li>失敗率の管理<blockquote><p>失敗率の要件</p><p>高いメール クォータを有効にするには、メールの失敗率が 1% 未満である必要があります。 失敗率が高い場合は、クォータの引き上げを要求する前に問題を解決する必要があります。 お客様は、失敗率を積極的に監視する必要があります。</p><p>クォータの引き上げ後に失敗率が上がった場合、Azure Communication Services はお客様に連絡して、直ちに対処することを求め、解決のタイムラインを確認します。 極端なケースでは、指定されたタイムライン内で失敗率が管理されない場合、Azure Communication Services は、問題が解決されるまでサービスを減らしたり中断したりする可能性があります。</p></blockquote></li></ol></li></ul></li></ul><p>下記のドキュメント群もご参考にしていただけますと幸いです。</p><ul><li><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/sender-reputation-managed-suppression-list">Azure Communication Services 電子メールの送信者の評判を理解する - An Azure Communication Services article</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/analytics/insights/email-insights">メールの分析情報 - An Azure Communication Services article</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/analytics/enable-logging">Azure Monitor でログ記録を有効にする - An Azure Communication Services article</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/handle-email-events">メールイベントを処理する - Azure Communication Services</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/event-grid/communication-services-email-events">Azure Communication Services - Email イベント - Azure Event Grid</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/manage-suppression-list-management-sdks?pivots=programming-language-javascript">Management SDK を使用してドメイン抑制リストを管理する - An Azure Communication Services article</a></li><li><a href="https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html">Azure Communication Services メール機能でよく頂くご質問 - Japan PaaS Support Team Blog</a></li></ul>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2026/01/27/ACS-Email-quota-increase.html</id>
    <link href="https://azure.github.io/jpazpaas/2026/01/27/ACS-Email-quota-increase.html"/>
    <published>2026-01-26T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>お世話になっております。Azure Communication Services サポート担当の押田です。</p>
<p>Azure Communication Services で Email を送信には規定でクォータが設けられております。</p>
<p><a href=]]>
    </summary>
    <title>Azure Communication Services Email クォータ緩和について</title>
    <updated>2026-04-08T05:14:28.283Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Storage" scheme="https://azure.github.io/jpazpaas/tags/Storage/"/>
    <content>
      <![CDATA[<p>Azure 仮想マシン上でブラウザを起動して Azure ポータルを表示しています。また、該当の Azure 仮想マシンが属している仮想ネットワークのサブネットに、今回操作対象のストレージアカウントの blob のプライベート エンドポイントはすでに作成済みです。</p><p>この環境で、Azure ポータルで対象のストレージアカウント内のコンテナー配下の BLOB の一覧を出したり、個別の BLOB のアップロードやダウンロード、個別の BLOB の画面まで行って削除はできるのですが、BLOB の一覧でチェックを入れて削除、などをすると以下のように失敗します。考えられることを教えてください。</p><p>例えば以下のようにコンテナー con1 の BLOB の一覧は見えています。あわせて、ダウンロードやアップロードもできました。</p><p><img src="/jpazpaas/2026/01/16/i-can-listblobs-but-i-cant-deleteblobs/image-64e7a0ef-ca22-4471-b3d8-b98e1b98263b.png" alt="image-64e7a0ef-ca22-4471-b3d8-b98e1b98263b.png"> </p><p>ただ、一覧からチェックを入れて削除しようとすると 403 エラー (This request is not authorized to perform this operation) となって削除に失敗しました。</p><p><img src="/jpazpaas/2026/01/16/i-can-listblobs-but-i-cant-deleteblobs/image-3b997c6f-19ba-422d-8348-83d5f89a7bc7.png" alt="image-3b997c6f-19ba-422d-8348-83d5f89a7bc7.png"></p><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><h2 id="概要と回避方法"><a href="#概要と回避方法" class="headerlink" title="概要と回避方法"></a>概要と回避方法</h2><p>可能性として考えられることは、該当のストレージアカウントにおいて、</p><ul><li>ストレージアカウントのファイアウォールの設定を入れて経路を絞っている</li><li>プライベート エンドポイント経由のアクセスのみが許可されている</li><li>階層型名前空間が有効になっている</li><li>プライベート エンドポイントについて、blob 向けのプライベート エンドポイントは作成したものの dfs 向けのプライベート エンドポイントは作成していない</li></ul><p>といった状況になっていることが疑われます。この場合の問題の解決方法としては、blob 向けのプライベート エンドポイントと同様に dfs 向けのプライベート エンドポイントも作ってください、ということになります。</p><h2 id="詳細"><a href="#詳細" class="headerlink" title="詳細"></a>詳細</h2><p>Azure Blob Storage において Azure ポータル上で BLOB の一覧を出したり、アップロードやダウンロードをするといった操作はブラウザを起動しているクライアントからストレージに対して REST API を呼び出してその操作の結果をブラウザーに反映しているという動作になります。</p><p>例えば、Azure ポータルで コンテナー内の BLOB の一覧を取得する場合、以下の ListBlobs という REST API を発行することになります。ListBlobs の場合、REST API を発行する FQDN は <strong>(storagename).blob.core.windows.net</strong> となります。</p><p><a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/list-blobs">BLOB の一覧表示 REST API - Azure Storage</a></p><p>そして、ストレージアカウントでファイアウォールの設定をしていて、プライベート エンドポイント経由からのアクセスの許可のみをしている場合、blob 向けのプライベート エンドポイントが存在し、そのプライベート エンドポイントがポータルを実行している Azure 仮想マシンからアクセス可能な場合、上記の ListBlobs は成功することになります。</p><p>その一方で、Azure ポータルで BLOB の一覧でチェックを入れて複数の BLOB をまとめて削除、という操作をすると、階層型名前空間が無効なストレージアカウントでは以下の Delete BLOB という REST APIを実行します。</p><p><a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/delete-blob">BLOB の削除 REST API - Azure Storage</a></p><p>上記の DeleteBlob という REST API も REST API を発行する FQDN は ListBlobs と同様、<strong>(storagename).blob.core.windows.net</strong> となります。この場合、ListBlobs の時と同様に、プライベート エンドポイントへのアクセスになるので、経路としては許可された経路になります。</p><p>ただ、階層型名前空間が有効な環境でAzure ポータルで BLOB の一覧でチェックを入れて複数の BLOB をまとめて削除、という操作をすると、REST API は上記の DeleteBlob とは異なり、Path - Delete の REST API を利用します。</p><p><a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/datalakestoragegen2/path/delete">Path - Delete</a></p><p>この Path - Delete という REST API の場合、REST API を発行する FQDN は <strong>(storagename).dfs.core.windows.net</strong> となります。ここでもし dfs 向けのプライベート エンドポイントを作成していないと、ポータルからは (storagename).dfs.core.windows.net のエンドポイントへのアクセスはパブリックの IP になり、許可していない経路となるため、403 応答を受け取ることになります。</p><p>以下、Azure ポータルで、一覧から BLOB を選択して削除しに行った時のブラウザートレースを取得した画面となりますが、(storagename).dfs.core.windows.net のエンドポイントに HTTP の DELETE を発行して 403 になったことが確認できます。</p><p><img src="/jpazpaas/2026/01/16/i-can-listblobs-but-i-cant-deleteblobs/image-35cea72b-9bc6-4340-a4f2-ccba35f179a9.png" alt="image-35cea72b-9bc6-4340-a4f2-ccba35f179a9.png"></p><p>このような挙動になるため、階層型名前空間が有効な場合、blob 向けのプライベート エンドポイントだけでなく、dfs 向けのプライベート エンドポイントも作成する必要がある、ということなります。この点は以下の資料にも記載がございます。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/storage/common/storage-private-endpoints">プライベート エンドポイントを使用する - Azure Storage</a></p><p>以下、上記資料よりの引用となります。</p><p><code>Data Lake Storage ストレージ リソース用にプライベート エンドポイントを作成する場合は、Blob Storage リソース用にも作成する必要があります。 これは、Data Lake Storage エンドポイントをターゲットとする操作が、BLOB エンドポイントにリダイレクトされる可能性があるためです。 同様に、Blob Storage 用のみにプライベート エンドポイントを追加し、Data Lake Storage 用に追加しない場合、API には DFS プライベート エンドポイントが必要であるため、一部の操作 (ACL の管理、ディレクトリの作成、ディレクトリの削除など) が失敗します。 両方のリソースにプライベート エンドポイントを作成して、すべての操作が正常に完了できるようにします。</code></p><p>なお、今回は一覧でチェックを入れての削除、というパターンを例に取りましたが、ACL の設定など階層型名前空間を利用しているとき特有の操作が失敗する、というような見え方もするシナリオとなります。</p><h1 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h1><p>コンテナー内の BLOB の一覧は出せるけれど削除ができない、というような見え方になるため、経路の問題というより、アクセスしているユーザーの権限、と考えがちな内容になります。ただ、階層型名前空間を利用しているストレージアカウントの場合においては、以下のことを気にしてみるとご自身でもトラブルシューティングができるかと思います。</p><ul><li>ストレージ アカウントのファイアウォールの設定でアクセスの経路を絞っているかどうか</li><li>Azure ポータルを使用している環境からストレージ アカウントへの経路は、プライベート エンドポイントを利用する環境になるか</li><li>プライベート エンドポイントを利用する環境の場合、blob、dfs 両方のプライベート エンドポイントを作成しているか</li><li>プライベート エンドポイントを利用している場合、ポータルを利用しているクライアントの環境から、blob、dfs 両方に対してプライベート エンドポイントの IP に名前解決できているか</li></ul><p>一部の操作が失敗、という挙動から権限周りの確認はしていただくものの、ストレージのファイアウォールまわりやプライベート エンドポイントの構成などを確認する、というところに視点が向かないということはそれなりに起こりうるシナリオかと思います。もちろんこのシナリオも一例に過ぎないので、似たような状況だけれどこのシナリオには完全に合致しない、ということもあるかとは思いますが、こういうシナリオもある、ということで参考になれば幸いです。</p><h1 id="参考資料"><a href="#参考資料" class="headerlink" title="参考資料"></a>参考資料</h1><p><a href="https://learn.microsoft.com/ja-jp/azure/storage/common/storage-network-security">Azure Storage のファイアウォール規則 | Microsoft Learn</a>  </p><p><a href="https://learn.microsoft.com/ja-jp/azure/storage/common/storage-private-endpoints">プライベート エンドポイントを使用する - Azure Storage | Microsoft Learn</a><br><br><br><br></p><hr><br><br><p>2026 年 01 月 16 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2026/01/16/i-can-listblobs-but-i-cant-deleteblobs.html</id>
    <link href="https://azure.github.io/jpazpaas/2026/01/16/i-can-listblobs-but-i-cant-deleteblobs.html"/>
    <published>2026-01-15T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Azure 仮想マシン上でブラウザを起動して Azure ポータルを表示しています。また、該当の Azure 仮想マシンが属している仮想ネットワークのサブネットに、今回操作対象のストレージアカウントの blob のプライベート エンドポイントはすでに作成済みです。</p>]]>
    </summary>
    <title>Azure ポータルで BLOB のリストやダウンロードはできるけれど削除ができないときに考えられること</title>
    <updated>2026-04-08T05:14:28.283Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="AI Search" scheme="https://azure.github.io/jpazpaas/tags/AI-Search/"/>
    <content>
      <![CDATA[<p>Blob ストレージをデータソースとする AI Search を利用して、インデクサーを実行した際に 「<code>Document key cannot be longer than 1024 characters</code>」というエラーが発生し、インデクサーの実行が失敗しました。</p><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><p>AI Search のインデックス内のドキュメントを一意に識別するドキュメントキーは、エラーにある通り、1,024文字を超えることはできません。<br>このドキュメントキーは一般的には、BLOBのパス（<code>metadata_storage_path</code>）を Base64 でエンコードすることで生成されます。<br>Blob の エンコードされたURLは、ファイル名に日本語等のマルチバイト文字列が含まれる場合、長さが大きくなり、1,024文字の制限に到達しやすくなります。</p><p>エラーの解消方法としては 3 つございます。</p><h3 id="1-fixedLengthEncode-関数-の利用"><a href="#1-fixedLengthEncode-関数-の利用" class="headerlink" title="1. fixedLengthEncode 関数 の利用"></a>1. fixedLengthEncode 関数 の利用</h3><p>ファイル名の長さによって、エラーになることを防ぐには、インデクサー定義内で <code>fixedLengthEncode</code> 関数を利用します。<br><code>fixedLengthEncode</code> 関数は、任意の長さの文字列を一意の固定長文字列に変換します。</p><p>この関数を使用すると、任意の長さの文字列が固定長文字列に変換されます。<br><a href="https://learn.microsoft.com/ja-jp/azure/search/search-indexer-field-mappings?tabs=rest#fixedlengthencode-function">インデクサーのフィールドをマッピングする - Azure AI Search | Microsoft Learn</a></p><p>例えばインデクサー定義を以下のようにします。  </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&quot;fieldMappings&quot; : [</span><br><span class="line"> &#123;</span><br><span class="line">  &quot;sourceFieldName&quot; : &quot;metadata_storage_path&quot;,</span><br><span class="line">  &quot;targetFieldName&quot; : &quot;your key field&quot;,</span><br><span class="line">   &quot;mappingFunction&quot; : &#123;</span><br><span class="line">    &quot;name&quot; : &quot;fixedLengthEncode&quot;</span><br><span class="line">   &#125;</span><br><span class="line"> &#125;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><br>一方で、テキストを分割し、チャンクごとにインデックスのドキュメントを作成する方法を利用されている場合などは、現時点では `fixedLengthEncode` 関数をサポートしておりません。<p>そのため、 <code>fixedLengthEncode</code> 関数を利用できない場合や、インデクサーの編集が困難な場合には、以下の方法にてエラーを解消することも可能です。</p><h3 id="2-ファイル名を短い名前に変更する"><a href="#2-ファイル名を短い名前に変更する" class="headerlink" title="2.ファイル名を短い名前に変更する"></a>2.ファイル名を短い名前に変更する</h3><p>2.1. 対象のファイルを特定します。インデクサーの実行履歴の画面を確認します。以下の画像のように、「<code>Target field &#39;chunk_id&#39; is...</code>」にカーソルを合わせると、エラーの原因となっているファイルを確認することができます。<br/><br><img src="/jpazpaas/2025/12/22/How-to-resolve-the-document-key-character-limit-error/image-4236d7ec-8c2d-42f3-90ce-4f30750e3312.png" alt="image-4236d7ec-8c2d-42f3-90ce-4f30750e3312.png"><br>2.2. Blobのファイル名自体は変更できないため、一度ファイルをダウンロードし、名前変更の上アップロードし、前のファイルは削除します。</p><h3 id="3-インデクサーが対象の-BLOB-をスキップするように設定する"><a href="#3-インデクサーが対象の-BLOB-をスキップするように設定する" class="headerlink" title="3.インデクサーが対象の BLOB をスキップするように設定する"></a>3.インデクサーが対象の BLOB をスキップするように設定する</h3><p>ファイル名変更が難しい場合は、該当Blobのメタデータに、キー : <code>AzureSearch_Skip</code>、値 : <code>true</code> を設定いただき、インデクサーが該当Blobを処理しないようにスキップさせます。<br/><br><img src="/jpazpaas/2025/12/22/How-to-resolve-the-document-key-character-limit-error/image-ff0cd6ea-7a08-4283-a2eb-5257e800b4ff.png" alt="image-ff0cd6ea-7a08-4283-a2eb-5257e800b4ff.png"></p><p>AzureSearch_Skipについては以下のドキュメントに記載がございます。</p><p> <strong>抜粋</strong></p><blockquote><p><code>&quot;AzureSearch_Skip&quot; : &quot;true&quot;</code></p></blockquote><blockquote><p>BLOB を完全にスキップするように BLOB インデクサーに指示します。 <br>メタデータとコンテンツのどちらの抽出も行われません。 <br>特定の BLOB で何度もエラーが発生し、インデックス作成プロセスが中断されるときに利用できます。</p></blockquote><p><a href="https://learn.microsoft.com/ja-jp/azure/search/search-how-to-index-azure-blob-storage#determine-which-blobs-to-index">Azure BLOB インデクサー - Azure AI Search</a></p><h1 id="参考資料"><a href="#参考資料" class="headerlink" title="参考資料"></a>参考資料</h1><ul><li><a href="https://learn.microsoft.com/ja-jp/azure/search/cognitive-search-common-errors-warnings#error-could-not-parse-document">インデクサーのエラーと警告 - Azure AI Search</a></li></ul><br><br><hr><br><br><p>2025 年 12 月 22 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/12/22/How-to-resolve-the-document-key-character-limit-error.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/12/22/How-to-resolve-the-document-key-character-limit-error.html"/>
    <published>2025-12-21T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>Blob ストレージをデータソースとする AI Search を利用して、インデクサーを実行した際に 「<code>Document key cannot be longer than 1024 characters</code>」というエラーが発生し、インデクサーの実行が]]>
    </summary>
    <title>ドキュメントキー文字数制限エラーの解消法</title>
    <updated>2026-04-08T05:14:28.282Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="ACS" scheme="https://azure.github.io/jpazpaas/tags/ACS/"/>
    <category term="SMTP" scheme="https://azure.github.io/jpazpaas/tags/SMTP/"/>
    <category term="Email" scheme="https://azure.github.io/jpazpaas/tags/Email/"/>
    <content>
      <![CDATA[<p>こんにちは。Azure Communication Services (以下 ACS) のサポートチームです。</p><p><a href="https://techcommunity.microsoft.com/blog/exchange/exchange-online-to-retire-basic-auth-for-client-submission-smtp-auth/4114750">Exchange Online SMTP 基本認証廃止 </a> 等をきっかけに、ACS メール機能のご利用をご検討くださり、ありがとうございます。本記事では、ACS のメール機能をご利用いただく方に向けて、よく頂くご質問をおまとめしております。本情報がご参考になりましたら幸いでございます。</p><h2 id="ACS-メール機能では-SMTP-AUTH-基本認証はサポートされていますか？"><a href="#ACS-メール機能では-SMTP-AUTH-基本認証はサポートされていますか？" class="headerlink" title="ACS メール機能では SMTP AUTH 基本認証はサポートされていますか？"></a>ACS メール機能では SMTP AUTH 基本認証はサポートされていますか？</h2><p>SMTP AUTH 基本認証はサポートされております。</p><p>基本認証を利用してメール送信する際のセットアップは<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email-smtp/smtp-authentication?tabs=built-in-role">簡易メール転送プロトコル (SMTP) 認証の資格情報を作成する</a> をご確認ください。</p><h2 id="先端認証は利用できますか？"><a href="#先端認証は利用できますか？" class="headerlink" title="先端認証は利用できますか？"></a>先端認証は利用できますか？</h2><p>はい、ACS メール機能では先端認証もサポートされています。</p><p>先端認証として、XOauth2 を利用したメール送信の<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/send-email-smtp/send-email-smtp-oauth">チュートリアル</a>をご覧ください。</p><h1 id="送信元メールアドレスについて"><a href="#送信元メールアドレスについて" class="headerlink" title="送信元メールアドレスについて"></a>送信元メールアドレスについて</h1><h2 id="送信元メールアドレスとして利用できるドメインはどのような種類がありますか？"><a href="#送信元メールアドレスとして利用できるドメインはどのような種類がありますか？" class="headerlink" title="送信元メールアドレスとして利用できるドメインはどのような種類がありますか？"></a>送信元メールアドレスとして利用できるドメインはどのような種類がありますか？</h2><p>ACS からメールを送信する際に利用できるドメイン種別にはマネージドドメインとカスタムドメインがあります。</p><p>マネージドドメインは、<code>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net</code> 形式でお客様に払い出される弊社管理のドメインとなります。<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-azure-managed-domains?pivots=platform-azp">マネージドドメイン追加のチュートリアル</a> にありますように、Azure ポータルから払い出すことができます。</p><p>マネージドドメインには、<code>donotreply@xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.azurecomm.net</code> から送信元メールアドレスを変更できない、１分間や１時間にメール送信できる数が極めて低く、引き上げることができないといった<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-azure-managed-domains?pivots=platform-azp#azure-managed-domains-compared-to-custom-domains">制限</a>があります。そのため、本番環境ではカスタムドメインが一般に利用されると考えております。</p><p>カスタムドメインは、お客様管理の任意のドメインです。カスタムドメインを ACS に追加し、同ドメインを ACS から送信するメールの送信元メールアドレスのドメインにすることができます。</p><p>カスタムドメインを ACS に追加するためには、ドメインの所有権を検証するための TXT レコード、SFP TXT レコード、DKIM CNAME レコードをそれぞれ同ドメインのレジストラーに設定していただく必要がございます。　手順は、<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-custom-verified-domains?pivots=platform-azp">カスタムドメインを ACS へ追加する手順</a>をご確認ください。</p><h2 id="onmicrosoft-com-は-ACS-の送信元ドメインとして使えますか？"><a href="#onmicrosoft-com-は-ACS-の送信元ドメインとして使えますか？" class="headerlink" title="onmicrosoft.com は ACS の送信元ドメインとして使えますか？"></a>onmicrosoft.com は ACS の送信元ドメインとして使えますか？</h2><p>onmicrosoft.com は ACS としてはカスタムドメインの扱いでございます。<br>onmicrosoft.com では、お客様にて DKIM CNAME レコードを追加できず、カスタムドメインとして ACS でご利用いただけません。</p><h2 id="送信元メールアドレスの-より前のユーザー名を-donotreply-以外にできますか？"><a href="#送信元メールアドレスの-より前のユーザー名を-donotreply-以外にできますか？" class="headerlink" title="送信元メールアドレスの @ より前のユーザー名を donotreply 以外にできますか？"></a>送信元メールアドレスの @ より前のユーザー名を donotreply 以外にできますか？</h2><p>マネージドドメインではできませんが、カスタムドメインでは donotreply 以外のユーザー名をご利用いただけます。</p><p>手順・<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/quickstarts/email/add-multiple-senders?pivots=platform-azp#create-multiple-sender-usernames">複数の送信者ユーザー名を作成する</a> を参考に、「Email Communication Services Domain」・「Mailfrom addresses」の「Add」ボタンから新しいユーザー名の送信元メールアドレスを作成してください。</p><p>なお、「Add」ボタンは既定の送信数の制限ではグレーアウトされて操作できないようになっております。<br>後述の「送信数の制限」クォータ引き上げのサポートリクエストをご発行ください。</p><h1 id="送信数の制限について"><a href="#送信数の制限について" class="headerlink" title="送信数の制限について"></a>送信数の制限について</h1><h2 id="送信数の制限はありますか？"><a href="#送信数の制限はありますか？" class="headerlink" title="送信数の制限はありますか？"></a>送信数の制限はありますか？</h2><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email">サービス制限</a> に記載しております通り、１分、１時間当たりに送信できるメール数に制限（クォータ）がございます。</p><h2 id="送信数の制限は引き上げられますか？"><a href="#送信数の制限は引き上げられますか？" class="headerlink" title="送信数の制限は引き上げられますか？"></a>送信数の制限は引き上げられますか？</h2><p>マネージドドメインは引き上げられませんが、カスタムドメインは引き上げられます。</p><h2 id="送信数の制限を引き上げるにはどうすればいいですか。"><a href="#送信数の制限を引き上げるにはどうすればいいですか。" class="headerlink" title="送信数の制限を引き上げるにはどうすればいいですか。"></a>送信数の制限を引き上げるにはどうすればいいですか。</h2><p>クォータ引き上げのためのサポートリクエストを ACS 宛にご発行ください。サポートリクエストには、<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/email/email-quota-increase#5-request-an-email-quota-increase">審査に必要な情報</a> を日本語で問題ございませんので記載ください。<br>審査の上、送信数の制限が引き上げられます。審査には３営業日ほどかかる場合もございますことご留意ください。</p><h2 id="大量のメールを送りたいのですが、どの程度の送信数を-ACS-はサポートできますか？"><a href="#大量のメールを送りたいのですが、どの程度の送信数を-ACS-はサポートできますか？" class="headerlink" title="大量のメールを送りたいのですが、どの程度の送信数を ACS はサポートできますか？"></a>大量のメールを送りたいのですが、どの程度の送信数を ACS はサポートできますか？</h2><p>以下<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#email">記載</a>ございます通り、1 時間あたり最大 100 万から 200 万メッセージのメール送信がサポートできます。</p><p>ただし、IP ウォームアップのために徐々に送信数の制限を引き上げていただく必要がございますので、ACS にてカスタムドメインからメール送信できるようになりましたら、お早めにクォータ引き上げのサポートリクエストをご発行いただくことをお勧めいたします。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">Azure Communication Services のメール サービスは、高スループットをサポートするように設計されています。</span><br><span class="line">ただし、このサービスには、お客様がオンボードを円滑に行い、新しいメール サービスに切り替えるときに発生する可能性のあるいくつかの問題を回避できるように、初期レート制限が設けられています。</span><br><span class="line"></span><br><span class="line">メールの配信状態を注意深く監視しながら、2 週間から 4 週間かけて、Azure Communication Services Email を使用するメールの量を少しずつ増やすことをお勧めします。</span><br><span class="line">このように段階的に増やすと、サード パーティのメール サービス プロバイダーはドメインのメール トラフィック用の IP の変更に適応できます。 </span><br><span class="line">少しずつ変更すると、送信者評価を保護し、メール配信の信頼性を維持する時間が得られます。</span><br><span class="line"></span><br><span class="line">Azure Communication Services のメール サービスでは、1 時間あたり最大 100 万から 200 万メッセージの大量のメッセージがサポートされます。</span><br></pre></td></tr></table></figure><h2 id="送信数のクォータ引き上げ審査でメール送信失敗率は加味されますか？"><a href="#送信数のクォータ引き上げ審査でメール送信失敗率は加味されますか？" class="headerlink" title="送信数のクォータ引き上げ審査でメール送信失敗率は加味されますか？"></a>送信数のクォータ引き上げ審査でメール送信失敗率は加味されますか？</h2><p>以下<a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/service-limits#failure-rate-requirements">記載</a>の通り加味されます。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">高いメール クォータを有効にするには、メールの失敗率が 1% 未満である必要があります。</span><br><span class="line">失敗率が高い場合は、クォータの引き上げを要求する前に問題を解決する必要があります。</span><br><span class="line">お客様は、失敗率を積極的に監視する必要があります。</span><br><span class="line">クォータの引き上げ後に失敗率が上がった場合、Azure Communication Services はお客様に連絡して、直ちに対処することを求め、解決のタイムラインを確認します。</span><br><span class="line">極端なケースでは、指定されたタイムライン内で失敗率が管理されない場合、Azure Communication Services は、問題が解決されるまでサービスを減らしたり中断したりする可能性があります。</span><br></pre></td></tr></table></figure><h2 id="失敗率の監視はどこからできますか？"><a href="#失敗率の監視はどこからできますか？" class="headerlink" title="失敗率の監視はどこからできますか？"></a>失敗率の監視はどこからできますか？</h2><p><a href="https://learn.microsoft.com/ja-jp/azure/communication-services/concepts/analytics/insights/email-insights#failure-rate">失敗率</a> に記載がございますように、Azure ポータルの「Communication Service」リソース、「分析情報」ブレード、「メールの概要」タブから何通のうち何件のメール配信が成功・失敗したのか確認いただけます。</p><p>お客様の監視要件に応じてテスト・カスタマイズが必要ではありますが、KQL のサンプルは以下になります。失敗率監視のご検討の参考になりましたら幸いです。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ACSEmailStatusUpdateOperational </span><br><span class="line">| where OperationName == &quot;DeliveryStatusUpdate&quot; and isnotempty(DeliveryStatus) and DeliveryStatus != &quot;OutForDelivery&quot;</span><br><span class="line">| summarize total=count(), failures=countif(DeliveryStatus != &quot;Delivered&quot; and DeliveryStatus != &quot;Suppressed&quot;)</span><br><span class="line">| extend rate=round(((failures * 100.0)/total),2)</span><br><span class="line">| extend label=&quot;Emails failed&quot;, TotalMessage=strcat(&#x27;out of &#x27;, total, &#x27;, &#x27;, rate,&#x27;% total Emails sent&#x27;)</span><br></pre></td></tr></table></figure><h1 id="ACS-でのメール受信について"><a href="#ACS-でのメール受信について" class="headerlink" title="ACS でのメール受信について"></a>ACS でのメール受信について</h1><h2 id="ACS-でメールを受け取ることはできますか？"><a href="#ACS-でメールを受け取ることはできますか？" class="headerlink" title="ACS でメールを受け取ることはできますか？"></a>ACS でメールを受け取ることはできますか？</h2><p>ACS にはメール受信機能が現状ございません。バウンスメールの受信等のために、お客様でメール受信サーバーを別途ご用意ください。</p><br><br><hr><br><br><p>2025 年 8 月 10 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/09/08/ACS-Email-Onboarding-FAQ.html"/>
    <published>2025-09-07T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>こんにちは。Azure Communication Services (以下 ACS) のサポートチームです。</p>
<p><a href="https://techcommunity.microsoft.com/blog/exchange/exchange-online]]>
    </summary>
    <title>Azure Communication Services メール機能でよく頂くご質問</title>
    <updated>2026-04-08T05:14:28.273Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="トリガー・バインディング シリーズ" scheme="https://azure.github.io/jpazpaas/tags/%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/"/>
    <content>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">Service Bus トリガー</a> は Service Bus からイベントを読み取り実行される関数です。</p><p>Service Bus トリガーは、<a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-queues-topics-subscriptions">Service Bus のキューとトピック</a> に対し、それぞれ Service Bus キュー トリガーと Service Bus トピック トリガーの 2 種類のトリガーを設定できます。メッセージに対して、単一処理を行うか（キュー）、複数処理を行うか（トピック）により、トリガーを使い分けてご利用ください。なお、キューとトピックの処理は混在させることができないので、それぞれ異なるトリガー（Service Bus キュー トリガーと Service Bus トピック トリガー）を作る必要があります。<br>Service Bus のメッセージに対して、<a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock">PeekLock</a>  と呼ばれるロックを取得し、ロック更新することで動作します（外部ストレージにどこまで読んだかなどのメモなどは保持しません）。PeekLock では、メッセージの Complete または Abandon を呼び出してメッセージの終わりを示します。</p><h2 id="ロックについて"><a href="#ロックについて" class="headerlink" title="ロックについて"></a>ロックについて</h2><p>PeekLock について、Service Bus のキューとサブスクリプションには既定の<a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/message-transfers-locks-settlement#renew-locks">ロック期間 1 分</a> があります。このロックを更新し、ロック状態を維持することを host.json の <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus?tabs=in-process,extensionv5,extensionv3&pivots=programming-language-csharp#hostjson-settings">maxAutoLockRenewalDuration</a> (規定 5 分) にて定義できます。既定では 1 分ごとに 4 回のロックが更新されます。メッセージのロックが解除され、再度メッセージが<br>取得されると、DeliveryCount (配信回数と呼ばれメッセージの読み取り回数上限で、既定では 10 が最大) がインクリメントされ、最大配信回数に至ると<a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-dead-letter-queues">配信不能キュー(Dead Letter Queue)</a>にメッセージが移動されます。</p><p>別のクライアントによるメッセージの処理を避けるために、Azure Functions にて実装しているアプリケーションの処理時間と同じ以上の長さ maxAutoLockRenewalDuration を設定しておく必要があります。</p><p>Service Bus キューの参考画面：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-a169cc6d-efc3-4434-b6a4-6985c8613529.png" alt="image-a169cc6d-efc3-4434-b6a4-6985c8613529.png"></p><p>PeekLock 時の Complete または Abandon は、<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#peeklock-behavior">オートコンプリート</a> と呼ばれる機能で Azure Functions が自動で行うことができます。関数の実行に応じて、Complete (実行完了としてメッセージの破棄) または Abandon が自動で呼び出されます。規定ではオートコンプリートは true となっていますが、false とした場合には、アプリケーション コード内でそれぞれのメッセージに対して明示的に <a href="https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.servicebus.messaging.queueclient.complete?view=azure-dotnet#Microsoft_ServiceBus_Messaging_QueueClient_Complete_System_Guid_">Complete</a>  または <a href="https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.servicebus.messaging.queueclient.abandon?view=azure-dotnet">Abandon</a>  を呼び出す必要があります。</p><h2 id="セッションについて"><a href="#セッションについて" class="headerlink" title="セッションについて"></a>セッションについて</h2><p>Service Bus では、<a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/message-sessions">セッション</a> と呼ばれる概念があります。各メッセージにセッション ID をメタデータとして保持できます。Service Bus トリガーでは、<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#attributes">IsSessionsEnabled 属性</a>を有効化することで、セッション機能を使用することができます。利用する Service Bus キューやサブスクリプションについても作成時にセッションを有効化しないとこの機能は使えないことをご留意ください。  </p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-7b4370e9-4a7b-44fb-81ec-ecae48191898.png" alt="image-7b4370e9-4a7b-44fb-81ec-ecae48191898.png"></p><h1 id="作成手順"><a href="#作成手順" class="headerlink" title="作成手順"></a>作成手順</h1><p>Service Bus トリガーの作成方法は<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-your-first-function-visual-studio#create-a-function-app-project">チュートリアル</a>で紹介されているテンプレートをご利用ください。チュートリアルでは HTTP トリガーを利用しておりますが、同画面にて Service Bus キュー トリガーまたは Service Bus トピック トリガーを選択いただけます。選択いただいたトリガーに応じて <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#attributes">属性</a> として定義するべき項目が異なるためご注意ください。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-5759391f-c15d-43f5-af96-4339b5c6d06c.png" alt="image-5759391f-c15d-43f5-af96-4339b5c6d06c.png"></p><p>また、キュー、トピック名など各属性情報は、アプリケーション設定にて管理することができます。C# の例ですが、ServiceBusTrigger の引数で 各属性情報を <code>%</code> 括りのアプリケーション設定名とします(上段黄色枠)。ローカルの実行のため local.settings.json となりますが(下段黄色枠)、設定値の中身を宣言します。</p><p>Service Bus の <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#connection-string">接続文字列</a> については <code>connection</code> プロパティで指定した値と一致する名前のアプリケーション設定を定義する、または、<code>connection</code> プロパティで指定した値に “AzureWebJobs” の接頭字を付与してアプリケーション設定で定義する（青色枠）ことが可能です。</p><p>Azure 上の Azure Functions リソースの場合には local.settings.json にて定義いただいた同項目をアプリケーション設定に設定ください。</p><p>Service Bus キュー トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-2b6bf99e-c9d3-457b-a626-9521cd74c098.png" alt="image-2b6bf99e-c9d3-457b-a626-9521cd74c098.png"></p><p>Service Bus トピック トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-9118de59-a23c-4aee-97f3-22751b08ee74.png" alt="image-9118de59-a23c-4aee-97f3-22751b08ee74.png"></p><h1 id="実行状況をログで確認する"><a href="#実行状況をログで確認する" class="headerlink" title="実行状況をログで確認する"></a>実行状況をログで確認する</h1><p>Service Bus トリガーの実行詳細をログから確認します。host.json の logging で下記のカテゴリのログを出力するように設定します。デバッグ用となるため、運用状況によって有効&#x2F;無効化を検討ください。</p><h2 id="host-json"><a href="#host-json" class="headerlink" title="host.json"></a>host.json</h2><pre><code>&quot;logging&quot;: {  &quot;logLevel&quot;: {    &quot;Host.General&quot;: &quot;Debug&quot;,    &quot;Function&quot;: &quot;Debug&quot;,    &quot;Microsoft.Azure.WebJobs.Hosting&quot;: &quot;Debug&quot;,    &quot;Microsoft.Azure.WebJobs.ServiceBus&quot;: &quot;Debug&quot;,    &quot;Azure.Messaging.ServiceBus&quot;: &quot;Debug&quot;  }}</code></pre><h2 id="Application-Insights-で利用するクエリ"><a href="#Application-Insights-で利用するクエリ" class="headerlink" title="Application Insights で利用するクエリ"></a>Application Insights で利用するクエリ</h2><pre><code>traces| where timestamp &gt; datetime(&quot;yyyy-mm-dd hh:mi&quot;)| where customDimensions.Category startswith &quot;Microsoft.Azure.WebJobs.ServiceBus&quot; or customDimensions.Category startswith &quot;Azure.Messaging.ServiceBus&quot; or operation_Name =~ &quot;&lt;関数名&gt;&quot;| project timestamp, message, customDimensions| order by timestamp asc</code></pre><p>上記の設定を行った際に記録されるログの例です。</p><h3 id="メッセージ取得"><a href="#メッセージ取得" class="headerlink" title="メッセージ取得"></a>メッセージ取得</h3><p>Azure Functions Host で Service Bus クライアント、Service Bus レシーバーの作成、Service Bus への認証を行い（黄色枠）、メッセージ受信を行うポーリング処理（赤色枠の <code>ReceiveBatchAsync</code> の処理）を行っていることが記録されています。</p><p>Service Bus キュー トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-38465d84-1d28-4147-bf7e-af98e4a659b1.png" alt="image-38465d84-1d28-4147-bf7e-af98e4a659b1.png"></p><p>Service Bus トピック トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-82255ffb-feb0-48fb-847b-69e01d76bf60.png" alt="image-82255ffb-feb0-48fb-847b-69e01d76bf60.png"></p><h3 id="実行ログ"><a href="#実行ログ" class="headerlink" title="実行ログ"></a>実行ログ</h3><p>Service Bus よりメッセージ取得されたことで、トリガーの実行され <code>Executing~</code> と <code>Executed~</code> に合わせて <code>Trigger Details:~</code> が記録されています。<code>Trigger Details:~</code> となっているログでは、Service Bus の<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#message-metadata">メタ データ</a> が確認でき配信回数、エンキュー時刻やシーケンス番号などが記録されます。</p><p>Service Bus キュー トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-e184c18b-7138-4f2d-ac19-baceee3a76a3.png" alt="image-e184c18b-7138-4f2d-ac19-baceee3a76a3.png"></p><p>Service Bus トピック トリガー例：</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-c08c6f4e-06b2-4aa7-b145-1949f46447f4.png" alt="image-c08c6f4e-06b2-4aa7-b145-1949f46447f4.png"></p><h3 id="ロックの更新"><a href="#ロックの更新" class="headerlink" title="ロックの更新"></a>ロックの更新</h3><p>60 秒以上処理時間がかかるアプリケーション（実行ログは青色ハイライト）を実装しています。メッセージを受信したことにより 1:48:49 に処理開始をしています。その後、Service Bus 側のロック期間を超過しないように 1 分以内（下記ログでは 1:49:39 に実施）にロックの更新（RenewMessageLock）を行っていることが確認できます（ロック処理の一連は黄色ハイライト）。最終的に関数実行が完了したことで、Complete （緑色ハイライト）をしています。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-e30fb6f5-20d1-4f61-a870-630f87d23017.png" alt="image-e30fb6f5-20d1-4f61-a870-630f87d23017.png"></p><h1 id="並行処理とチューニング"><a href="#並行処理とチューニング" class="headerlink" title="並行処理とチューニング"></a>並行処理とチューニング</h1><h2 id="並行処理の考え方"><a href="#並行処理の考え方" class="headerlink" title="並行処理の考え方"></a>並行処理の考え方</h2><p>Service Bus トリガーには「単一ディスパッチ処理」「単一ディスパッチ処理(セッションベース)」「バッチ処理」の 3 つの実行モデルがあります。選択いただいた実行モデルに基づきメッセージを何件ずつ処理するかが異なります。また、この構成は Service Bus キュー トリガーと Service Bus トピック トリガー共通となります。</p><p>上記の実行モデルは <strong>IsBatched</strong> と <strong>IsSessionsEnabled</strong> の 2 つの属性の組み合わせによって決まります。また実行数に関するプロパティとして、<strong>maxConcurrentCalls</strong>、<strong>maxConcurrentSessions</strong>、<strong>maxMessageBatchSize(maxMessageCount)</strong> がありますが、実行モデルによって有効なプロパティが異なるので留意する必要があります。<br>実行モデルに対応する組み合わせと実行数の制御を行うプロパティについては <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-target-based-scaling?tabs=v5,csharp#service-bus-queues-and-topics">こちら</a> に紹介がございます。  </p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-55fe0f8f-c0fb-466c-a499-ed1d99603f1d.png" alt="image-55fe0f8f-c0fb-466c-a499-ed1d99603f1d.png"></p><h3 id="単一ディスパッチ処理"><a href="#単一ディスパッチ処理" class="headerlink" title="単一ディスパッチ処理"></a>単一ディスパッチ処理</h3><p>関数が 1 回実行されるとメッセージは 1 件だけ処理されます。<br>1 インスタンスで並行処理されるメッセージ数を <strong>maxConcurrentCalls</strong> プロパティで制御できます。<br>下記は、.NET 分離ワーカモデルでの実装サンプルです。関数が 1 回実行されるとメッセージは 1 件だけ処理されますので、受け付ける型は <code>ServiceBusReceivedMessage</code> です。</p><pre><code>[Function(nameof(ServiceBusReceivedMessageFunction))][ServiceBusOutput(&quot;outputQueue&quot;, Connection = &quot;ServiceBusConnection&quot;)]public string ServiceBusReceivedMessageFunction(    [ServiceBusTrigger(&quot;queue&quot;, Connection = &quot;ServiceBusConnection&quot;)] ServiceBusReceivedMessage message){    _logger.LogInformation(&quot;Message ID: {id}&quot;, message.MessageId);    _logger.LogInformation(&quot;Message Body: {body}&quot;, message.Body);    _logger.LogInformation(&quot;Message Content-Type: {contentType}&quot;, message.ContentType);    var outputMessage = $&quot;Output message created at {DateTime.Now}&quot;;    return outputMessage;}</code></pre><p>Service Bus に複数メッセージがある場合でも 1 件ずつ受信され、それぞれ関数実行されることが確認できます。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-37acc4d2-0fac-483a-a440-b702829dfa2f.png" alt="image-37acc4d2-0fac-483a-a440-b702829dfa2f.png"></p><h3 id="単一ディスパッチ処理-セッションベース"><a href="#単一ディスパッチ処理-セッションベース" class="headerlink" title="単一ディスパッチ処理 (セッションベース)"></a>単一ディスパッチ処理 (セッションベース)</h3><p>関数が 1 回実行されるとメッセージは 1 件だけ処理されます。<br>1 インスタンスで並行処理されるメッセージ数を <strong>maxConcurrentSessions</strong> プロパティで制御できます。<br>※基本的には前項の「単一ディスパッチ処理」と違いはなく、セッションベースか否かとなります。</p><h3 id="バッチ処理"><a href="#バッチ処理" class="headerlink" title="バッチ処理"></a>バッチ処理</h3><p>関数が 1 回実行されるとメッセージは N 件数分処理されます。最大で <strong>maxMessageBatchSize</strong> プロパティ件数分処理されます。<br>1 インスタンスでメッセージを並行処理はできません。<br>下記は、.NET 分離ワーカモデルでの実装サンプルです。関数が 1 回実行されるとメッセージは N 件処理されますので、受け付ける型は <code>ServiceBusReceivedMessage[]</code> です。</p><pre><code>[Function(nameof(ServiceBusReceivedMessageBatchFunction))]public void ServiceBusReceivedMessageBatchFunction(    [ServiceBusTrigger(&quot;queue&quot;, Connection = &quot;ServiceBusConnection&quot;, IsBatched = true)] ServiceBusReceivedMessage[] messages){    foreach (ServiceBusReceivedMessage message in messages)    {        _logger.LogInformation(&quot;Message ID: {id}&quot;, message.MessageId);        _logger.LogInformation(&quot;Message Body: {body}&quot;, message.Body);        _logger.LogInformation(&quot;Message Content-Type: {contentType}&quot;, message.ContentType);    }}</code></pre><p>ログからも一回の関数実行にて 2 つのメッセージが処理されていることを確認できます。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-724c46c8-6c6f-4026-a46c-414d157109c4.png" alt="image-724c46c8-6c6f-4026-a46c-414d157109c4.png"></p><h1 id="よくお問い合わせいただく動作"><a href="#よくお問い合わせいただく動作" class="headerlink" title="よくお問い合わせいただく動作"></a>よくお問い合わせいただく動作</h1><p>弊サポートにてよくお問い合わせいただく事例について紹介します。なお、下記に記載しますログ出力例は、Function Host のランタイム バージョン が v4.1041.200.25360 時点の例となります。バージョンが異なることにより出力内容が異なる可能性がありますことをご留意ください。なお、ログは <a href="#application-insights-%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%82%AF%E3%82%A8%E3%83%AA">Application Insights で利用するクエリ</a> にて記載したクエリを実行した結果より確認しています。</p><h2 id="デプロイ後に-Service-Bus-トリガーが実行できない"><a href="#デプロイ後に-Service-Bus-トリガーが実行できない" class="headerlink" title="デプロイ後に Service Bus トリガーが実行できない"></a>デプロイ後に Service Bus トリガーが実行できない</h2><p>Azure 上に展開した後に動作しない場合の代表的な原因のひとつに、Service Bus の接続情報が正しく設定されていないことがあります。接続文字列が正しくない場合、存在しないキューやトピックを指定している場合、Service Bus 側のネットワーク制限によりアクセス拒否されている場合、Azure Fucntions にて VNet 統合を使用している際に NSG（Network Security Group） により Service Bus への通信が阻害されている場合などがあります。下記のようなログが記録されている場合は設定を見直していただくことで、事象が解消する可能性があります。</p><ul><li><p>接続文字列が正しくなく 401 エラーが発生</p><p>Azure Function にて設定している接続文字列が正しいか、有効期限内であるかをご確認ください。再設定をすることで正常に動作する可能性があります。</p><p><strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-16c4b7aa-ecba-4915-afdb-d257ba4f9034.png" alt="image-16c4b7aa-ecba-4915-afdb-d257ba4f9034.png"></p><p>また Service Bus 名前空間より [概要] ブレードの ”ローカル認証” の設定にて SAS キー認証が有効となっているかも併せてご確認ください。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-c0662c24-78a8-419f-887d-65c15e13b2a8.png" alt="image-c0662c24-78a8-419f-887d-65c15e13b2a8.png"></p></li><li><p>存在しないキューを指定したため 404 エラーが発生</p><p>Azure Function におけるキューやトピック&#x2F;サブスクリプションの設定が正しいか、Service Bus に対象が存在するかをご確認ください。また使用している接続文字列にて対象のキューやトピック&#x2F;サブスクリプションが参照できる権限があるかについてもご確認ください。</p><p><strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-2943cbff-dc56-4377-903b-c472f9818b88.png" alt="image-2943cbff-dc56-4377-903b-c472f9818b88.png"></p></li><li><p>Service Bus 側のネットワーク制限により 401 エラーが発生</p><p>Service Bus のネットワーク設定をご確認いただき、Azure Function の送信 IP アドレスが許可されていることを確認してください。</p><p><strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-1646136c-254d-401b-a847-031d6550b846.png" alt="image-1646136c-254d-401b-a847-031d6550b846.png"></p><p>Service Bus 名前空間の [ネットワーク] ブレードにて許可されている IP アドレスが確認できます。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-1d091cb7-5b70-4117-b987-729b9bda0f46.png" alt="image-1d091cb7-5b70-4117-b987-729b9bda0f46.png"></p><p>既定では Azure Functions の送信 IP アドレスは使用可能なアドレスの内 1つを使用するため、全てのアドレスを許可いただく必要があります。IP アドレスの確認方法は <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/ip-addresses?tabs=portal#find-outbound-ip-addresses">こちら</a> を参照ください。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-ae532b9a-333e-46a5-b891-38c80e9f55de.png" alt="image-ae532b9a-333e-46a5-b891-38c80e9f55de.png"></p><p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-nat-gateway">Azure 仮想ネットワーク NAT ゲートウェイを使用して Azure Functions の送信 IP を制御</a> し、送信 IP アドレスを固定化をすることで特定の IP アドレスのみ許可いただくことでも実現いただけます。</p></li><li><p>NSG により Service Bus へ通信できない状況でソケットエラーが発生</p><p>Azure Function に統合いただいている VNet の NSG により、Outbound 通信が制限されていないかをご確認ください。</p><p><strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-20c95a59-bd18-4e98-a26b-e88352ff1268.png" alt="image-20c95a59-bd18-4e98-a26b-e88352ff1268.png"></p><p>Azure Function に統合いただいている VNet の NSG のOutbound 通信の設定として、 ServiceBus のサービス タグで <a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-faq#----------------------------">Service Bus の通信に必要なポート（5671, 5672, 443）</a> を許可する必要があります。なお、その他に　Azure Function に必要な通信設定はここでは割愛しているため、お客様の通信要件に合わせてその他設定もする必要があることをご留意ください。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-2906e519-13c9-4fa6-979d-422de7b2f89c.png" alt="image-2906e519-13c9-4fa6-979d-422de7b2f89c.png"></p></li></ul><h2 id="Message-processing-error-という例外が発生した"><a href="#Message-processing-error-という例外が発生した" class="headerlink" title="Message processing error という例外が発生した"></a>Message processing error という例外が発生した</h2><p>ロック機構に関連してエラーが発生しています。 ServiceBus.ServiceBusException の内容を確認することで詳細なエラーが確認でき、下記の例ではアプリケーション処理時間が maxAutoLockRenewalDuration にて定義しているロック更新期間を超えた際のログとなります。Service Bus におけるロックの状態や実際のアプリケーションの処理時間を確認することで原因を切り分けいただけます。</p><p>  <strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-5f8bac8d-665c-4e35-8a5b-a82cc03ca23c.png" alt="image-5f8bac8d-665c-4e35-8a5b-a82cc03ca23c.png"></p><p>エラーが発生した際は Service Bus 側のメッセージ状態を確認し、状況に応じて対処ください。</p><ul><li><p>メッセージがキューやトピックに残存している場合</p><p>自動で再試行されるため、対処不要となります。下記の例では処理失敗したメッセージの配信回数がインクリメントされた状態となります。再度メッセージ受信されることで処理されます。Service Bus のキューやトピックの [Service Bus エクスプローラー] ブレードより下記の画面をご確認いただけます。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-4a464d96-79e6-4273-8712-82a2777db081.png" alt="image-4a464d96-79e6-4273-8712-82a2777db081.png"></p></li><li><p>配信不能キューにメッセージが存在する場合</p><p>対象のメッセージのプロパティを確認することで、配信不能になった理由を確認できます。下記例では最大配信回数超過によりメッセージが移動されていますので、アプリケーションが処理できる状態であるか、処理時間に問題はないかなどをご確認いただいた上で、メッセージの再送信をすることで復旧いただける可能性があります。Service Bus のキューやトピックの [Service Bus エクスプローラー] ブレードより下記の画面をご確認いただけます。</p><p><img src="/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus/image-a0d39151-c6ee-4c6c-93a2-c5cf01d06e6f.png" alt="image-a0d39151-c6ee-4c6c-93a2-c5cf01d06e6f.png"></p></li><li><p>メッセージが配信不能キューを含め、キューやトピックに存在しない場合</p><p>再試行処理などにより処理が完了している状態となりますので、正常終了しています。</p></li></ul><h1 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h1><p>本ブログでは Service Bus トリガー関数の動作及び作成方法について整理しました。Service Bus トリガーのトラブルシューティングの参考になれば幸いです。</p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">Azure Functions（関数アプリ）の内部アーキテクチャ概要や関連する用語について</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">Azure Functions における Azure Service Bus のバインド</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-queues-topics-subscriptions">Azure Service Bus のメッセージング - キュー、トピック、およびサブスクリプション - Azure Service Bus</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/message-sessions">Azure Service Bus のメッセージ セッション - Azure Service Bus</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/message-transfers-locks-settlement">Azure Service Bus メッセージの転送、ロック、および解決 - Azure Service Bus</a><br><br><br><br></p><hr><br><br><p>2025 年 09 月 08 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/09/08/Azure-functions-trigger-and-binding-series-servicebus.html"/>
    <published>2025-09-07T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-service-bus?tabs=isolated-process,extensionv5,extensi]]>
    </summary>
    <title>Azure Functions トリガー・バインディング シリーズ - Service Bus トリガー</title>
    <updated>2026-04-08T05:14:28.274Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <content>
      <![CDATA[<p>お世話になっております。App Service サポート担当の仲野です。いつも Azure Functions（関数アプリ）をご利用いただき誠にありがとうございます。Azure Functions では拡張バンドルのコンテンツを Contents Delivery Network（CDN） を使用して取得しています。これまで使用していた CDN プロバイダーの運用の停止に伴い、Azure Functions では新たな CDN よりコンテンツの配布を行うようになりました。本記事は CDN ドメインの移行の詳細、それに伴う影響についてを解説します。</p><h1 id="Azure-Functions-で使用している-CDN-移行について"><a href="#Azure-Functions-で使用している-CDN-移行について" class="headerlink" title="Azure Functions で使用している CDN 移行について"></a>Azure Functions で使用している CDN 移行について</h1><p><a href="https://learn.microsoft.com/ja-jp/previous-versions/azure/cdn/edgio-retirement-faq">Azure CDN from Edgio の廃止に関する FAQ</a> にて言及されているように、2025 年 1 月 15 日に Edgio 社にて提供されているサービスが終了され、それに伴い CDN サービスの移行が行われました。移行前後で使用されている CDN のドメインは下記の通りとなります。</p><p><strong>移行前の CDN ドメイン</strong></p><ul><li>functionscdn.azureedge.net</li><li>functionscdnstaging.azureedge.net</li></ul><p><strong>移行後の CDN ドメイン</strong></p><ul><li>cdn.functions.azure.com</li><li>cdn-staging.functions.azure.com</li></ul><h1 id="各種ツールの-CDN-ドメイン対応状況"><a href="#各種ツールの-CDN-ドメイン対応状況" class="headerlink" title="各種ツールの CDN ドメイン対応状況"></a>各種ツールの CDN ドメイン対応状況</h1><p>Azure Functions にて提供されている各種ツールにおいても CDN ドメインの移行対応が完了しています。例えば、Core Tools や Functions Host では、それぞれ下記のバージョン以降は CDN ドメインの移行がされています。</p><h2 id="Azure-Functions-Core-Tools"><a href="#Azure-Functions-Core-Tools" class="headerlink" title="Azure Functions Core Tools"></a>Azure Functions Core Tools</h2><ul><li><p>Azure Functions Core Tools：<a href="https://github.com/Azure/azure-functions-core-tools/releases/tag/4.0.7030">4.0.7030</a> 以降</p><p>更新内容は <a href="https://github.com/Azure/azure-functions-core-tools/pull/4265">こちら</a> からご確認いただけます。</p><p>ローカル環境で動作している Core Tool のバージョンを確認する例として、コマンド プロンプトにて <code>func --version</code> を実行いただくことでご確認いただけます。</p><p><img src="/jpazpaas/2025/09/05/Migration-of-functionscdn.azureedge.net-Subdomain/image-3209480f-4274-4762-a67a-5dfc2b98453e.png" alt="image-3209480f-4274-4762-a67a-5dfc2b98453e.png"></p></li></ul><h2 id="Functions-Host"><a href="#Functions-Host" class="headerlink" title="Functions Host"></a>Functions Host</h2><ul><li><p>Functions Host：<a href="https://github.com/Azure/azure-functions-host/releases/tag/v4.1038.100">4.1038.100</a> 以降</p><p> 更新内容は Github の Issue（<a href="https://github.com/Azure/azure-functions-host/pull/10816">#10816</a>、<a href="https://github.com/Azure/azure-functions-host/pull/10817">#10817</a>、<a href="https://github.com/Azure/azure-functions-host/pull/10824">#10824</a>、<a href="https://github.com/Azure/azure-functions-host/pull/10847">#10847</a>）よりご確認いただけます。</p><p> 動作している Functions Host のバージョンは Azure Portal にて対象の Azure Functions の [概要] ブレードよりご確認いただけます。 </p><p> <img src="/jpazpaas/2025/09/05/Migration-of-functionscdn.azureedge.net-Subdomain/image-d2130638-996a-4210-90c5-abb8479f6337.png" alt="image-d2130638-996a-4210-90c5-abb8479f6337.png"></p></li></ul><h1 id="CDN-移行に伴う影響について"><a href="#CDN-移行に伴う影響について" class="headerlink" title="CDN 移行に伴う影響について"></a>CDN 移行に伴う影響について</h1><h2 id="影響"><a href="#影響" class="headerlink" title="影響"></a>影響</h2><p>CDN ドメインの移行は既に完了しており、旧 CDN プロバイダーにて使用されていた移行前のドメインについては動作保証されない状況となります。そのため、執筆時点において使用しているドメインの移行が完了していない場合、Azure Functions が正常に動作しなくなる可能性があります。</p><p>以下のようなユースケースで影響が発生しますので、お手元の環境に該当するものがないかご確認ください。</p><ul><li>ユーザー コードにて移行前のドメインに直接的な依存を設けている場合</li><li>Firewall 等で対象の移行後のドメインが通信許可されていない場合</li><li>Core Tools や Functions Host などのバージョンが最新化されていない場合</li></ul><h2 id="対策"><a href="#対策" class="headerlink" title="対策"></a>対策</h2><p>移行後のドメインは、移行前のドメインとエンドポイント互換性があるため、移行前のドメインから使用可能なすべてのリソースは、移行後のドメインを通じて使用可能なため速やかに下記の対策をご検討ください。</p><ul><li>対象のドメインへ直接的な依存関係がある場合には移行後のドメインに更新ください。</li><li>Firewall 等で移行後のドメインが通信許可されるよう設定ください。</li><li>Core Tools や Functions Host などのバージョンを最新化ください。</li></ul><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://learn.microsoft.com/ja-jp/previous-versions/azure/cdn/edgio-retirement-faq">Azure CDN from Edgio の廃止に関する FAQ</a></p><p><a href="https://github.com/Azure/Azure-Functions/issues/2576">Clarification on Migration of functionscdn.azureedge.net Subdomain</a></p><p><a href="https://github.com/Azure/azure-functions-extension-bundles/issues/474">Critical Notice: Bundles are now hosted from cdn.functions.azure.com</a></p><p><a href="https://github.com/Azure/azure-functions-core-tools/issues/4260">Critical Notice: Core Tools is now hosted from cdn.functions.azure.com</a></p><br><br><hr><br><br><p>2025 年 09 月 05 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/09/05/Migration-of-functionscdn.azureedge.net-Subdomain.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/09/05/Migration-of-functionscdn.azureedge.net-Subdomain.html"/>
    <published>2025-09-04T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>お世話になっております。App Service サポート担当の仲野です。いつも Azure Functions（関数アプリ）をご利用いただき誠にありがとうございます。Azure Functions では拡張バンドルのコンテンツを Contents Delivery Netw]]>
    </summary>
    <title>Azure Functions で使用している CDN ドメインの移行について</title>
    <updated>2026-04-08T05:14:28.273Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <content>
      <![CDATA[<h2 id="はじめに"><a href="#はじめに" class="headerlink" title="はじめに"></a>はじめに</h2><p>お世話になっております。App Service サポート担当の仲野です。いつも Azure Functions（関数アプリ）をご利用いただき誠にありがとうございます。</p><p>本記事は <a href="https://github.com/Azure/app-service-announcements/issues/503">Potential breaking change for older versions (October 2025)</a> にてアナウンスされた内容の日本語抄訳です。最新情報につきましてはリンク先の Github の Issue をご確認ください。</p><p>2025 年 10 月に Azure Functions のプラットフォームのアップデートが予定されています。それに伴い、マイナー ランタイム バージョンに固定されている Azure Functions が正常に動作しなくなる潜在リスクがあります。</p><p>以下に当該アップデートにより潜在的なリスクが存在するバージョンと対策について解説します。<br/></p><h2 id="影響を受ける可能性のあるバージョン情報と対応内容"><a href="#影響を受ける可能性のあるバージョン情報と対応内容" class="headerlink" title="影響を受ける可能性のあるバージョン情報と対応内容"></a>影響を受ける可能性のあるバージョン情報と対応内容</h2><p>プラットフォームのアップデートに伴い、特定のセキュリティ機能がない古いランタイム バージョンで動作する Azure Functions に影響を及ぼす可能性があります。現時点ではプラットフォームの変更は、<strong>2025年10月28日</strong>に有効になる見込みです。そのため当該アップデート以前に Azure Functions のランタイムの更新をすることを推奨します。</p><p>下記の表に示すランタイム バージョンで動作している Azure Functions につきましては、直ちに対策をご検討ください。</p><table><thead><tr><th>ランタイム メジャー バージョン</th><th>ランタイム バージョン</th><th>対応内容</th></tr></thead><tbody><tr><td>v1.x</td><td>1.0.20776.0 未満</td><td>常に最新の 1.x バージョンを使うようにアプリを更新してください。1.x のサポートは 2026年9月14日に終了します。できるだけ早く<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/migrate-version-1-version-4">4.x への移行</a>を行ってください。</td></tr><tr><td>v3.x</td><td>3.20.0.0 未満</td><td>直ちに<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/migrate-version-3-version-4">4.x への移行</a>を行ってください。2.x および 3.x のサポートは 2022年12月13日に終了しています。暫定対処として最新の 3.x へ更新できますが、4.x への移行をご検討ください。</td></tr><tr><td>v4.x</td><td>4.24.0.0 未満</td><td>常に最新の 4.x バージョンを使うようにアプリを更新してください。</td></tr></tbody></table><p>影響を受ける可能性があるランタイム バージョンで動作する Azure Functions をご利用中の場合、メールによる通知がされ、App Service Advisor で新たな推奨事項が作成されます。Azure ポータルの「診断と問題の解決」ビューで推奨事項を確認できます。</p><h2 id="重要事項"><a href="#重要事項" class="headerlink" title="重要事項"></a>重要事項</h2><p>前述の表に記載したバージョン範囲は、今回の変更のためにフラグが立てられたものですが、記載されたランタイム バージョンを「最低限必要なバージョン」と解釈しないようご注意ください。他にもセキュリティ修正が後のバージョンに含まれています。古いバージョンに固定されている Azure Functions は必ず更新すべきであり、1.0.20776.0、3.20.0.0、4.24.0.0 に移行しても十分ではありません。これらの範囲は、影響を受ける可能性のある Azure Functions を特定するための目安となります。</p><p>ランタイム バージョンにつきましては、原則マイナー バージョンに固定せず、メジャー バージョンのみを指定し、最新バージョンへ移行するよう努めてください。</p><h2 id="対策方法"><a href="#対策方法" class="headerlink" title="対策方法"></a>対策方法</h2><h3 id="常に最新バージョンで動作させる方法"><a href="#常に最新バージョンで動作させる方法" class="headerlink" title="常に最新バージョンで動作させる方法"></a>常に最新バージョンで動作させる方法</h3><p>Azure Functions が古いバージョンで動作している主な理由は、カスタム コンテナー イメージの基本レイヤーが更新されていないことが多いです。</p><p>カスタム コンテナー イメージを最新の 4.x ランタイムで動作させるには、以下の表にある適切な <a href="https://mcr.microsoft.com/catalog?search=functions">基本イメージ タグ</a> をプルし、カスタム イメージを定期的にリビルドして、新しいバージョンを使用してください。</p><table><thead><tr><th>言語スタック</th><th>推奨される基本イメージ タグの例</th></tr></thead><tbody><tr><td>.NET（分離ワーカー モデル）</td><td><code>mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0-appservice</code><br/>(これらの例は .NET 8 を対象とします。必要な .NET バージョンに適したイメージを選択します)。</td></tr><tr><td>.NET（レガシ インプロセスモデル）</td><td><code>mcr.microsoft.com/azure-functions/dotnet:4-dotnet8.0</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/dotnet:4-dotnet8.0-appservice</code><br/>(インプロセス モデルのサポートは 2026 年 11 月 10 日に終了します。できるだけ早く<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/migrate-dotnet-to-isolated-model">分離ワーカー モデルへの移行</a>する必要があります)</td></tr><tr><td>Java</td><td><code>mcr.microsoft.com/azure-functions/java:4-java21</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/java:4-java21-appservice</code><br/>(これらの例は Java 21 を対象とします。必要な Java バージョンに適したイメージを選択します)。</td></tr><tr><td>Node.js（JavaScript または TypeScript）</td><td><code>mcr.microsoft.com/azure-functions/node:4-node22</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/node:4-node22-appservice</code><br/>(これらの例では、Node.js 22 を対象とします。必要な Node.js バージョンに適したイメージを選択します)。</td></tr><tr><td>PowerShell</td><td><code>mcr.microsoft.com/azure-functions/powershell:4-powershell7.4</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/powershell:4-powershell7.4-appservice</code><br/>(これらの例は PowerShell 7.4 を対象とします。必要な PowerShell バージョンに適したイメージを選択します)。</td></tr><tr><td>Python</td><td><code>mcr.microsoft.com/azure-functions/python:4-python3.12</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/python:4-python3.12-appservice</code><br/>(これらの例は Python 3.12 を対象とします。必要な Python バージョンに適したイメージを選択します)。)</td></tr><tr><td>カスタムハンドラー&#x2F;その他</td><td><code>mcr.microsoft.com/azure-functions/base:4</code><br/>または<br/><code>mcr.microsoft.com/azure-functions/base:4-appservice</code></td></tr></tbody></table><p>詳細は <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/container-concepts#maintaining-custom-containers">カスタム コンテナーのメンテナンス</a> を参照してください。</p><p>また、Azure Functions の設定で古いバージョンに固定している場合もあります。<br>4.x ランタイムの最新バージョンを対象とするには、アプリ設定<code>FUNCTIONS_EXTENSION_VERSION</code> の値を <code>~4</code> と設定してください。</p><p>詳細は <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/set-runtime-version">Azure Functions ランタイム バージョンをターゲットにする方法</a> を参照してください。</p><hr><br><br><p>2025 年 07 月 31 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/07/31/Potential-breaking-change-for-older-versions.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/07/31/Potential-breaking-change-for-older-versions.html"/>
    <published>2025-07-30T15:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="はじめに"><a href="#はじめに" class="headerlink" title="はじめに"></a>はじめに</h2><p>お世話になっております。App Service サポート担当の仲野です。いつも Azure Functions（関数アプリ）]]>
    </summary>
    <title>Azure Functions の古いランタイム バージョンに対する潜在的な破壊的変更（2025年10月）</title>
    <updated>2026-04-08T05:14:28.272Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <content>
      <![CDATA[<hr><p>お世話になっております。App Service サポート担当の山村です。いつも Azure Functions（関数アプリ）をご利用いただき誠にありがとうございます。</p><p>Azure Functions を使用してサーバーレスアプリケーションを開発・運用する際、アプリケーションや実行状況のログ監視は非常に重要です。<br>Azure Functions では Application Insights と統合することでこれらの監視が可能です。</p><p>本ブログでは、Azure Functions の .NET Isolated (分離ワーカー) モデルにおいて <code>Language Worker → Application Insights</code> のログ送信パイプラインをご利用いただいている場合に、Application Insights への 依存関係（Dependency）ログの送信について、特定の <code>type (HTTP etc)</code> や <code>target (www.microsoft.com etc)</code> 毎に制御する方法を解説します。</p><p>本ブログに記載の内容は、Dependency に関するログ保存のコストを抑えたいというユースケースでご利用いただけます。<br>Dependency ログの <code>type (HTTP etc)</code> や <code>target (www.microsoft.com etc)</code> 属性の値をもとに Dependency ログの保存有無を制御したい場合に、本内容が有効となります。</p><h1 id="Azure-Functions-のアーキテクチャ概略"><a href="#Azure-Functions-のアーキテクチャ概略" class="headerlink" title="Azure Functions のアーキテクチャ概略"></a>Azure Functions のアーキテクチャ概略</h1><p>Azure Functions では、Functions Host と呼ばれるプロセスと、Language Worker と呼ばれるプロセスが動作しています。</p><p>Functions Host は、HTTP トリガーや Blob トリガーなどのイベント検知や各種ログの記録といった共通処理を担い、Azure Functions のランタイムとして動作する Language Worker へ処理を要求します。 <br>Language Worker は各言語に応じた関数コードを実行するプロセスであり、お客様のアプリケーションコードが実行されます。<br>Azure Functions のアーキテクチャの詳細は、<a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">こちらのブログ</a>をご参照ください。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-47a83b48-dab2-4d99-aaa6-82f19e20635a.png" alt="image-47a83b48-dab2-4d99-aaa6-82f19e20635a.png"></p><h1 id="Application-Insights-へのログ送信フロー"><a href="#Application-Insights-へのログ送信フロー" class="headerlink" title="Application Insights へのログ送信フロー"></a>Application Insights へのログ送信フロー</h1><p>Azure Functions .NET Isolated を Application Insights と統合している場合には、Language Worker が Application Insights へログを送信するパイプラインは以下の二通りがあります。</p><ol><li><code>Language Worker → Functions Host → Application Insights</code><br></li><li><code>Language Worker → Application Insights</code></li></ol><p>詳細については、<a href="https://azure.github.io/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations.html">こちらのブログ</a>をご参照ください。</p><p>なお、2) の場合は、Language Worker が出力するログについては、Functions Host を経由しないため host.json の Application Insights の設定は効果がありません。<br>Language Worker が出力するログに関する Application Insights の設定は、スタートアップ構成の <code>Program.cs</code> 内で実装する必要があります。</p><h1 id="本題-Language-Worker-→-Application-Insights-ログ送信パイプラインの場合の-Dependency-ログの送信について、特定の-type-や-target-毎に制御する方法"><a href="#本題-Language-Worker-→-Application-Insights-ログ送信パイプラインの場合の-Dependency-ログの送信について、特定の-type-や-target-毎に制御する方法" class="headerlink" title="本題: Language Worker → Application Insights ログ送信パイプラインの場合の Dependency ログの送信について、特定の type や target 毎に制御する方法"></a>本題: Language Worker → Application Insights ログ送信パイプラインの場合の Dependency ログの送信について、特定の type や target 毎に制御する方法</h1><h2 id="実装例"><a href="#実装例" class="headerlink" title="実装例"></a>実装例</h2><p>スタートアップ構成の <code>Program.cs</code> 側で ITelemetryProcessor を用いて制御します。</p><p>まずは、外部エンドポイントに HTTP リクエストを実施するアプリケーションコード例を示します。</p><p><strong>HTTP トリガー関数の実装例</strong> <br></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Http;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Mvc;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Logging;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker.Http; <span class="comment">//追加</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Company.Function</span>;</span><br><span class="line">  </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">HttpTrigger1</span>  </span><br><span class="line">&#123;  </span><br><span class="line">   <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger&lt;HttpTrigger1&gt; _logger;  </span><br><span class="line">   <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">readonly</span> HttpClient httpClient = <span class="keyword">new</span> HttpClient();</span><br><span class="line">   <span class="function"><span class="keyword">public</span> <span class="title">HttpTrigger1</span>(<span class="params">ILogger&lt;HttpTrigger1&gt; logger</span>)</span>  </span><br><span class="line">   &#123;  </span><br><span class="line">       _logger = logger;  </span><br><span class="line">   &#125;</span><br><span class="line">   [<span class="meta">Function(<span class="string">&quot;HttpTrigger1&quot;</span>)</span>]  </span><br><span class="line">   <span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task&lt;HttpResponseData&gt; <span class="title">Run</span>(<span class="params">[HttpTrigger(AuthorizationLevel.Anonymous, <span class="string">&quot;get&quot;</span>, <span class="string">&quot;post&quot;</span></span>)] HttpRequestData req)</span>  </span><br><span class="line">   &#123;  </span><br><span class="line">       _logger.LogInformation(<span class="string">&quot;C# HTTP trigger function processed a request starting...&quot;</span>);  </span><br><span class="line">       <span class="keyword">var</span> response = <span class="keyword">await</span> httpClient.GetAsync(<span class="string">&quot;https://www.microsoft.com&quot;</span>);  </span><br><span class="line">       _logger.LogInformation(response.StatusCode.ToString());</span><br><span class="line">       <span class="keyword">var</span> res = req.CreateResponse(response.IsSuccessStatusCode  </span><br><span class="line">           ? System.Net.HttpStatusCode.OK  </span><br><span class="line">           : System.Net.HttpStatusCode.BadGateway);</span><br><span class="line">       <span class="keyword">await</span> res.WriteStringAsync(<span class="string">$&quot;Status: <span class="subst">&#123;response.StatusCode&#125;</span>&quot;</span>);  </span><br><span class="line">       <span class="keyword">return</span> res;  </span><br><span class="line">   &#125;  </span><br><span class="line">&#125;  </span><br></pre></td></tr></table></figure><p>次に、ビルダー構成時に <code>AddApplicationInsightsTelemetryProcessor</code> を用いて、Telemetry データのフィルタリングと加工処理を適用します。</p><p><strong>Program.cs</strong> <br></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker.Builder;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.DependencyInjection;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Hosting;  </span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Logging;</span><br><span class="line"><span class="keyword">using</span> IsolatedApplicationInsightsCustomTelemetryProcessor;</span><br><span class="line"><span class="keyword">var</span> builder = FunctionsApplication.CreateBuilder(<span class="keyword">args</span>);</span><br><span class="line"></span><br><span class="line">builder.Services  </span><br><span class="line">   .AddApplicationInsightsTelemetryWorkerService()  </span><br><span class="line">   .ConfigureFunctionsApplicationInsights()  </span><br><span class="line">   .AddApplicationInsightsTelemetryProcessor&lt;CustomTelemetryProcessor&gt;();</span><br><span class="line">  </span><br><span class="line">builder.Logging.Services.Configure&lt;LoggerFilterOptions&gt;(options =&gt;  </span><br><span class="line">&#123;  </span><br><span class="line">   LoggerFilterRule toRemove = options.Rules.FirstOrDefault(rule =&gt;  </span><br><span class="line">       rule.ProviderName == <span class="string">&quot;Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider&quot;</span>);</span><br><span class="line">   <span class="keyword">if</span> (toRemove <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">null</span>)  </span><br><span class="line">   &#123;  </span><br><span class="line">       options.Rules.Remove(toRemove);  </span><br><span class="line">   &#125;  </span><br><span class="line">&#125;);  </span><br><span class="line">  </span><br><span class="line">builder.Build().Run();  </span><br></pre></td></tr></table></figure><p>ITelemetryProcessor で具体的なフィルタリング処理を追加します。<br><br>※ CustomTelemetryProcessor.cs を新しいファイルとして作成し、Program.cs にインポートするような実装としています。</p><p><strong>CustomTelemetryProcessor.cs</strong> <br></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">IsolatedApplicationInsightsCustomTelemetryProcessor</span>  </span><br><span class="line">&#123;  </span><br><span class="line">   <span class="keyword">using</span> Microsoft.ApplicationInsights.Channel;  </span><br><span class="line">   <span class="keyword">using</span> Microsoft.ApplicationInsights.DataContracts;  </span><br><span class="line">   <span class="keyword">using</span> Microsoft.ApplicationInsights.Extensibility;</span><br><span class="line">   <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">CustomTelemetryProcessor</span> : <span class="title">ITelemetryProcessor</span>  </span><br><span class="line">   &#123;  </span><br><span class="line">       <span class="keyword">private</span> ITelemetryProcessor Next &#123; <span class="keyword">get</span>; <span class="keyword">set</span>; &#125;</span><br><span class="line">       <span class="function"><span class="keyword">public</span> <span class="title">CustomTelemetryProcessor</span>(<span class="params">ITelemetryProcessor next</span>)</span>  </span><br><span class="line">       &#123;  </span><br><span class="line">           <span class="keyword">this</span>.Next = next;  </span><br><span class="line">       &#125;</span><br><span class="line">       <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Process</span>(<span class="params">ITelemetry telemetry</span>)</span>  </span><br><span class="line">       &#123;  </span><br><span class="line">           <span class="comment">// if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Target == &quot;www.microsoft.com&quot;) // target URL or service name etc.  </span></span><br><span class="line">           <span class="comment">// if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Type == &quot;Http&quot;) // &quot;Http&quot;, &quot;InProc&quot; etc.  </span></span><br><span class="line">           <span class="keyword">if</span> (telemetry <span class="keyword">is</span> DependencyTelemetry dependency) <span class="comment">// Don&#x27;t send all dependencies telemetry  </span></span><br><span class="line">           &#123;  </span><br><span class="line">               Console.WriteLine(<span class="string">$&quot;target: <span class="subst">&#123;dependency.Target&#125;</span>&quot;</span>);  </span><br><span class="line">               Console.WriteLine(<span class="string">$&quot;type: <span class="subst">&#123;dependency.Type&#125;</span>&quot;</span>);  </span><br><span class="line">               <span class="keyword">return</span>;  </span><br><span class="line">           &#125;  </span><br><span class="line">           <span class="keyword">this</span>.Next.Process(telemetry);  </span><br><span class="line">       &#125;  </span><br><span class="line">   &#125;  </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="具体的なフィルタリング例"><a href="#具体的なフィルタリング例" class="headerlink" title="具体的なフィルタリング例"></a>具体的なフィルタリング例</h2><p>上記までのアプリケーションコードを Azure Functions にデプロイします。<br><br>また、実行した際の Application Insights のログに対して、下記 KQL クエリで Dependency のログが記録されているかを確認します。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">union requests, traces, dependencies, exceptions</span><br><span class="line">| where timestamp &gt; ago(30d)</span><br><span class="line">| where operation_Id == &#x27;&lt;対象の実行の operation id を入力&gt;&#x27; or customDimensions[&#x27;InvocationId&#x27;] == &#x27;&lt;対象の実行の invocation id を入力&gt;&#x27;</span><br><span class="line">| order by timestamp asc</span><br><span class="line">| project-reorder timestamp, itemType, target, type, sdkVersion, message</span><br></pre></td></tr></table></figure><h3 id="1-すべての-Dependency-ログを送信する場合"><a href="#1-すべての-Dependency-ログを送信する場合" class="headerlink" title="1. すべての Dependency ログを送信する場合"></a>1. すべての Dependency ログを送信する場合</h3><p>Program.cs で <code>AddApplicationInsightsTelemetryProcessor</code> を利用しなければ、すべての Dependency のログが送信されます。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-29f168f8-d4b6-44f8-8c44-e4b5994afac5.png" alt="image-29f168f8-d4b6-44f8-8c44-e4b5994afac5.png"></p><h3 id="2-すべての-Dependency-ログを送信しない場合"><a href="#2-すべての-Dependency-ログを送信しない場合" class="headerlink" title="2. すべての Dependency ログを送信しない場合"></a>2. すべての Dependency ログを送信しない場合</h3><p>ITelemetryProcessor で <code>if (telemetry is DependencyTelemetry dependency)</code> とします。<br><br>下記のように Dependency のログは記録されません。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-36d61019-319b-405b-9e48-8da291d6a5a9.png" alt="image-36d61019-319b-405b-9e48-8da291d6a5a9.png"></p><h3 id="3-特定の-target-のみを送信しない場合"><a href="#3-特定の-target-のみを送信しない場合" class="headerlink" title="3. 特定の target のみを送信しない場合"></a>3. 特定の target のみを送信しない場合</h3><p>ITelemetryProcessor で <code>if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Target == &quot;www.microsoft.com&quot;)</code> とします。<br><br>下記のように Dependency のログのうち “<a href="http://www.microsoft.com/">www.microsoft.com</a>“ を target とするログは記録されません。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-de3c40b8-6688-4733-a720-a0bfd07ed1a6.png" alt="image-de3c40b8-6688-4733-a720-a0bfd07ed1a6.png"></p><p>ITelemetryProcessor で <code>if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Target == &quot;&quot;)</code> とします。<br><br>※ Application Insights 側に送信されると target が Invoke となっているように見えますが、ローカルでは null なので null でフィルタリングします。<br><br>下記のように Dependency ログのうち “Invoke” を target とするログは記録されません。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-4fa9d2fc-ebd6-485a-a5a7-695e1206dfa0.png" alt="image-4fa9d2fc-ebd6-485a-a5a7-695e1206dfa0.png"></p><h3 id="4-特定の-type-のみを送信しない場合"><a href="#4-特定の-type-のみを送信しない場合" class="headerlink" title="4. 特定の type のみを送信しない場合"></a>4. 特定の type のみを送信しない場合</h3><p>ITelemetryProcessor で <code>if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Type == &quot;Http&quot;)</code> とします。<br><br>下記のように Dependency ログのうち “Http” を type とするログは記録されません。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-cf83a03d-2f19-4554-8a16-07b46ea00205.png" alt="image-cf83a03d-2f19-4554-8a16-07b46ea00205.png"></p><p>ITelemetryProcessor で <code>if (telemetry is DependencyTelemetry dependency &amp;&amp; dependency.Type == &quot;InProc&quot;)</code> とします。<br><br>下記のように Dependency ログのうち “InProc” を type とするログは記録されません。</p><p><img src="/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log/image-97cd9549-160a-4740-88ce-94550c3a9c8e.png" alt="image-97cd9549-160a-4740-88ce-94550c3a9c8e.png"></p><h1 id="最後に"><a href="#最後に" class="headerlink" title="最後に"></a>最後に</h1><p>上記の通り、ITelemetryProcessor を用いてフィルタリングを追加することで、特定の target や type のみを Application Insights に送信しないことを実現可能ですが、本番や運用環境でお試しいただく前に、検証環境でお客様想定通りとなるかを確認してご利用いただくようにお願いいたします。<br>また、Application Insights にログを送信しないと、問題発生時のトラブルシューティングが難しくなる場合もございますので、どのログをフィルタリングするかは要検討いただく必要がございます。</p><h2 id="参考リンク"><a href="#参考リンク" class="headerlink" title="参考リンク"></a>参考リンク</h2><ul><li><a href="https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/api-filtering-sampling?tabs=dotnetcore,javascriptwebsdkloaderscript">Application Insights SDK におけるフィルター処理および前処理</a></li></ul><br><br><p>2025 年 07 月 16 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/07/16/Azure-functions-dotnet-isolated-application-insights-filtering-dependency-log.html"/>
    <published>2025-07-15T15:00:00.000Z</published>
    <summary>
      <![CDATA[<hr>
<p>お世話になっております。App Service サポート担当の山村です。いつも Azure Functions（関数アプリ）をご利用いただき誠にありがとうございます。</p>
<p>Azure Functions を使用してサーバーレスアプリケーションを開発・運用]]>
    </summary>
    <title>Azure Functions .NET Isolated（分離ワーカー）モデルで Dependency の一部のログをフィルタリングして Application Insights に送信する方法</title>
    <updated>2026-04-08T05:14:28.270Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="App Service" scheme="https://azure.github.io/jpazpaas/tags/App-Service/"/>
    <category term="Web Apps" scheme="https://azure.github.io/jpazpaas/tags/Web-Apps/"/>
    <category term="App Service Environment" scheme="https://azure.github.io/jpazpaas/tags/App-Service-Environment/"/>
    <content>
      <![CDATA[<p>本記事は 2025 年 4 月 29 日に公開されました <a href="https://azure.github.io/AppService/2025/04/29/Azure-App-Service-Notifications-Improvements.html">Routine Planned Maintenance Notifications Improvements for App Service</a> の日本語訳です。</p><p>2025年4月現在、App Serviceの定期メンテナンス通知に関して大幅な改善を発表できることを嬉しく思います。</p><h1 id="最近の改善点"><a href="#最近の改善点" class="headerlink" title="最近の改善点"></a>最近の改善点</h1><p>App Serviceのお客様体験を向上させるため、メンテナンス通知システムに重要な改善を行いました。この更新は、2022年3月に発表された内容 <a href="https://azure.github.io/AppService/2022/02/01/App-Service-Planned-Notification-Feature.html">Routine Planned Maintenance Notifications for Azure App Service - Azure App Service</a> (日本語訳 <a href="https://azure.github.io/jpazpaas/2023/02/16/Routine-Planned-Maintenance-Notifications-for-Azure-App-Service.html">Azure App Service の計画メンテナンスの事前通知 - Japan PaaS Support Team Blog</a>)をさらに拡張したものです。</p><hr><h1 id="影響を受けたリソース-ブレード"><a href="#影響を受けたリソース-ブレード" class="headerlink" title="影響を受けたリソース ブレード"></a>影響を受けたリソース ブレード</h1><p>主な改善点の1つとして、Azure Service Healthに「影響を受けたリソース」ブレードが導入されました。この新機能により、お客様は影響を受けるApp Serviceプランリソースを正確に確認することができるようになりました。<br>[影響を受けたリソース] ブレードでは、メンテナンスの開始時と終了時の正確なステータス タイムスタンプを提供することで、メンテナンスの進行状況を明確かつ詳細に表示できます。このセルフサービス機能により、お客様はリソースのステータスを個別に追跡できます。</p><p>Azureポータルから確認するには、<strong>ホーム</strong> &gt; <strong>モニター</strong> &gt; <strong>サービス正常性</strong> &gt; <strong>計画メンテナンス</strong> &gt; <strong>問題名を選択</strong> &gt; <strong>影響を受けたリソース</strong> &gt; <strong>詳細情報</strong>　へとアクセスします。</p><p><img src="/jpazpaas/2025/05/07/Azure-App-Service-Notifications-Improvements/MoreInfo1-90c0f7d3-9911-4011-b995-7e20b7b0d69d.png" alt="MoreInfo1-90c0f7d3-9911-4011-b995-7e20b7b0d69d.png"></p><p>ここでは、App Serviceプラン内でアップグレードが行われているリソースとその現在の状態（保留中、開始済み、完了済み）をタイムスタンプ付きで確認できます。</p><p><img src="/jpazpaas/2025/05/07/Azure-App-Service-Notifications-Improvements/MoreInfo2-2c062b64-1a99-4471-b985-2aec9ac20cee.png" alt="MoreInfo2-2c062b64-1a99-4471-b985-2aec9ac20cee.png"></p><h1 id="自動化されたリリースノート"><a href="#自動化されたリリースノート" class="headerlink" title="自動化されたリリースノート"></a>自動化されたリリースノート</h1><p>また、自動化されたリリースノートも実装されました。お客様は、メンテナンス通知内で、最も重要な情報のみを提供する App Service リリース ノートへの自動リンクを受け取るようになりました。これにより、基本的なリリースノートに対する高い需要に対応し、お客様が重要なアップデートにアクセスできるようにします。<a href="https://github.com/Azure/AppService/releases">App Service リリース ノート</a></p><h1 id="ビジネスアワーにおけるのアップグレード停止"><a href="#ビジネスアワーにおけるのアップグレード停止" class="headerlink" title="ビジネスアワーにおけるのアップグレード停止"></a>ビジネスアワーにおけるのアップグレード停止</h1><p>もう 1 つの重要な機能強化は、、ビジネスアワーにおけるの App Service プラン リソースのアップグレードの一時停止です。メンテナンスオペレーションは、午前9時から午後5時までの標準営業時間外に開始するように最適化されています。特定のリージョンで午前 9 時までにリソースがまだアップグレード中である場合、アップグレードは安全な停止ポイントに達するまで続行され、次の重要なステップの前で一時停止し、営業時間が終了するまで待機します。このアプローチにより、ピーク時の顧客のワークロードの中断が最小限に抑えられ、より予測可能なメンテナンス スケジュールが提供されます。</p><br><br><p>2025 年 05 月 07 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/05/07/Azure-App-Service-Notifications-Improvements.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/05/07/Azure-App-Service-Notifications-Improvements.html"/>
    <published>2025-05-06T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>本記事は 2025 年 4 月 29 日に公開されました <a href="https://azure.github.io/AppService/2025/04/29/Azure-App-Service-Notifications-Improvements.html">Ro]]>
    </summary>
    <title>Azure App Service の計画メンテナンス通知の改善</title>
    <updated>2026-04-08T05:14:28.267Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <content>
      <![CDATA[<p>お世話になっております。App Service サポート担当の山村です。いつも Azure Functions（関数アプリ）をご利用いただきましてありがとうございます。</p><p>Azure Functions を使用してサーバーレスアプリケーションを開発・運用する際、アプリケーションや実行状況のログの監視は非常に重要です。<br>Azure Functions では Application Insights と統合することで、これらの監視が可能です。</p><p>本ブログでは、.NET Isolated（分離ワーカー）モデルを例に、<code>Language Worker → Functions Host → Application Insights</code> と <code>Language Worker → Application Insights</code> の 2 種類のログ送信パイプラインの設定方法と注意点、ログ出力結果の違いについて解説します。</p><h1 id="Azure-Functions-のアーキテクチャ概略"><a href="#Azure-Functions-のアーキテクチャ概略" class="headerlink" title="Azure Functions のアーキテクチャ概略"></a>Azure Functions のアーキテクチャ概略</h1><p>Azure Functions では、Functions Host と呼ばれるプロセスと、Language Worker と呼ばれるプロセスが動作しています。</p><p>Functions Host は、HTTP トリガーや Blob トリガーなどのイベント検知や各種ログの記録といった共通処理を担い、Azure Functions のランタイムとして動作する Language Worker へ処理を要求します。 <br>Language Worker は各言語に応じた関数コードを実行するプロセスであり、お客様のアプリケーションコードが実行されます。<br>Azure Functions のアーキテクチャの詳細は、<a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">こちらのブログ</a>をご参照ください。</p><p><img src="/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations/image-47a83b48-dab2-4d99-aaa6-82f19e20635a.png" alt="image-47a83b48-dab2-4d99-aaa6-82f19e20635a.png"></p><h1 id="Application-Insights-へのログ送信フロー"><a href="#Application-Insights-へのログ送信フロー" class="headerlink" title="Application Insights へのログ送信フロー"></a>Application Insights へのログ送信フロー</h1><p>Azure Functions を Application Insights と統合している場合、通常は Language Worker 上で動作するお客様のアプリケーションで書き込まれたログは Functions Host を経由して Application Insights に送信されます。</p><p>ログ送信パイプラインは以下の通りです。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Language Worker → Functions Host → Application Insights</span><br></pre></td></tr></table></figure><p>一方、.NET Isolated（分離ワーカー）モデルおよび Java の場合は、Language Worker 上で動作するアプリケーションから直接 Application Insights へログを送信することが可能です。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">Language Worker → Application Insights</span><br><span class="line">````</span><br><span class="line"></span><br><span class="line"># Language Worker → Functions Host → Application Insights ログ送信パイプラインの構成方法</span><br><span class="line"></span><br><span class="line">現時点では、Visual Studio や VS Code で Azure Functions の .NET Isolated モデルプロジェクトを作成すると、`Language Worker → Functions Host → Application Insights` ログ送信パイプラインとなるようなひな型が作成されます。</span><br><span class="line"></span><br><span class="line">この構成では、以下のようなファイルが生成されます。</span><br><span class="line"></span><br><span class="line">**host.json** &lt;br&gt;</span><br><span class="line">```json</span><br><span class="line">&#123;</span><br><span class="line">  &quot;version&quot;: &quot;2.0&quot;,</span><br><span class="line">  &quot;logging&quot;: &#123;</span><br><span class="line">    &quot;applicationInsights&quot;: &#123;</span><br><span class="line">      &quot;samplingSettings&quot;: &#123;</span><br><span class="line">        &quot;isEnabled&quot;: true,</span><br><span class="line">        &quot;excludedTypes&quot;: &quot;Request&quot;</span><br><span class="line">      &#125;,</span><br><span class="line">      &quot;enableLiveMetricsFilters&quot;: true</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">````</span><br><span class="line"></span><br><span class="line">**Program.cs** &lt;br&gt;</span><br><span class="line">```csharp</span><br><span class="line">using Microsoft.Azure.Functions.Worker.Builder;</span><br><span class="line">using Microsoft.Extensions.Hosting;</span><br><span class="line"></span><br><span class="line">var builder = FunctionsApplication.CreateBuilder(args);</span><br><span class="line"></span><br><span class="line">builder.ConfigureFunctionsWebApplication();</span><br><span class="line"></span><br><span class="line">// Application Insights isn&#x27;t enabled by default. See [https://aka.ms/AAt8mw4](https://aka.ms/AAt8mw4).</span><br><span class="line">// builder.Services</span><br><span class="line">//     .AddApplicationInsightsTelemetryWorkerService()</span><br><span class="line">//     .ConfigureFunctionsApplicationInsights();</span><br><span class="line"></span><br><span class="line">builder.Build().Run();</span><br></pre></td></tr></table></figure><p><strong>.csproj（抜粋）</strong> <br></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">Project</span> <span class="attr">Sdk</span>=<span class="string">&quot;Microsoft.NET.Sdk&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">PropertyGroup</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">TargetFramework</span>&gt;</span>net8.0<span class="tag">&lt;/<span class="name">TargetFramework</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">AzureFunctionsVersion</span>&gt;</span>v4<span class="tag">&lt;/<span class="name">AzureFunctionsVersion</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">OutputType</span>&gt;</span>Exe<span class="tag">&lt;/<span class="name">OutputType</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ImplicitUsings</span>&gt;</span>enable<span class="tag">&lt;/<span class="name">ImplicitUsings</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">Nullable</span>&gt;</span>enable<span class="tag">&lt;/<span class="name">Nullable</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">RootNamespace</span>&gt;</span>_02_logcheck<span class="tag">&lt;/<span class="name">RootNamespace</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">PropertyGroup</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">ItemGroup</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">FrameworkReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.AspNetCore.App&quot;</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- Application Insights isn&#x27;t enabled by default. See [https://aka.ms/AAt8mw4](https://aka.ms/AAt8mw4). --&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &lt;PackageReference Include=&quot;Microsoft.ApplicationInsights.WorkerService&quot; Version=&quot;2.22.0&quot; /&gt; --&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &lt;PackageReference Include=&quot;Microsoft.Azure.Functions.Worker.ApplicationInsights&quot; Version=&quot;2.0.0&quot; /&gt; --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.Azure.Functions.Worker&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;2.0.0&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.Azure.Functions.Worker.Extensions.Http&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;3.2.0&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;2.0.1&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.Azure.Functions.Worker.Sdk&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;2.0.0&quot;</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">ItemGroup</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">Project</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>HTTP トリガー関数の例</strong> <br></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Http;</span><br><span class="line"><span class="keyword">using</span> Microsoft.AspNetCore.Mvc;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Logging;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Company.Function</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">HttpTrigger1</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger&lt;HttpTrigger1&gt; _logger;</span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">HttpTrigger1</span>(<span class="params">ILogger&lt;HttpTrigger1&gt; logger</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            _logger = logger;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        [<span class="meta">Function(<span class="string">&quot;HttpTrigger1&quot;</span>)</span>]</span><br><span class="line">        <span class="function"><span class="keyword">public</span> IActionResult <span class="title">Run</span>(<span class="params">[HttpTrigger(AuthorizationLevel.Anonymous, <span class="string">&quot;get&quot;</span>, <span class="string">&quot;post&quot;</span></span>)] HttpRequest req)</span></span><br><span class="line">        &#123;</span><br><span class="line">            _logger.LogInformation(<span class="string">&quot;C# HTTP trigger function processed a request. (not modify Program.cs)&quot;</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">new</span> OkObjectResult(<span class="string">&quot;Welcome to Azure Functions!&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="Language-Worker-→-Application-Insights-ログ送信パイプラインの構成方法"><a href="#Language-Worker-→-Application-Insights-ログ送信パイプラインの構成方法" class="headerlink" title="Language Worker → Application Insights ログ送信パイプラインの構成方法"></a>Language Worker → Application Insights ログ送信パイプラインの構成方法</h1><p>この構成を実現するには、上記ひな形で作成されたプロジェクトに以下の変更が必要です。</p><p><strong>.csproj の変更</strong> <br><br>必要なパッケージをインストールするために、*.csproj ファイル内で、ひな形作成時に以下の部分がコメントアウトされているので、コメントアウトを外します。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.ApplicationInsights.WorkerService&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;2.22.0&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">PackageReference</span> <span class="attr">Include</span>=<span class="string">&quot;Microsoft.Azure.Functions.Worker.ApplicationInsights&quot;</span> <span class="attr">Version</span>=<span class="string">&quot;2.0.0&quot;</span> /&gt;</span></span><br></pre></td></tr></table></figure><p><strong>Program.cs の変更</strong> <br><br>Program.cs ファイル内で、ひな形作成時に以下の部分がコメントアウトされているので、コメントアウトを外します。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">builder.Services</span><br><span class="line">    .AddApplicationInsightsTelemetryWorkerService()</span><br><span class="line">    .ConfigureFunctionsApplicationInsights();</span><br></pre></td></tr></table></figure><p>このようにすることで、<code>Language Worker -&gt; Application Insights</code> ログ送信パイプラインの構成となります。</p><p>ただし、既定で Application Insights SDK は、Warning とそれより深刻なログのみをキャプチャするようにロガーに指示するログ フィルターが追加されていますので、ILogger の Information レベルも記録されるように、このログフィルターを無効にするように設定します。<br>無効にするためには、サービス構成の一部としてフィルター規則を削除します。<br>Program.cs に下記のように追加すれば実現できます。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Azure.Functions.Worker.Builder;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.DependencyInjection;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Hosting;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Logging;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> builder = FunctionsApplication.CreateBuilder(<span class="keyword">args</span>);</span><br><span class="line"></span><br><span class="line">builder.Services</span><br><span class="line">    .AddApplicationInsightsTelemetryWorkerService()</span><br><span class="line">    .ConfigureFunctionsApplicationInsights();</span><br><span class="line"></span><br><span class="line"><span class="comment">// ここから</span></span><br><span class="line">builder.Logging.Services.Configure&lt;LoggerFilterOptions&gt;(options =&gt;</span><br><span class="line">    &#123;</span><br><span class="line">        LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule =&gt; rule.ProviderName</span><br><span class="line">            == <span class="string">&quot;Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider&quot;</span>);</span><br><span class="line">        <span class="keyword">if</span> (defaultRule <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">null</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            options.Rules.Remove(defaultRule);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line"><span class="comment">// ここまで</span></span><br><span class="line"></span><br><span class="line">builder.Build().Run();</span><br></pre></td></tr></table></figure><h1 id="Application-Insights-へのログ送信のサンプリングの設定等の制御方法の違い"><a href="#Application-Insights-へのログ送信のサンプリングの設定等の制御方法の違い" class="headerlink" title="Application Insights へのログ送信のサンプリングの設定等の制御方法の違い"></a>Application Insights へのログ送信のサンプリングの設定等の制御方法の違い</h1><p>上記のように 2 種類のログ送信パイプラインがありますが、どちらを使用するかによって Application Insights へのログ送信のサンプリングの設定等の制御方法が異なります。<br><code>Language Worker → Functions Host → Application Insights</code> の場合は、host.json に設定し、他方で、<code>Language Worker → Application Insights</code> の場合は、Program.cs に設定します。<br>※ Functions Host 側のログは引き続き host.json で制御されます。</p><h1 id="Application-Insights-に記録されたログの確認"><a href="#Application-Insights-に記録されたログの確認" class="headerlink" title="Application Insights に記録されたログの確認"></a>Application Insights に記録されたログの確認</h1><p><code>Language Worker → Functions Host → Application Insights</code> と <code>Language Worker → Application Insights</code> ログ送信パイプライン設定で作成したアプリケーションをそれぞれ Azure Functions にデプロイし、HTTP トリガーを実行し、Application Insights に記録されたログを確認します。</p><p>HTTP トリガー実行に関するログだけを抽出しました。</p><p>赤枠が <code>Language Worker → Functions Host → Application Insights</code> パイプラインで、HTTP トリガーアプリケーション内で <code>_logger.LogInformation(&quot;C# HTTP trigger function processed a request. (not modify Program.cs)&quot;);</code> として出力したアプリケーションログの sdkVersion を確認すると、4.1038.400.2 となっており、Functions Host のバージョンとなっていることがわかります。<br>つまり、Functions Host の SDK を使用して送信されていることを意味しています。</p><p>一方で、青枠が <code>Language Worker → Application Insights</code> パイプラインで、HTTP トリガーアプリケーション内で <code>_logger.LogInformation(&quot;C# HTTP trigger function processed a request. (modify Program.cs)&quot;);</code> として出力したアプリケーションログの sdkVersion を確認すると、azurefunctions-netiso: 2.0.0 となっており、csproj で指定した Microsoft.Azure.Functions.Worker.ApplicationInsights のバージョンとなっていることがわかります。<br>つまり、Language Worker の Application Insights から送信されていることを意味しています。</p><p><img src="/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations/image-a74ffaa0-b4ee-404e-9137-265962d04856.png" alt="image-a74ffaa0-b4ee-404e-9137-265962d04856.png"></p><p>また、ログ送信元が異なるが故に、ログフォーマットがやや異なる点も留意する必要があります。</p><p><code>Language Worker → Functions Host → Application Insights</code></p><p><img src="/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations/image-74e00ed3-545f-48d3-a794-32bb8ceb8755.png" alt="image-74e00ed3-545f-48d3-a794-32bb8ceb8755.png"></p><p><code>Language Worker → Application Insights</code></p><p><img src="/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations/image-72c790ce-3337-485d-90af-95e48c8d7df9.png" alt="image-72c790ce-3337-485d-90af-95e48c8d7df9.png"></p><hr><hr><h1 id="よくある質問"><a href="#よくある質問" class="headerlink" title="よくある質問"></a>よくある質問</h1><h2 id="Language-Worker-→-Application-Insights-ログ送信パイプライン利用時"><a href="#Language-Worker-→-Application-Insights-ログ送信パイプライン利用時" class="headerlink" title="Language Worker → Application Insights ログ送信パイプライン利用時"></a>Language Worker → Application Insights ログ送信パイプライン利用時</h2><p>Q. <code>host.json</code> でサンプリング設定を無効化したのに、アプリケーション内で出力したログがサンプリングされています。</p><p>A.<br>アプリケーション内で出力したログを Application Insights に送信する際にどの程度サンプリングするかについて、<code>Language Worker → Application Insights</code> ログ送信パイプラインの場合は、host.json ではなく Program.cs で設定します。<br>また、Application Insights ではアダプティブサンプリングが既定で有効となっていますので、Program.cs 内で明示的に無効化しないと、サンプリングされることがあります。<br>下記を Program.cs に記載することで、アプリケーション内で出力したログがサンプリングされないようにできます。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">services.AddApplicationInsightsTelemetryWorkerService(options =&gt;</span><br><span class="line">        &#123;</span><br><span class="line">            options.EnableAdaptiveSampling = <span class="literal">false</span>; <span class="comment">//アダプティブサンプリングを無効化</span></span><br><span class="line">        &#125;);</span><br><span class="line">services.ConfigureFunctionsApplicationInsights();</span><br></pre></td></tr></table></figure><p>参考：<br><a href="https://learn.microsoft.com/ja-jp/previous-versions/azure/azure-monitor/app/sampling-classic-api#turning-off-adaptive-sampling">アダプティブ サンプリングを無効にする</a></p><h2 id="Language-Worker-→-Functions-Host-→-Application-Insights-ログ送信パイプライン利用時"><a href="#Language-Worker-→-Functions-Host-→-Application-Insights-ログ送信パイプライン利用時" class="headerlink" title="Language Worker → Functions Host → Application Insights ログ送信パイプライン利用時"></a>Language Worker → Functions Host → Application Insights ログ送信パイプライン利用時</h2><p>Q. host.json で出力する logLevel を Trace 以上としているのに、アプリケーション内で出力した Debug や Trace レベルのログが Application Insights に記録されません。<br><br><br><br><br>A. Program.cs で builder を作成すると、logLevel の規定値が Information となっているため、Debug や Trace のログが Language Worker で出力されません。<br>それ故、Functions Host にも到達していないので、Application Insights にアプリケーション内で出力した Debug や Trace レベルのログが出力されません。<br>下記を Program.cs に追記することで、アプリケーション内で出力した Debug や Trace レベルのログを Application Insights に記録できます。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">builder.Logging.SetMinimumLevel(LogLevel.Trace);</span><br></pre></td></tr></table></figure><p>なお、Program.cs に上記の設定は入れているが、host.json で logLevel を Trace 以上と設定していない場合 (host.json の logLevel の既定値は Information です) は、Language Worker で出力した Debug や Trace レベルのログが、Functions Host のログ設定によりフィルタリングされ、Application Insights に記録されませんのでこの点もご注意ください。<br>下記は、host.json で logLevel を Trace 以上と設定している例です。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">    &quot;version&quot;: &quot;2.0&quot;,</span><br><span class="line">    &quot;logging&quot;: &#123;</span><br><span class="line">        &quot;logLevel&quot;: &#123;</span><br><span class="line">            &quot;default&quot;: &quot;Trace&quot;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="参考リンク"><a href="#参考リンク" class="headerlink" title="参考リンク"></a>参考リンク</h2><ul><li><a href="https://learn.microsoft.com/ja-jp/azure/azure-monitor/app/worker-service#ilogger-logs">ILogger ログの記録（Worker Service）</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/dotnet-isolated-process-guide?tabs=hostbuilder,windows#application-insights">.NET Isolated プロセスガイド</a></li><li><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/configure-monitoring?tabs=v2">Azure Functions 監視の構成</a></li></ul><br><br><p>2025 年 05 月 07 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/05/07/Azure-functions-dotnet-isolated-application-insights-key-considerations.html"/>
    <published>2025-05-06T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>お世話になっております。App Service サポート担当の山村です。いつも Azure Functions（関数アプリ）をご利用いただきましてありがとうございます。</p>
<p>Azure Functions を使用してサーバーレスアプリケーションを開発・運用する際、]]>
    </summary>
    <title>Azure Functions .NET Isolated（分離ワーカー）モデルで Application Insights を利用する際の注意点</title>
    <updated>2026-04-08T05:14:28.268Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="AI Search" scheme="https://azure.github.io/jpazpaas/tags/AI-Search/"/>
    <content>
      <![CDATA[<p>こんにちは、PaaS Developer チームの陳です。</p><p>AI Search インデックスを作成する際に、選択したアナライザーでドキュメントがどのようにトークナイズされるのかを確認する方法、および正規表現を使用したクエリで検索を行う際の注意点について例を交えて解説します。</p><p>以下のように日本語ドキュメントをクエリで検索したいが、フィルターがうまくかからず期待された結果が返ってこない、なぜですか？</p><p>※フィールドにはデフォルトの standard.lucene アナライザーを使用しています。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;filter&quot;: &quot;not search.ismatch(&#x27;/.* 階層 .*/&#x27;,&#x27;field_1,field_2&#x27;,&#x27;full&#x27;,&#x27;any&#x27;)&quot;</span><br></pre></td></tr></table></figure><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><p>まず、上記のクエリは正規表現を使用しており、フィールド “field_1” と “field_2” に “階層” を含むドキュメントを検索するといった動作となります。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/search/query-lucene-syntax#bkmk_regex">Lucene クエリ構文 - Azure AI Search | Microsoft Learn</a></p><p>ドキュメントをインデックスに保存された際のトークナイズ動作については、ドキュメントをインデックスに保存した時点で、各フィールドに設定されたアナライザーによってトークナイズされてから保存されます。</p><p>たとえば、”階層関係” というドキュメントをそれぞれ、standard.lucene アナライザーのフィールドと、ja.lucene アナライザーのフィールドに保存された場合、</p><p>異なる方法でトークナイズされます。</p><p>具体的にドキュメントは異なるアナライザーによってどのようにトークナイズされるかを確認するには、以下の REST API をご使用ください。<br><br><a href="https://learn.microsoft.com/ja-jp/rest/api/searchservice/indexes/analyze?view=rest-searchservice-2024-07-01&tabs=HTTP">Indexes - Analyze - REST API (Azure Search Service) | Microsoft Learn</a></p><p>ここで上記の REST API を使用して “階層関係” はどのようにトークナイズされたかを見てみましょう。</p><h3 id="standard-lucene-アナライザー"><a href="#standard-lucene-アナライザー" class="headerlink" title="standard.lucene アナライザー"></a>standard.lucene アナライザー</h3><p><img src="/jpazpaas/2025/04/22/ai-search-analyzer-and-queries-using-regular-expression/image-b7a4dfde-b265-4c59-917d-18d09598910b.png" alt="image-b7a4dfde-b265-4c59-917d-18d09598910b.png"></p><p>上記の結果から分かるように、standard.lucene アナライザーは日本語の語彙を考えずに単純な一つ一つの文字（Unicodeでエンコードされた表示）にトークナイズされました。</p><p>では、ja.lucene はどうでしょうか</p><p><img src="/jpazpaas/2025/04/22/ai-search-analyzer-and-queries-using-regular-expression/image-f9410ceb-0119-4368-94cd-938efedb5ec1.png" alt="image-f9410ceb-0119-4368-94cd-938efedb5ec1.png"></p><p>上記の結果から、ja.lucene アナライザーは日本語の語彙を考え、”階層” と “関係” でトークナイズしました。</p><p>ここで先にクエリで正規表現を使用する場合と使用しない場合のトークナイズの動作の違いについて説明します。</p><ol><li><p>クエリで正規表現を使用しない場合、検索語句（ここでは “階層”）はフィールドに設定されているアナライザーによってトークナイズされてから、トークン単位で一致するものはないか検索し、一致するものがあったら、そのドキュメントを結果に返します。</p></li><li><p><strong>クエリで正規表現を使用する場合、検索語句はアナライザーによってトークナイズされず、そのままで検索にかけます</strong>。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/search/search-query-partial-matching#about-partial-term-search">部分的な語句、パターン、特殊文字 - Azure AI Search | Microsoft Learn</a></p></li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">正規表現、ワイルドカード、あいまい検索の場合は、クエリ時にアナライザーは使用されません。 演算子と区切り記号の存在を基にパーサーによって検出されるこれらのクエリ フォームの場合、クエリ文字列は字句解析なしでエンジンに渡されます。 これらのクエリ フォームでは、フィールドに指定されたアナライザーは無視されます。</span><br></pre></td></tr></table></figure><p>そのため、上記に説明した動作から分かるように、standrard.lucene アナライザーは “階層” を “階” と “層” でトークナイズし、正規表現はアナライザーを適用しないので、</p><p>“階層” で検索しても、”階” と “層” はどちらでも一致しないことが分かります。</p><p>この場合は、日本語アナライザー ja.lucene、もしくは ja.microsoft を使用する必要があります。</p><p>それでは、もう一つの例を見てみましょう</p><h1 id="質問"><a href="#質問" class="headerlink" title="質問"></a>質問</h1><p>フィールドに日本語アナライザー ja.microsoft を設定したのに、以下のクエリで検索したら、”階層関係” が含まれているものが取れてしまいます。なぜでしょうか。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#x27;filter&#x27; : &#x27;not search.ismatch&#x27;/.* 階層関係 .*/&#x27;,&#x27;field_1,field_2&#x27;,&#x27;full&#x27;,&#x27;any&#x27;&#x27;</span><br></pre></td></tr></table></figure><h1 id="回答-1"><a href="#回答-1" class="headerlink" title="回答"></a>回答</h1><p>さきほどの説明から、正規表現を使用するときは検索語句がトークナイズされずそのまま検索にかける、”階層関係” は日本語アナライザーによって、”階層” と “関係” にトークナイズされることがわかります。</p><p>そのため、”階層関係” と一致するものはなく、全件返ってくる動作も理解できます。</p><p>さて、この状況では期待された動作にするためには、どうすればいいでしょうか。</p><p>今の状況から、正規表現の部分はトークナイズされず検索されているため、ドキュメントにある “階層関係” の部分もトークナイズされなかったら、正規表現と一致するようになることが分かります。</p><p>そのため、別のアナライザーで “階層関係” を分割しないものがあればよいわけです。</p><p>その要件に合致するのは Keyword アナライザーとなります。<br><br><a href="https://lucene.apache.org/core/6_6_1/analyzers-common/org/apache/lucene/analysis/core/KeywordAnalyzer.html">KeywordAnalyzer (Lucene 6.6.1 API)</a></p><p>Keyword アナライザーはドキュメントを分割せずにそのまあ一つのトークンとして保存します。これを使用すれば正規表現を使用して検索するときも期待された結果になります。</p><p>ただし、Keyword アナライザーを使用することで、逆に正規表現を使用しないクエリで検索すると、トークナイズされた検索語句で分割されていないトークンと一致しなくなるため、使用の場面を考慮してどのアナライザーを使用するかを検討する必要があります。</p><p>※また、正規表現のクエリや正規表現は特にコストがかかります。 高度な検索には非常に便利ですが、正規表現が複雑な場合や大量のデータを検索する場合は特に、実行に多くの処理能力が必要になる場合があります。 これらの要因に寄って、検索待ち時間が長くなる可能性があります。 軽減策として、正規表現を簡略化するか、複雑なクエリをより小さく管理しやすいクエリに分割してみてください。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/search/search-performance-tips#tip-consider-alternatives-to-regular-expression-queries">パフォーマンスに関するヒント - Azure AI Search | Microsoft Learn</a></p>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/04/22/ai-search-analyzer-and-queries-using-regular-expression.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/04/22/ai-search-analyzer-and-queries-using-regular-expression.html"/>
    <published>2025-04-21T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>こんにちは、PaaS Developer チームの陳です。</p>
<p>AI Search インデックスを作成する際に、選択したアナライザーでドキュメントがどのようにトークナイズされるのかを確認する方法、および正規表現を使用したクエリで検索を行う際の注意点について例を交え]]>
    </summary>
    <title>AI Search アナライザーのトークナイズと正規表現による検索の動作について</title>
    <updated>2026-04-08T05:14:28.266Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Azure Resource Manager (ARM)" scheme="https://azure.github.io/jpazpaas/tags/Azure-Resource-Manager-ARM/"/>
    <content>
      <![CDATA[<p>こんにちは、PaaS Developer チームの陳です。</p><p>今回は、Azureサービスをバックアップする、IaC観点でサービスを管理する際のベストプライスを紹介します。</p><p>Azure リソースの設定のバックアップを取る方法がありますか？</p><p>障害等で Azure リソース自体のリストア方法があるか？</p><h1 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h1><p>Azure リソースのバックアップを考える際に、Azure リソースの設定自体をバックアップするのか、それとも Azure リソースに保存されているデータのバックアップをするのかを分けて考える必要があります。</p><p><strong>データのバックアップ</strong>の場合は、ローカルで保存するなどではなく、サービスのパックアップ機能を使用します。</p><h3 id="例："><a href="#例：" class="headerlink" title="例："></a>例：</h3><p>ストレージアカウントのデータバックアップには、冗長性を構成することで、保存機器レベル、またはデータセンターレベルの障害、災害からデータを保護できます。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/storage/common/storage-disaster-recovery-guidance?toc=/azure/storage/blobs/toc.json&bc=/azure/storage/blobs/breadcrumb/toc.json#plan-for-failover">Azure ストレージのディザスター リカバリー計画とフェールオーバー - Azure Storage | Microsoft Learn</a></p><p><strong>リソース設定情報のバックアップ</strong>の場合、ARM テンプレート、または Bicep テンプレート、Terrform テンプレートを活用するのが有効です。</p><p>こちらのテンプレートを管理し、使用してリソースの管理、あるいは更新をしていくことが IaC の考え方となります。</p><p>Azure のリソースの ARM テンプレート、 Bicep テンプレート、Terrform テンプレートのスキーマは以下の公式ドキュメントにあります。<br><br><a href="https://learn.microsoft.com/en-us/azure/templates/">Azure resource reference - Bicep, ARM template &amp; Terraform AzAPI reference | Microsoft Learn</a></p><p>既存リソースの設定情報をバックアップするには、先にリソースの 「テンプレートのエクスポート」 より ARM テンプレートを出力します。</p><p>※以前は ARM テンプレートの出力のみサポートされていましたが、最近 Bicep、Terrform テンプレートの出力もサポートされるようになりました</p><p>ただし、テンプレートのエクスポートはすべてのコンポーネントをエクスポートできなかったり、エクスポートされた情報に欠落がある場合があるため、テンプレートエクスポートする場合はチェックが必要となります。</p><p>上記のテンプレートスキーマを参照しながらチェックする必要があるため、リソースの機能などについて一定程度の理解が必要となります。</p><p><img src="/jpazpaas/2025/04/21/general-perspective-in-IaC/image-6575f3df-6052-4a68-8fc2-9e90323e7f3b.png" alt="image-6575f3df-6052-4a68-8fc2-9e90323e7f3b.png"></p><p>エクスポートされたテンプレートには、人によるチェックや修正が必要であることについて、公式ドキュメントにも以下のような注意書きがあります。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/export-template-portal">Azure portal でテンプレートをエクスポートする - Azure Resource Manager | Microsoft Learn</a></p><p><img src="/jpazpaas/2025/04/21/general-perspective-in-IaC/image-95125f45-ee74-484f-b298-fbc09f8078b1.png" alt="image-95125f45-ee74-484f-b298-fbc09f8078b1.png"></p><p>ARM テンプレートとしてエクスポートした場合、以下の方法で手動で Bicep テンプレートに変換することも可能です。</p><p>ただし、Bicep への逆コンパイルはベストエフォートでのサポートとなり、逆コンパイルは情報が欠落したり、失敗したりする場合があるため、チェックが必要です。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/decompile?tabs=azure-cli#decompile-from-json-to-bicep">JSON Azure Resource Manager テンプレートを Bicep に逆コンパイルする - Azure Resource Manager | Microsoft Learn</a></p><p><img src="/jpazpaas/2025/04/21/general-perspective-in-IaC/image-579ece23-2379-4702-abcf-183550894e50.png" alt="image-579ece23-2379-4702-abcf-183550894e50.png"></p><p>単純なバックアップであれば、テンプレートのエクスポート、チェックを行えば、バックアップ完了となり、リソースのリストアは Azure PowerShell コマンドなどでテンプレートを使用してリソースをデプロイできます。<br><br><a href="https://learn.microsoft.com/ja-jp/powershell/module/az.resources/new-azresourcegroupdeployment?view=azps-0.10.0">New-AzResourceGroupDeployment (Az.Resources) | Microsoft Learn</a></p><p>IaC としてリソースのデプロイなどを管理したい場合は、リソーステンプレートを以下の処理を行います。</p><ol><li>テンプレートエクスポート</li><li>テンプレートチェック</li></ol><p>ここまでは上記内容で説明しました</p><ol start="3"><li>テンプレートのリファクタリング（モジュール化など）</li><li>テスト</li><li>デプロイ</li></ol><p><img src="/jpazpaas/2025/04/21/general-perspective-in-IaC/image-966141ff-85ce-4719-8422-e15e3c2daaf9.png" alt="image-966141ff-85ce-4719-8422-e15e3c2daaf9.png"><br><br><a href="https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/bicep/migrate">Bicep を使用するために Azure リソースと JSON ARM テンプレートを移行する - Azure Resource Manager | Microsoft Learn</a></p><h3 id="リファクタリング"><a href="#リファクタリング" class="headerlink" title="リファクタリング"></a>リファクタリング</h3><p>テンプレートのリファクタリングは、テンプレートの変数などを読みやすく変更したり、コメントを追加してテンプレートの可読性を向上したりすることができます。</p><p>また、複数のリソースといった複雑なシステム構成の場合、個々のリソースをモジュール化することで、主テンプレートに集約することが可能で、管理を簡略化できます。</p><p>Bicep テンプレートはモジュール、ARM テンプレートはリンクされたテンプレートを使用します。</p><h3 id="テスト"><a href="#テスト" class="headerlink" title="テスト"></a>テスト</h3><p>更新したテンプレートでリソースをアップデートする場合、動作の検証が必要となってくるため、いきなり本番環境へのデプロイではなく、</p><p>あらかじめ用意されたテスト環境へデプロイし、動作の検証をすることを推奨します。</p><p>また、実際のデプロイを行わず、デプロイによる変更をプレビューすることも可能ですので、実際にデプロイする前に今回のデプロイで変更された箇所を記録することもいざとなった時に参考となれます。<br><br><a href="https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/deploy-what-if?tabs=azure-powershell">テンプレート デプロイの what-if - Azure Resource Manager | Microsoft Learn</a></p><h3 id="デプロイ"><a href="#デプロイ" class="headerlink" title="デプロイ"></a>デプロイ</h3><p>テンプレートの検証が終わりましたら、実際にデプロイを行います。</p><p>デプロイは、コマンドで実行するか、ポータルで実行できますが、ポータルではファイルのアップロードなどが必要となるため、</p><p>複数のテンプレートでリソースのデプロイを行う場合は、ローカルでのコマンド実行の方が迅速で、便利となります。</p>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/04/21/general-perspective-in-IaC.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/04/21/general-perspective-in-IaC.html"/>
    <published>2025-04-20T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>こんにちは、PaaS Developer チームの陳です。</p>
<p>今回は、Azureサービスをバックアップする、IaC観点でサービスを管理する際のベストプライスを紹介します。</p>
<p>Azure リソースの設定のバックアップを取る方法がありますか？</p>
<]]>
    </summary>
    <title>Azure サービスをバックアップする一般的な考え方</title>
    <updated>2026-04-08T05:14:28.262Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Storage" scheme="https://azure.github.io/jpazpaas/tags/Storage/"/>
    <content>
      <![CDATA[<p>特定の人に対して、BLOB ストレージアカウントの特定のコンテナーにだけ読み書きできるようにしたいのですが、どうすればいいですか。できれば、アクセス許可を与えたコンテナー以外にどのようなコンテナーがあるか、ということも見えないようにしたい。</p><h1 id="解説"><a href="#解説" class="headerlink" title="解説"></a>解説</h1><h2 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h2><p>例としてはシンプルにストレージアカウント内に二つの BLOB コンテナー (con1、con2) があり、con1 配下にある BLOB に対してだけ読み書きできる、という前提にします。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-5eb1a9f5-1ee3-4c1d-b382-9fa4b42e5dbb.png" alt="image-5eb1a9f5-1ee3-4c1d-b382-9fa4b42e5dbb.png"></p><h2 id="回答"><a href="#回答" class="headerlink" title="回答"></a>回答</h2><p>こちらは以下の資料が参考になります。</p><p><a href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/assign-azure-role-data-access?tabs=portal">BLOB データにアクセスするための Azure ロールを割り当てる</a>  </p><p>この資料にあるように結論としては、以下を割り当てます。</p><ul><li>ストレージアカウントレベルでの <strong>閲覧者</strong>ロール</li><li>コンテナーレベルでの<strong>ストレージ BLOB データ共同作成者</strong>などのデータ アクセス ロール</li></ul><p>それぞれ、ロールの割り当てで探すと以下のように出てきます。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-37e4d55b-2146-4435-ba9c-171b2f6a776b.png" alt="image-37e4d55b-2146-4435-ba9c-171b2f6a776b.png"></p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-eb72b557-8d55-4d47-8535-d1335ffa0205.png" alt="image-eb72b557-8d55-4d47-8535-d1335ffa0205.png"></p><p>上記の二つのロールを割り当てたユーザーから、Azure ポータルで該当のストレージアカウントを参照した例を以下に示します。<br>まず、コンテナー自体は両方とも見えます。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-5eb1a9f5-1ee3-4c1d-b382-9fa4b42e5dbb.png" alt="image-5eb1a9f5-1ee3-4c1d-b382-9fa4b42e5dbb.png"></p><p>そして、con1 についてはストレージ BLOB データ共同作成者のロールがあるため、コンテナー内の BLOB が見えます。また、アップロードや削除等もできます。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-cd1d29be-14b9-4ecb-8c57-2c20357b5e62.png" alt="image-cd1d29be-14b9-4ecb-8c57-2c20357b5e62.png"></p><p>一方、con2 については con1 と異なり、コンテナーレベルでBLOB データ共同作成者のロールを割り当てていませんので、コンテナー内の BLOB は見えません。以下のようにエラーが表示されます。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-5f7b1c72-9ac4-4379-8e9a-96b3a608c8cc.png" alt="image-5f7b1c72-9ac4-4379-8e9a-96b3a608c8cc.png"></p><p>ここまでは、正直なところ先述の資料に書いてある通りなのですが、こちらの方法ですとコンテナーの一覧まではストレージアカウントレベルの閲覧者のロールがあることによって見ることはできます。ロールを割り当てていないコンテナーの中身は見えない状況ですが、コンテナーの一覧も該当のユーザーには見せたくない、という場合にできる方法を紹介します。</p><h2 id="他のコンテナーも見せたくない場合に実施できる方法"><a href="#他のコンテナーも見せたくない場合に実施できる方法" class="headerlink" title="他のコンテナーも見せたくない場合に実施できる方法"></a>他のコンテナーも見せたくない場合に実施できる方法</h2><p>Azure ポータルを利用すると、どうしてもストレージアカウントのリソースを表示してからコンテナーをたどる、という手順になり、リソースを表示するために必要な閲覧者ロールの割り当てを消すことはできません。そのため、今回は Storage Explorer を利用します。<br>Azure Storage Explorer は GUI のツールとなり、BLOB の操作などができます。後述の参考ドキュメントのリンクよりダウンロードすることができます。</p><p>そして、実際にやることですが、ストレージアカウントレベルの閲覧者の権限は削除をし、以下の権限だけを該当のユーザーに割り当てます。</p><ul><li>コンテナーレベルでの<strong>ストレージ BLOB データ共同作成者</strong>などのデータ アクセス ロール</li></ul><p>そして、該当のユーザーを利用して、Storage Explorer を用いて接続する手順を以下に示します。</p><p>(1) Storage Explorer から接続するときに、BLOB コンテナーまたはディレクトリ、を選択します。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-d694ca3a-534b-47bc-9842-3d616d2cea21.png" alt="image-d694ca3a-534b-47bc-9842-3d616d2cea21.png"></p><p>(2) OAuth  を使用してサインインする、を選択し、利用するユーザーとサインインするテナントを指定  </p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-86b1596f-fc7b-430e-81af-82cfbcdc4250.png" alt="image-86b1596f-fc7b-430e-81af-82cfbcdc4250.png"></p><p>(3) BLOB  コンテナーまたはディレクトリの URL の欄に、”<a href="https://mystorage0123.blob.core.windows.net/con1%E2%80%9D">https://mystorage0123.blob.core.windows.net/con1”</a> というような URL を指定します。<br>mystorage0123 の部分はストレージアカウント名、con1 の部分はコンテナー名で書き換えてください。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-246ee1ab-f538-4310-802f-d7528b6e092f.png" alt="image-246ee1ab-f538-4310-802f-d7528b6e092f.png"></p><p>上記の手順を実施しますと、以下のように対象のコンテナー(今回は con1) の中身だけを表示し、かつ、別のコンテナーの名前が表示される、ということもございません。</p><p><img src="/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage/image-2f07977d-5e97-4b50-bf84-4a6597925467.png" alt="image-2f07977d-5e97-4b50-bf84-4a6597925467.png"></p><p>閲覧者の権限がないため、接続するストレージアカウント名とコンテナー名は別途該当のユーザーに連携する、という必要がございますが、コンテナーの一覧も見せたくない、というような要件がある場合には、こちらの方法のご利用もご検討いただける内容かと思います。</p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p>上記で利用している Azure Storage Explorer は以下からダウンロードができます。</p><p><a href="https://azure.microsoft.com/ja-jp/products/storage/storage-explorer/?msockid=3e7805faccf567970fad1128cdfa66e6">Azure Storage Explorer</a></p><br><br>   <hr><br><br>    <p>2025 年 4 月 15 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/04/16/Access-control-at-container-level-of-BLOB-storage.html"/>
    <published>2025-04-15T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p>特定の人に対して、BLOB ストレージアカウントの特定のコンテナーにだけ読み書きできるようにしたいのですが、どうすればいいですか。できれば、アクセス許可を与えたコンテナー以外にどのようなコンテナーがあるか、ということも見えないようにしたい。</p>
<h1 id="解説">]]>
    </summary>
    <title>BLOB のコンテナーレベルでのアクセス制御</title>
    <updated>2026-04-08T05:14:28.262Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="トリガー・バインディング シリーズ" scheme="https://azure.github.io/jpazpaas/tags/%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/"/>
    <content>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">BLOB トリガー</a>は、指定された BLOB からファイルを取得し実行される関数です。</p><p>BLOB トリガーは、従来のクラシックな BLOB トリガーと <a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-event-grid-blob-trigger?pivots=programming-language-csharp">Event Grid を用いた BLOB トリガー</a>の 2 種類が利用可能です。<br>前者のクラシックな BLOB トリガーの場合には、ストレージ アカウントの診断設定ログを用いて更新の有無を確認することで BLOB の更新または新規作成を検知し(削除は検知されません)、トリガーの実行を行います。後者の Event Grid を用いた BLOB トリガーの場合には、ストレージ アカウントの変更を Event Grid にて検知しトリガーの実行契機が Event Grid から Azure Functions へ発出されます。<br>どちらのトリガーを利用いただいても BLOB 以外にキューが利用されており、実際に BLOB ファイルを処理する前に一度実行契機となるキュー メッセージが作成された後に BLOB が処理される動作となります。</p><h1 id="作成手順"><a href="#作成手順" class="headerlink" title="作成手順"></a>作成手順</h1><p>BLOB トリガーの作成方法は<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-your-first-function-visual-studio#create-a-function-app-project">チュートリアル</a>で紹介されているテンプレートをご利用ください。チュートリアルでは HTTP トリガーを利用しておりますが、同画面にて BLOB トリガーを選択いただくことができます。</p><h1 id="実行状況をログで確認する"><a href="#実行状況をログで確認する" class="headerlink" title="実行状況をログで確認する"></a>実行状況をログで確認する</h1><h2 id="クラシックな-BLOB-トリガー"><a href="#クラシックな-BLOB-トリガー" class="headerlink" title="クラシックな BLOB トリガー"></a>クラシックな BLOB トリガー</h2><p>BLOB トリガーのポーリング動作をログから確認します。host.json の logging で下記のカテゴリのログを出力するように設定します。デバッグ用となるため、運用状況によって有効&#x2F;無効化を検討ください。</p><p><strong>host.json</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&quot;logging&quot;: &#123;</span><br><span class="line">  &quot;logLevel&quot;: &#123;</span><br><span class="line">    &quot;Azure.Core&quot;: &quot;Trace&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>Application Insights で利用するクエリ</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">traces</span><br><span class="line">| where timestamp &gt; datetime(&quot;yyyy-mm-dd hh:mi&quot;)</span><br><span class="line">| where customDimensions.Category startswith &quot;Azure.Core&quot; or operation_Name =~ &quot;ClassicBLOBTrigger&quot;</span><br><span class="line">| order by timestamp asc</span><br></pre></td></tr></table></figure><p>上記の設定を行った際に記録されるログの例です。<br>トリガーの実行にて、<code>Executing~</code> と <code>Executed~</code> に合わせて <code>Trigger Details:~</code> が記録されており、Queue トリガーのようなログが確認できます。</p><p><strong>トリガーの実行</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-fa9f4f38-d2b9-46e5-b720-c0ea086116a2.png" alt="image-fa9f4f38-d2b9-46e5-b720-c0ea086116a2.png"></p><p>BLOB トリガーを実行するにあたり実行されている API を見ていくと、まずは <a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/list-blobs?tabs=microsoft-entra-id">BLOB の一覧</a>を取得しています。次に、検知された <a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/get-blob-metadata?tabs=microsoft-entra-id">BLOB ファイルのメタデータ</a>を取得しています。再度 BLOB ファイルのメタデータを取得と <a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/lease-container?tabs=microsoft-entra-id">BLOB ファイルのリース取得</a>をしていますが、対象が <code>blobreceipts</code> 配下となっております。<code>blobreceipts</code> 配下には、ETag ごとに BLOB ファイル名が格納されています(黄色が BLOB に対する操作)。</p><p>その後、キューに対して<a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/put-message">メッセージの作成</a>を行い、<a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/get-messages">キューの取得</a>を行っています(緑色がキューに対する操作)。</p><p><strong>ポーリングの動作</strong> </p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-80290d51-78b7-49d9-b08a-275582a75cea.png" alt="image-80290d51-78b7-49d9-b08a-275582a75cea.png"></p><p>Queue に格納されたメッセージの中身をみると、以下の JSON が確認できます。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;Type&quot;: &quot;BlobTrigger&quot;,</span><br><span class="line">  &quot;FunctionId&quot;: &quot;Host.Functions.ClassicBLOBTrigger&quot;,</span><br><span class="line">  &quot;BlobType&quot;: &quot;BlockBlob&quot;,</span><br><span class="line">  &quot;ContainerName&quot;: &quot;samples-workitems&quot;,</span><br><span class="line">  &quot;BlobName&quot;: &quot;testfile.txt&quot;,</span><br><span class="line">  &quot;ETag&quot;: &quot;\&quot;0x204612BCB029720\&quot;&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Event-Grid-を用いた-BLOB-トリガー"><a href="#Event-Grid-を用いた-BLOB-トリガー" class="headerlink" title="Event Grid を用いた BLOB トリガー"></a>Event Grid を用いた BLOB トリガー</h2><p>前述のクラシックな BLOB トリガーの課題を解決するために考案されたのが Event Grid を用いた BLOB トリガーとなります。動作のアイディアは<a href="https://github.com/Azure/azure-sdk-for-net/pull/17137">こちら</a>に記載がございます。また、構成方法は<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/event-grid-how-tos?tabs=v2,portal">Azure Functions で Event Grid トリガーとバインドを使用する方法</a>を参照ください。</p><p>Event Grid を用いた BLOB トリガーの動作をログから確認します。host.json の logging で下記のカテゴリのログを出力するように設定します。デバッグ用となるため、運用状況によって有効&#x2F;無効化を検討ください。</p><p><strong>host.json</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&quot;logging&quot;: &#123;</span><br><span class="line">  &quot;logLevel&quot;: &#123;</span><br><span class="line">    &quot;Azure.Core&quot;: &quot;Trace&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>Application Insights で利用するクエリ</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">traces</span><br><span class="line">| where timestamp &gt; datetime(&quot;yyyy-mm-dd hh:mi&quot;)</span><br><span class="line">| where customDimensions.Category startswith &quot;Azure.Core&quot; or operation_Name =~ &quot;EventGridBLOBTrigger&quot;</span><br><span class="line">| order by timestamp asc</span><br></pre></td></tr></table></figure><p>上記の設定を行った際に記録されるログの例です。<br>トリガーの実行にて、<code>Executing~</code> と <code>Executed~</code> に合わせて <code>Trigger Details:~</code> が記録されており、Queue トリガーのようなログが確認できます。また、実行の直前に BLOB に対するアクセスが確認できます。</p><p><strong>トリガーの実行</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-32bc4445-33b1-4940-bcf8-237fada9b0ec.png" alt="image-32bc4445-33b1-4940-bcf8-237fada9b0ec.png"></p><p>次に BLOB のアップロードからトリガーの実行までの流れを確認していきます。詳細に確認するために今回は <code>ngrok</code> というツールを使い、ローカル環境で実行しています。</p><p><strong>実行までの流れ</strong></p><ol><li>BLOB にファイルが作成されると、Event Grid から Azure Functions のエンドポイント <code>/runtime/webhooks/blobs</code> にリクエストが発出されます。<br>また、<code>ngrok</code> のログを確認すると Event Grid から送られてきたリクエストのペイロードにストレージ アカウントの BLOB ファイルの情報が含まれていることがわかります。</li></ol><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-eff995ff-ce04-4848-9b95-bcd05f30bbd3.png" alt="image-eff995ff-ce04-4848-9b95-bcd05f30bbd3.png"></p><ol start="2"><li>リクエストの受け付け後にキューに対して<a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/put-message">メッセージの作成</a>が行われていることがわかります。</li></ol><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-244315d4-5803-4b33-975a-7ed883728faa.png" alt="image-244315d4-5803-4b33-975a-7ed883728faa.png"></p><p><strong>作成されたキュー メッセージの内容</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-743aa4d4-7a95-4f7c-a312-2fb9ad3e2c5a.png" alt="image-743aa4d4-7a95-4f7c-a312-2fb9ad3e2c5a.png"></p><ol start="3"><li>直後に対象の BLOB が <code>HEAD</code> メソッド参照されていることがわかります。その後にトリガーが実行されていることがわかります。この API は前述でも利用していた <a href="https://learn.microsoft.com/ja-jp/rest/api/storageservices/get-blob-metadata?tabs=microsoft-entra-id">BLOB ファイルのメタデータ</a> となります。</li></ol><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-921d10c7-ab92-42b5-9f0f-51a12463d3a5.png" alt="image-921d10c7-ab92-42b5-9f0f-51a12463d3a5.png"></p><h1 id="並列実行とチューニング"><a href="#並列実行とチューニング" class="headerlink" title="並列実行とチューニング"></a>並列実行とチューニング</h1><h2 id="並列実行の考え方"><a href="#並列実行の考え方" class="headerlink" title="並列実行の考え方"></a>並列実行の考え方</h2><p>公式ドキュメントに記載のある<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-python#memory-usage-and-concurrency">こちら</a>の方法をご参照ください。<code>host.json</code> の <code>maxDegreeOfParallelism</code> によって構成します。<br>実際に試してみると確かに BLOB トリガーの実行中に要求のあった BLOB トリガーは先のトリガーの完了後に実行されていることがわかります。さらにキュー メッセージの作成時刻(<code>InsertedOn</code>)より、キュー メッセージは BLOB トリガーの要求時に作成されていることがわかります。つまり並列実行の制御はキューに対するポーリングを止めることで実現していることがわかります。<br>また、この構成はクラシックな BLOB トリガーと Event Grid を用いた BLOB トリガーで共通となります。 </p><p><strong>クラシックな BLOB トリガーの場合</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-35d09b53-b22f-4295-8756-df255c9a0ee4.png" alt="image-35d09b53-b22f-4295-8756-df255c9a0ee4.png"></p><p><strong>Event Grid を用いた BLOB トリガーの場合</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-a560525d-c1c0-44ed-8f64-ab722c7bc1da.png" alt="image-a560525d-c1c0-44ed-8f64-ab722c7bc1da.png"></p><h1 id="よくお問い合わせいただく動作"><a href="#よくお問い合わせいただく動作" class="headerlink" title="よくお問い合わせいただく動作"></a>よくお問い合わせいただく動作</h1><p>弊サポートにてよくお問い合わせいただく事例について紹介します。</p><h2 id="BLOB-トリガーが遅れて実行された"><a href="#BLOB-トリガーが遅れて実行された" class="headerlink" title="BLOB トリガーが遅れて実行された"></a>BLOB トリガーが遅れて実行された</h2><ul><li>コールドスタートによる遅延</li></ul><p>従量課金プランを利用の場合には、0 インスタンスの状態となることがあります。その状態からの起動は<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/event-driven-scaling?tabs=azure-cli#cold-start">コールドスタート</a>と呼ばれ、何かしらのイベント(BLOB の変更や Event Grid からの HTTP 通信など)を基盤側で検知後に新たにインスタンスを割り当て、アプリケーションの起動を行います。この一連の動作に数分程度時間がかかる場合がありトリガー対象の BLOB のイベント後、数分程度遅延してトリガーが実行されることがございます。<br>もし、こういった実行の開始遅延を少しでも抑制したい場合には、Premium プランや App Service プランの利用を検討ください。</p><ul><li>診断設定ログの出力遅れによる遅延</li></ul><p>クラシックな BLOB トリガーの場合には、ストレージ アカウントの診断設定ログが処理対象の BLOB か否かの判断に利用されます。この診断設定ログの出力が遅れると処理対象の BLOB の判断に時間を要し、トリガー対象の BLOB のイベント後、数分程度遅延してトリガーが実行されることがございます。<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#polling-and-latency">こちら</a> にも注意書きがございます。もし、こういった実行の開始遅延を少しでも抑制したい場合には、Event Grid を用いた BLOB トリガーの利用を検討ください。</p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-3c8ccaea-d824-42c7-ae4d-db41c273c768.png" alt="image-3c8ccaea-d824-42c7-ae4d-db41c273c768.png"></p><h2 id="BLOB-トリガーが実行されなかった"><a href="#BLOB-トリガーが実行されなかった" class="headerlink" title="BLOB トリガーが実行されなかった"></a>BLOB トリガーが実行されなかった</h2><p>前項にもある通りクラシックな BLOB トリガーの場合には、ストレージ アカウントの診断設定ログが処理対象の BLOB か否かの判断に利用されます。しかしながら、この診断設定ログはベストエフォートで作成されており、何かしらの理由で欠落した場合には正しく処理対象の BLOB が認識されないことが有ります。<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python-v2,isolated-process,nodejs-v4,extensionv5&pivots=programming-language-csharp#polling-and-latency">こちら</a> にも注意書きがございます。もし実行されなかった場合には、再度処理対象の BLOB を変更いただき、改めて処理対象とする必要があります。<br><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob/image-dff68c03-84f7-4eca-9461-9ff2a53ca113.png" alt="image-dff68c03-84f7-4eca-9461-9ff2a53ca113.png"></p><h1 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h1><p>本ブログでは BLOB トリガー関数の動作及び作成方法について整理しました。BLOB トリガーのトラブルシューティングの参考になれば幸いです。</p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">Azure Functions（関数アプリ）の内部アーキテクチャ概要や関連する用語について</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">Azure Functions における Azure Blob Storage のトリガーとバインド</a></p><br><br><hr><br><br><p>2025 年 02 月 26 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-blob.html"/>
    <published>2025-02-25T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob?tabs=isolated-process,extensionv5,extens]]>
    </summary>
    <title>Azure Functions トリガー・バインディング シリーズ - BLOB トリガー</title>
    <updated>2026-04-08T05:14:28.248Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="トリガー・バインディング シリーズ" scheme="https://azure.github.io/jpazpaas/tags/%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/"/>
    <content>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-iot?tabs=isolated-process,extensionv5&pivots=programming-language-csharp">IoT Hub トリガー</a>は、指定された IoT Hub からイベントを取得し実行される関数です。</p><p>IoT Hub トリガーは、IoT Hub の Event Hubs 互換エンドポイントを利用してトリガーされ、内部動作は Event Hubs トリガーと同一となります。そのため、詳細については<a href="https://azure.github.io/jpazpaas/2024/02/22/Azure-functions-trigger-and-binding-series-eventhubs.html">こちら</a>を参照ください。</p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">Azure Functions（関数アプリ）の内部アーキテクチャ概要や関連する用語について</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-iot?tabs=isolated-process,extensionv5&pivots=programming-language-csharp">Azure Functions の Azure IoT Hub バインド</a></p><br><br><hr><br><br><p>2025 年 02 月 26 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-iothub.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-iothub.html"/>
    <published>2025-02-25T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-event-iot?tabs=isolated-process,extensionv5&pivots=pr]]>
    </summary>
    <title>Azure Functions トリガー・バインディング シリーズ - IoT Hub トリガー</title>
    <updated>2026-04-08T05:14:28.254Z</updated>
  </entry>
  <entry>
    <author>
      <name>Web Developer Platform WebApps Japan</name>
    </author>
    <category term="Function App" scheme="https://azure.github.io/jpazpaas/tags/Function-App/"/>
    <category term="トリガー・バインディング シリーズ" scheme="https://azure.github.io/jpazpaas/tags/%E3%83%88%E3%83%AA%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%90%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0-%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/"/>
    <content>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">Queue トリガー</a>は、指定されたキューからメッセージを取得し実行される関数です。キューに格納されたメッセージをロックし、処理が成功した場合にはメッセージを削除し、失敗した場合にはメッセージが Queue に戻されます。<br>しかし、Queue メッセージにロック機構はないため、代わりにメッセージごとに可視と不可視の状態を切り替えることで実質的なロックを実現しています。<br>詳細な動作イメージは<a href="https://azure.github.io/jpazpaas/2023/05/15/queuetrigger-visibility-timeout.html">こちら</a>に紹介がございます。</p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue/image-6214a137-3765-4cf9-af58-36a709aee001.png" alt="image-6214a137-3765-4cf9-af58-36a709aee001.png"></p><h1 id="作成手順"><a href="#作成手順" class="headerlink" title="作成手順"></a>作成手順</h1><p>Queue トリガーの作成方法は<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-create-your-first-function-visual-studio#create-a-function-app-project">チュートリアル</a>で紹介されているテンプレートをご利用ください。チュートリアルでは HTTP トリガーを利用しておりますが、同画面にて Queue トリガーを選択いただくことができます。</p><p>また、処理先の Queue 名を、アプリケーション設定に外だしすることができます。C# の例ですが、QueueTrigger の引数で Queue 名を <code>%</code> 括りのアプリケーション設定名とします(上段)。ローカルの実行のため local.settings.json となりますが(下段)、queuename の中身を宣言します。Azure 上の Azure Functions リソースの場合には同項目をアプリケーション設定に設定ください。</p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue/image-254eefd0-66fc-4d2d-96eb-19f907c98879.png" alt="image-254eefd0-66fc-4d2d-96eb-19f907c98879.png"></p><h1 id="実行状況をログで確認する"><a href="#実行状況をログで確認する" class="headerlink" title="実行状況をログで確認する"></a>実行状況をログで確認する</h1><p>Queue トリガーのポーリング動作をログから確認します。host.json の logging で下記のカテゴリのログを出力するように設定します。デバッグ用となるため、運用状況によって有効&#x2F;無効化を検討ください。</p><p><strong>host.json</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&quot;logging&quot;: &#123;</span><br><span class="line">  &quot;logLevel&quot;: &#123;</span><br><span class="line">    &quot;Microsoft.Azure.WebJobs.Extensions.Storage.Common.Listeners.QueueListener&quot;: &quot;Debug&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>Application Insights で利用するクエリ</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">traces</span><br><span class="line">| where timestamp &gt; datetime(&quot;yyyy-mm-dd hh:mi&quot;)</span><br><span class="line">| where customDimensions.Category startswith &quot;Microsoft.Azure.WebJobs.Extensions.Storage.Common.Listeners.QueueListener&quot; or operation_Name =~ &quot;QueueTrigger&quot;</span><br><span class="line">| order by timestamp asc</span><br></pre></td></tr></table></figure><p>上記の設定を行った際に記録されるログの例です。1 行目にて Queue トリガーのリスナー(Queue のポーリング動作)が起動されていることが確認できます。<code>Poll for function &#39;QueueTrigger&#39;~</code> 及び <code>Function &#39;QueueTrigger&#39;~</code> のメッセージが記録され、キューの走査が行われていることがわかります。<br>その後、1 件メッセージが検知されますが、実行時に <code>Trigger Details: MessageId: df4406f3-8449-4cf5-8064-29383fef1336, DequeueCount: 1, InsertedOn: 2024-12-04T05:07:37.000+00:00</code> が記録されており処理するメッセージの ID とデキューカウント、メッセージの格納時刻が確認できます。また、正常終了ではあるものの、メッセージの削除ログは Azure Functions には記録されません。</p><p><strong>ログ出力例</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue/image-397905dd-2367-49cb-978a-4fe2d404cd0b.png" alt="image-397905dd-2367-49cb-978a-4fe2d404cd0b.png"></p><h1 id="並列実行とチューニング"><a href="#並列実行とチューニング" class="headerlink" title="並列実行とチューニング"></a>並列実行とチューニング</h1><h2 id="並列実行の考え方"><a href="#並列実行の考え方" class="headerlink" title="並列実行の考え方"></a>並列実行の考え方</h2><p>Queue トリガーでは、バッチによってまとめてメッセージを取得し、取得したメッセージの中から実行可能なメッセージ数分を並行で処理を行います。パーティションなどの機構はないため、インスタンスごとにバッチの動作と実際に処理されるメッセージを考慮する必要があります。<br><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp#host-json">host.json</a> の構成にもある通り、<strong>1 つの関数につき同時に処理されるメッセージの最大数は、batchSize に newBatchThreshold を加えた値</strong>となります。</p><p>実際にローカルの環境で Queue トリガーを実行した結果が以下のログになります。<code>host.json</code> の変更は行わず、既定値を利用しています。手元環境の論理プロセッサ数は 16 であるため、batchSize:16[個]+newBatchThreshold:16*16&#x2F;2[個]&#x3D;144 並列で動作していることがわかります。</p><p><strong>requests ログ</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue/image-206f8cb0-4f6b-4508-a54a-cd4133f2119d.png" alt="image-206f8cb0-4f6b-4508-a54a-cd4133f2119d.png"></p><p>また、144 並列での実行中には Queue のポーリングが行われないため、<code>Poll for function &#39;QueueTrigger&#39;~</code> 及び <code>Function &#39;QueueTrigger&#39;~</code> のメッセージが記録されないことがわかります。</p><h2 id="シングルトンでの実行"><a href="#シングルトンでの実行" class="headerlink" title="シングルトンでの実行"></a>シングルトンでの実行</h2><p>Queue トリガーである瞬間で 1 つのメッセージしか処理しない構成とするには、<a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp#host-json">host.json</a> にて <code>&quot;batchSize&quot;: 1</code> 及び <code>&quot;newBatchThreshold&quot;: 0</code> とします。<br>ただし、インスタンス上で 1 つのメッセージしか処理しない構成となるため、スケール アウトも制限する必要があります。</p><h1 id="よくお問い合わせいただく動作"><a href="#よくお問い合わせいただく動作" class="headerlink" title="よくお問い合わせいただく動作"></a>よくお問い合わせいただく動作</h1><p>弊サポートにてよくお問い合わせいただく事例について紹介します。</p><h2 id="同じメッセージの処理が-2-回実行された"><a href="#同じメッセージの処理が-2-回実行された" class="headerlink" title="同じメッセージの処理が 2 回実行された"></a>同じメッセージの処理が 2 回実行された</h2><p>Queue トリガーは、正常に実行完了した場合にメッセージが削除されますが、それ以外の場合(例えばプロセスのシャットダウンなど)にはメッセージがキューに戻されることがあります。<a href="https://azure.github.io/jpazpaas/2023/05/15/queuetrigger-visibility-timeout.html#%E6%A4%9C%E8%A8%BC">こちら</a>に詳細な解説がございます。</p><p>実際の動作例を確認します。複数回実行された <code>MessageID</code> を確認すると、<code>DequeueCount</code> が 2 となっていることがわかり、確かに 2 回実行されていると判断できます。また、プロセス ID を確認すると、1 回目の実行と 2 回目の実行で異なっていることがわかります。つまり、1 回目の実行にて処理の完了を示す <code>Executed~</code> が記録されていないことから何かしらの理由で 1 回目の実行が正常に完了しなかったことが考えられます。</p><p><strong>traces ログ</strong></p><p><img src="/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue/image-441371b0-d06f-4b60-9726-1a2bf8534dd4.png" alt="image-441371b0-d06f-4b60-9726-1a2bf8534dd4.png"></p><h1 id="まとめ"><a href="#まとめ" class="headerlink" title="まとめ"></a>まとめ</h1><p>本ブログでは Queue トリガー関数の動作及び作成方法について整理しました。Queue トリガーのトラブルシューティングの参考になれば幸いです。</p><h1 id="参考ドキュメント"><a href="#参考ドキュメント" class="headerlink" title="参考ドキュメント"></a>参考ドキュメント</h1><p><a href="https://azure.github.io/jpazpaas/2023/08/24/azure-functions-words-relative-management.html">Azure Functions（関数アプリ）の内部アーキテクチャ概要や関連する用語について</a></p><p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process,extensionv5,extensionv3&pivots=programming-language-csharp">Azure Functions における Azure Queue storage のトリガーとバインド</a></p><br><br><hr><br><br><p>2025 年 02 月 26 日時点の内容となります。<br><br>本記事の内容は予告なく変更される場合がございますので予めご了承ください。</p><br><br>]]>
    </content>
    <id>https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue.html</id>
    <link href="https://azure.github.io/jpazpaas/2025/02/26/Azure-functions-trigger-and-binding-series-queue.html"/>
    <published>2025-02-25T15:00:00.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-queue?tabs=isolated-process,extensionv5,exten]]>
    </summary>
    <title>Azure Functions トリガー・バインディング シリーズ - Queue トリガー</title>
    <updated>2026-04-08T05:14:28.254Z</updated>
  </entry>
</feed>
