Azure Functions でリモート サービスへの接続を構成する

この記事は、Azure Functionsがリモートサービスに接続する方法に関する主要な参考資料です。 接続の種類や認証方法に基づいた具体的な指針を提供します。

Important

可能な限り管理されたIDとMicrosoft Entra IDを使いましょう。 この認証方法は秘密を排除し、最高のセキュリティを提供します。

接続カテゴリ

Azure Functionsの接続は以下の基本的なカテゴリに分類されます:

  • 必要なホスト:機能ホストが動作させるために必要な接続(ストレージや監視など)。
  • バインディング:ホストがあなたのトリガーやバインディングのために管理する接続。
  • クライアント SDK: 独自の関数コード内で作成および管理する接続です。

ヒント

Functionsはまた、管理型コネクタ(プレビュー版)をサポートしており、Office 365、Teams、SharePointなどのサービスと、Connector Namespaceを通じてOAuthやWebhook対応を組み込み接続できます。 詳細については、「Use connectors in Azure Functions」をご覧ください。

Functionsホストは、関数の実行とログの両方をサポートする以下の特定の名前付き接続をアプリに要求しています。

認証方法

Important

可能であれば、接続には管理型アイデンティティを使いましょう。 この方法により秘密は完全に排除されます。 対象サービスがMicrosoft Entra ID認証をサポートしていない場合は、Azure Key Vaultを使って秘密を中央管理してください。 共有秘密はアプリの設定で最後の手段として使うだけです。

Functionsはリモートサービスに接続する際の以下の認証方法をサポートしています:

認証方法 セキュリティ いつ使用するか
マネージド ID 最高 TargetサービスはMicrosoft Entra IDをサポートしています。 管理するシークレットはありません。
Azure Key Vault High サービスはマネージドIDをサポートしていなかったり、ローテーション付きの集中管理が必要な場合もあります。
共有された秘密 レガシーのデフォルトです。 できるだけ早くマネージドIDやKey Vaultに移行しましょう。

記事の冒頭で希望する認証方法を選択すると、詳細な設定ガイダンスが表示されます。

接続の定義

実行時には、関数アプリは以下の場所から環境変数として接続情報にアクセスします:

環境 設定が保存されている場所
Azure アプリケーション設定 (静止時暗号化)
ローカル開発 local.settings.json (暗号化オプション)

どちらの環境でも、設定は環境変数としてコードに露出します。 必要な具体的な設定は 、接続の種類 と選ぶ 認証方法 によって異なります。

Microsoft Entra認証を使ってAzureサービスに接続する場合、使用するアプリの設定は接続されたサービスや、システム割り当てIDかユーザー割り当てIDの認証かによって異なります。

接続に使うアイデンティティには、意図された動作を実行する権限が必要です。 ほとんどのAzureサービスでは、この要件はAzure RBACで役割を割り当てる必要があることを意味します。その役割は組み込みまたはカスタムの権限のいずれかで割り当てられます。 詳しくは「 アイデンティティへの権限付与」をご覧ください。

マネージド ID を使用して関数アプリを構成するチュートリアルについては、ID ベースの接続を使用した関数アプリの作成に関 するチュートリアルを参照してください

アイデンティティベースの接続を使用する際には以下の点を念頭に置いてください:

  • Functions でホストされるアプリでは、ID ベースの接続で マネージド ID を使用します。 システムが割り当てたアイデンティティはアプリ固有のもので、デフォルトで使われます。 しかし、ユーザー割り当てのアイデンティティは、 *__credential*__clientID プロパティも必要とされ、より柔軟で推奨されます。

  • アプリがローカル開発など他のコンテキストで動作する場合、代わりに開発者のアイデンティティが使われます。 詳細は 地域開発 の記事をご覧ください。

  • アイデンティティベースの接続は、Functionsのランタイムバージョン4.x以降でのみサポートされています。 もしFunctionsランタイムのバージョン1.xでレガシーC#アプリを動かしているなら、まず バージョン4.xに移行する必要があります。

デフォルトのストレージアカウント(AzureWebJobsStorage)やその他のホスト必須接続に接続する際、機能アプリで接続文字列の代わりにIDを使うように設定できます。

AzureWebJobsStorageのマネージドアイデンティティサポートはホスティングプランによって異なります:

ホスティング プラン ホストストレージのためのMI Azure Files の要件 レコメンデーション
フレックス消費 完全なサポート None(Azure Filesなし) 心筋梗塞に推奨
専用 (App Service) プラン 完全なサポート なし(動的スケーリングなし) 完全な心筋梗塞、回避策は不要です
消費 ブロブ、キュー、テーブル Key Vault または Azure Files を削除 WEBSITE_AZUREFILESCONNECTIONSTRINGをKey Vaultに保管してください
エラスティックプレミアム ブロブ、キュー、テーブル Key Vault または Azure Files を削除 WEBSITE_AZUREFILESCONNECTIONSTRINGをKey Vaultに保管してください

ホスト要求接続にマネージドIDを使用する前に、以下の制限を考慮してください:

  • Consumption PlanやPremiumプランについては、Azure Files向けに以下の回避策を実装してください:

    • WEBSITE_AZUREFILESCONNECTIONSTRING 接続文字列だけをKey Vaultに保存するのが次に安全な方法です。
    • Azure Filesなしで動作するConsumption PlanまたはPremiumプランアプリを作成しましょう。 Azure Filesなしで動作するとパフォーマンスに影響があります。 詳しくは、「Azure Files を使わずにアプリを作成する」をご覧ください。
  • これらのトリガーは正しく動作するために AzureWebJobsStorage に依存しています:

    • Azure Blob Storage
    • Azure Event Hubs
    • Durable Functions(デフォルト)
    • Timer

    もしアプリがこれらの拡張機能を使っているなら、そのバージョンが管理されたIDもサポートしているか確認してください。

  • AzureWebJobsStorage は、Linux Consumption プランのサーバー側(リモート)ビルドでデプロイ アーティファクトを保持します。 この場合、 外部デプロイメントパッケージからアプリをデプロイし実行する必要があります。

  • 関数アプリの他のコンポーネントはAzureWebJobsStorage接続を再利用することもあり、例えばストレージバインディング拡張やAzure SDKを使って作成されたストレージクライアントなどが含まれます。 マネージドIDを使用する場合は、管理IDをサポートしている場合でも、これらの非ホストコンポーネントに対して新しいアプリケーション設定を作成しましょう。

これらの特定のアプリ設定は、 AzureWebJobsStorageAPPLICATIONINSIGHTS_CONNECTION_STRINGの両方に対するアイデンティティベースのつながりを定義します。

Setting Description
AzureWebJobsStorage__blobServiceUri デフォルトのストレージアカウントにあるBlob StorageのURIです。 ソブリンクラウドやカスタムストレージDNSに必要です。例えば: https://mystorageaccount.blob.contoso.comHTTPS は必須です。
AzureWebJobsStorage__queueServiceUri デフォルトのストレージアカウントにあるキューストレージ用のURIです。 ソブリンクラウドやカスタムストレージDNSに必要です。例えば: https://mystorageaccount.queue.contoso.comHTTPS は必須です。
AzureWebJobsStorage__tableServiceUri デフォルトのストレージアカウントにあるテーブルストレージ用のURIです。 ソブリンクラウドやカスタムストレージDNSに必要です。例えば: https://mystorageaccount.table.contoso.comHTTPS は必須です。
AzureWebJobsStorage__credential 管理ID認証を使用するために managedidentity に設定します。 管理型アイデンティティはホスティング環境で利用可能でなければなりません。
AzureWebJobsStorage__clientId または
AzureWebJobsStorage__managedIdentityResourceId
管理ID認証のためのアクセストークンを取得するために使われる特定のユーザー割り当てIDを返します。 どちらも設定されていない場合は、アプリケーションにシステム割り当ての識別子が使われます。
APPLICATIONINSIGHTS_AUTHENTICATION_STRING Microsoft Entra認証を用いてApplication Insightsへの接続を可能にします。 Authorization=AAD(システム割り当て)またはClientId=<YOUR_CLIENT_ID>;Authorization=AAD(ユーザー割り当て)に設定します。

ダブルアンダースコア値(__)は実行時にコロン(:)として解釈されるため、設定の列は AzureWebJobsStorage オブジェクトのプロパティとして解釈されます。 例えば、以下の AzureWebJobsStorage 接続設定を考えてみましょう。

  • AzureWebJobsStorage__blobServiceUri=https://<STORAGE_ACCOUNT_NAME>.blob.core.windows.net
  • AzureWebJobsStorage__queueServiceUri=https://<STORAGE_ACCOUNT_NAME>.queue.core.windows.net
  • AzureWebJobsStorage__tableServiceUri=https://<STORAGE_ACCOUNT_NAME>.table.core.windows.net
  • AzureWebJobsStorage__credential=managedidentity
  • AzureWebJobsStorage__clientId=<MY_USER_ASSIGNED_IDENTITY_ID>

実行時には、ホストはこれらの設定を複雑な AzureWebJobsStorage 設定として解釈します。

"AzureWebJobsStorage":
{
    "blobServiceUri": "https://<STORAGE_ACCOUNT_NAME>.blob.core.windows.net",
    "queueServiceUri": "https://<STORAGE_ACCOUNT_NAME>.queue.core.windows.net",
    "tableServiceUri": "https://<STORAGE_ACCOUNT_NAME>.table.core.windows.net",
    "credential": "managedidentity",
    "clientId": "<MY_USER_ASSIGNED_IDENTITY_ID>"
}

また、ホストが必要なタスクを実行するために十分な権限を持つために、デフォルトのストレージアカウントでIDの権限を付与する必要があります。 詳細については、「 Grant permissions to a identity(識別子への権限付与)」をご覧ください。

ID に権限を付与する

管理型アイデンティティとMicrosoft Entra ID認証を組み合わせる場合、リモートサービスに接続する際にアプリが使用するアイデンティティに権限を明確に割り当てる必要があります。 アプリに最小権限権限を付与する最も簡単な方法は、組み込みの役割を割り当てることです。

アプリのIDにRBAC権限を与える際には以下の推奨事項を念頭に置いてください:

  • 可能な限り、アイデンティティに最低限必要な特権のみを与えるという 最小特権の原則 を守ってください。 例えば、アプリがデータソースからのみ読み込む必要がある場合は、読み書き権限のみを持つ役割を使いましょう。
  • アプリを動かすためだけでも、 オーナーのような広範な内蔵ロールは使わないでください。
  • 役割割り当てを作成または修正した後、変更が伝播するまでに最大10分かかることがあります。 この期間中、役割が正しく割り当てられていても、あなたの機能が認可エラー(403)を受けることがあります。 ロール割り当てを作成してすぐにエラーが発生した場合は、数分待ってから再試してみてください。
  • 複数の接続が同じサービスへの権限を必要とする場合は、そのサービスへのすべての接続に対して最小限の権限部分集合としての役割を用いてください。
  • いくつかのバインディングは、 AzureWebJobsStorage 接続で必要とされるよりも広い権限をストレージアカウントに要求します。
  • 管理されたIDを使ってKey Vaultの鍵にアクセスするには、アプリをKey Vault Secrets Userロールに割り当ててください。 また、管理IDに「秘密取得」権限を割り当てるために、Key Vaultアクセスポリシーを使うこともできます。 詳細については、アプリ内の ID にキー コンテナーへのアクセス権を付与するを参照してください。
  • この記事では、最低限の権限を提供する 組み込みロール のみを指しています。 アプリの要件によっては、自分で カスタムロールを作成する必要があるかもしれません。

必要な権限は接続の種類によって異なります:

  • AzureWebJobsStorage: ストレージブロブデータオーナー の役割は、ホストが必要とする AzureWebJobsStorage 接続の最小限のストレージアカウント権限を提供します。 この役割は、 最小権限の原則に従いながら、関数ホストが必要とするストレージアクセスレベルを提供します。

    特定の問題タイプでは、Functionsはアプリが起動しなくてもトラブルシューティングを助ける診断イベントを発生させます。 また、診断イベントが永続化されるテーブルストレージへのアクセスを提供する ストレージテーブルデータ貢献 者の役割も追加する必要があります。 これらの追加権限がなければ、ログにこれらのイベントを書き込めない警告が表示されるかもしれません。

    他のいくつかのバインディングでは、もう少し広い役割を使う必要があるかもしれません。 テーブルの「Bindings」タブのホスト要求ストレージ列には、これらの役割要件が記載されています。

  • APPLICATIONINSIGHTS_AUTHENTICATION_STRING: Monitoring Metrics Publisherの役割は、ホストがログ作成のためにApplication Insightsに接続するために必要な最低限の権限を付与します。

注意

APPLICATIONINSIGHTS_AUTHENTICATION_STRING を使用して Microsoft Entra 認証で Application Insights に接続する場合、Application Insights のローカル認証を無効にすることが必要です。 この構成では、テレメトリをワークスペースに取り込むために、Microsoft Entra認証が必要です。

注意

Key Vaultは、現在Microsoft Entra IDをサポートしていない接続とAzure管理IDのみに使ってください。

一部のサービスはまだMicrosoft Entra認証をサポートしていないため、場合によってはアプリがシークレットを必要としている場合があります。 このような場合、Azure Key Vaultはシークレットベースの認証の管理ライフサイクルを効率化するのに役立ちます。 アプリはKey Vaultを使って、デフォルトのストレージアカウント接続文字列を含む共有秘密をより安全に保存・アクセスできます。 接続は共有秘密を使用していますが、Key Vaultは鍵の管理や回転を含め、秘密のセキュリティレベルが高まります。 あなたのアプリは、サービス自体がまだ管理されたIDベースの接続をサポートしていなくても、管理されたIDを使ってKey Vaultに接続できます。

Key Vaultを使う場合は、実際の秘密の代わりにKey Vault参照を使って接続のアプリケーション設定を作成してください。 詳細については、 Key VaultのSourceアプリ設定をご覧ください。

Key Vaultでの接続を維持する際には以下の点を念頭に置いてください:

  • キー コンテナー内のキーにアクセスするには、アプリ内の ID にキー コンテナーへのアクセス権を付与する必要があります。

  • 管理IDベースの接続設定をKey Vaultで保存できます。 アプリがKey Vaultを使う場合、参照は:などの/またはStorage1:blobServiceUriのキー区切りを使わなければなりません。 通常のアプリケーション設定区切り文字を使うと、参照名が正しく解決されません __

エンドツーエンドの完全な例については、チュートリアルをご覧ください:秘密ではなくIDを使ってAzureサービスに接続する関数アプリを作成してください。

AzureWebJobsStorage設定を設定すれば、接続文字列自体を返すのではなく、接続文字列を含むKey Vault参照を返すように設定できます。 方法については、「アプリ設定として Key Vault 参照を使用する」をご覧ください。

Azure Filesは現在マネージドID接続をサポートしていません。 この制限があるため、Key Vaultを使ってWEBSITE_AZUREFILESCONNECTIONSTRING設定を確保してください。これは消費プランとプレミアムプランの両方で動的スケーリングに必要です。 Flex Consumptionプランも動的プランで、Azure Filesを使わず、マネージドID接続を完全にサポートしています。

Caution

共有された秘密に直接関わるのは避けましょう。 可能な限り、接続に対してより安全な認証方法を使用してください。

管理されたアイデンティティとMicrosoft Entra ID認証を組み合わせることで、秘密の喪失や漏洩のリスクを軽減しましょう。 リモートサービスが管理型IDをサポートしていない場合は、少なくとも共有秘密をより安全に管理するAzure Key Vaultを使うべきです。

もしより安全な認証方法が使えない場合、プラットフォームは静止時にアプリケーション設定でデータを暗号化します。 共有秘密の使用から、より安全な認証方法にアプリを移行しましょう。

AzureWebJobsStorage設定でデフォルトのストレージアカウントの接続文字列を設定します。 この設定は関数アプリを作成する際のデフォルトの接続動作です。

SDKクライアント接続の管理

関数コードでクライアントSDK接続を作成する際は、新しいインスタンスを作成するのではなく、インボーケーション間でクライアントインスタンスを再利用してください。 このベストプラクティスはすべてのホスティングプランで遅延を削減し、ソケットの枯渇を防ぎ、リソース効率を向上させます。

クライアントインスタンスの再利用

Azure Functionsアプリケーションでサービス固有クライアントを使用する際は、以下のガイドラインに従ってください:

  • 関数呼び出しごとに新しいクライアントを作成しないでください
  • すべての関数呼び出しが再利用可能な単一の共有クライアントを作成してください
  • 異なる関数が同じサービスを使う場合、ヘルパークラスで単一の共有クライアントを作成することを検討してください。

推奨されるアプローチは言語によって異なります:

依存注入を使ってシングルトンまたはスコープ付きクライアントを登録してください。

各言語の完全なパターンについては クライアントコード例 を参照してください。

消費プランにおける接続制限

注意

本節で述べたハード接続制限は、レガシー 消費プランにのみ適用されます。 フレックスコンシューマープランは同じサンドボックス環境で運用されておらず、これらの制限を課しません。 しかし、最適なパフォーマンスのためにクライアントの再利用は依然として推奨されています。

レガシーのConsumption プランでは、関数アプリは サンドボックス環境 で動作し、インスタンスあたりのアウトバウンド接続数を600件(合計1,200件)に制限しています。 この制限に達すると、Functionsホストはログに次のメッセージを書き込みます: Host thresholds exceeded: Connections。 詳細については、Functions のサービスの制限に関する記事を参照してください。

この制限はインスタンスごとに適用されます。 より多くの要求を処理するために、スケール コントローラーによって関数アプリ インスタンスが追加されると、インスタンスごとに接続の制限が適用されます。 つまり、グローバルな接続制限がなく、すべてのアクティブなインスタンスで600以上のアクティブな接続を持つことができます。

接続問題のトラブルシューティングでは、機能アプリでApplication Insightsが有効になっていることを確認してください。 Application Insights では、実行など、関数アプリのメトリックを表示できます。 詳細については、「Application Insights でテレメトリを表示する」を参照してください。

クライアント コードの例

このセクションでは、関数のコードからクライアントを作成および使用するためのベスト プラクティスを示します。

HTTPリクエスト

依存注入を使って共有 HttpClient を登録し、すべての関数呼び出しが同じインスタンスを再利用できるようにします。 この場合、クライアントを処分する必要はありません。なぜなら、ランタイムがそのライフタイムを管理しているからです。

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace;

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHttpClient();
    }
}

次に関数クラスに IHttpClientFactory または HttpClient を注入します:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace MyNamespace;

public class MyFunction(HttpClient httpClient, ILogger<MyFunction> logger)
{
    [Function("MyFunction")]
    public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
    {
        var response = await httpClient.GetAsync("https://example.com");
        logger.LogInformation("Response status: {Status}", response.StatusCode);
    }
}

Azure Cosmos DB clients

スタートアップでシングルトン のCosmosClient を登録し、すべての関数が1つの接続を共有しるようにしましょう。 Azure Cosmos DBのドキュメントでは、アプリケーションのライフ期間中シングルトンクライアントを使用することを推奨しています。

using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace;

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddSingleton(_ =>
        {
            var connectionString = Environment.GetEnvironmentVariable("CosmosDBConnection");
            return new CosmosClient(connectionString);
        });
    }
}

次に関数クラスに CosmosClient を注入します:

using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;

namespace MyNamespace;

public class MyCosmosFunction(CosmosClient cosmosClient, ILogger<MyCosmosFunction> logger)
{
    private readonly Container _container = cosmosClient.GetContainer("mydb", "mycontainer");

    [Function("MyCosmosFunction")]
    public async Task Run([TimerTrigger("0 */5 * * * *")] TimerInfo timer)
    {
        var item = new { id = "myId", partitionKey = "myPartitionKey", data = "example" };
        await _container.UpsertItemAsync(item, new PartitionKey("myPartitionKey"));
        logger.LogInformation("Item upserted");
    }
}

SqlClient の接続

関数コードでは、SQL リレーショナル データベースに接続するために、.NET Framework Data Provider for SQL Server (SqlClient) を使用できます。 このプロバイダーはまた、Entity FrameworkのようなADO.NETに依存するデータフレームワークの基盤プロバイダーでもあります。 HttpClientDocumentClient の接続とは異なり、ADO.NET は接続プールを既定で実装します。 ただし、それでも接続を使い果たす可能性があるため、データベースへの接続を最適化する必要があります。 詳しくは、「SQL Server の接続プール (ADO.NET)」をご覧ください。

ヒント

Entity Framework などの一部のデータ フレームワークは、通常、構成ファイルの ConnectionStrings セクションから接続文字列を取得します。 その場合は、関数アプリの設定およびローカル プロジェクトの local.settings.json ファイル接続文字列コレクションに、SQL データベースの接続文字列を明示的に追加する必要があります。 関数コードでSqlConnectionのインスタンスを作成する場合は、他の接続と一緒にアプリケーション設定に接続文字列の値を保存してください。

Azure App Configuration

Azure App Configurationは、アプリケーション設定を一元管理するために使えるAzureサービスです。 App Configurationは階層的なキー-値ペアとバージョン管理をサポートし、Azure Key Vaultと連携してより安全な秘密管理を実現します。 詳細については、「Azure App Configuration とは」を参照してください。

セキュリティ向上のために、ファンクションアプリは管理されたアイデンティティとMicrosoft Entra認証を使ってアプリケーションストアの設定にアクセスします。 詳細については、「Use App Configuration references for Azure Functions」をご覧ください。

注意

管理型アイデンティティベースの接続の設定をAzure App Configurationで使用する場合、参照はフォーマット:/または<CONNECTION_NAME_PREFIX>:fullyQualifiedNamespaceのキー区切りを使用しなければなりません。 通常のアプリケーション設定区切り文字を使うと、参照名が正しく解決されません __