Azure Container Appsで Functions ホスト キー ストレージを構成する

Functions アクセス キー は、Functions ランタイムが HTTP によってトリガーされるエンドポイントをセキュリティで保護するために使用する認証トークンです。 呼び出し元が HTTP 関数を呼び出すと、 ?code= クエリ パラメーターまたは x-functions-key ヘッダーとしてキーが含まれます。 ランタイムはキーを検証し、要求を承認または拒否します。

アクセス キーは、 アプリ レベルのシークレットと同じではありません。 アクセス キーは 関数を呼び出すことができるユーザーを保護しますが、アプリ レベルのシークレットは 関数の接続先を保護します

アクセスキーを使用するタイミング

Scenario アクセスキーが適合する理由
サードパーティのウェブフック GitHub、Stripe、Twilio などのプロバイダーは、URL とシークレットを使用して関数を呼び出します。 アクセスキーは、期待される?code=パターンに直接挿入されます。
サービス間呼び出し バックエンド サービス A は HTTP 経由で関数 B を呼び出します。 内部専用の呼び出しにおいては、Microsoft Entraアプリの登録を設定するよりも、共有キーの方が簡単です。
Event Grid サブスクリプション Event Grid は、プラットフォームが自動的に管理する システム キー を使用して、関数エンドポイントを検証して呼び出します。
開発/テスト認証 開発中は、完全な OAuth/OIDC を構成せずに基本認証を行う必要があります。 アクセス キーは、ID 構成なしで低摩擦の認証ゲートを提供します。
移行の互換性 既存のAzure Functions アプリでは既にアクセス キーが使用されています。 Container Apps に移行する場合は、呼び出し元の中断を回避するために、同じキーベースの認証が必要です。

Note

ユーザー向け API、ゼロトラスト ワークロード、またはユーザーごとの承認シナリオでは、アクセス キーの代わりに Microsoft Entra ID/ OAuth 2.0 を使用します。 アクセス キーは、ID レベルの監査証跡のない共有シークレットです。

[前提条件]

アクセス キーの種類

Functions ランタイムは、次の 4 種類のキーを管理します。

キーの種類 Scope Purpose
マスター キー (_master) 関数アプリ全体 すべての機能と /admin/* 管理エンドポイントへの管理者レベルのアクセス。 取り消すことはできません。回転するのみです。
ホスト キー (default + カスタム) 関数アプリ全体 アプリで HTTP によってトリガーされる関数の呼び出しを承認します。
ファンクション キー (default + カスタム) 単一関数 1 つの特定の関数の呼び出しを承認します。 ホスト キーよりも詳細な制御を提供します。
システム キー 拡張機能エンドポイント Event Grid webhook サブスクリプションやDurable Functionsなどのプラットフォーム拡張機能によって使用されます。 自動的に管理されます。

ストレージ バックエンドを選択する

AzureWebJobsSecretStorageType環境変数を設定して、ランタイムがアクセス キーを保持する場所を制御します。 Azure Container Appsでは、3 つの運用グレードのバックエンドがサポートされます。

バックエンド 値を設定する キーの自動生成 外部依存関係 最適な用途
Container Apps シークレット ストア containerapps いいえ - キーを Container Apps シークレットとしてプロビジョニングします None ほとんどのワークロード (推奨)
Azure Key Vault keyvault いいえ - トリガーの作成を手動で行う Key Vault インスタンス 一元化されたガバナンス、コンプライアンス監査
Azure Blob Storage blob はい ストレージ アカウント レガシ アプリまたは既存の AzureWebJobsStorage アカウント

以下のバックエンドの考慮事項を念頭に置いてください:

  • ランタイムはコンテナアプリの秘密ストレージを自動的に選択しません。 AzureWebJobsSecretStorageTypeを設定しなかったり、認識されない値に設定した場合、FunctionsホストはAzureWebJobsStorage利用可能なときに使うBlob Storageを使用します。
  • ストレージの健康チェックやストレージ依存機能の設定 AzureWebJobsStorage 保持してください。
  • AzureWebJobsSecretStorageTypefiles に設定しないでください。 コンテナアプリのファイルシステムは一時的であるため、このバックエンドに保存された鍵は、アプリがゼロにスケールしたり再起動したり、新しいリビジョンを展開したりすると失われます。

シークレット名のパターン

格納されているキーの名前付け規則は、ストレージ バックエンドによって異なります。

Container Apps シークレット ストアでは、別の規則が使用されます。 Functions ホストは、 /run/secrets/functions-keys/でボリュームマウントされたファイルからキーを読み取ります。 各ファイルは 点線 の名前 ( host.master など) を使用しますが、Container Apps のシークレット名では 小文字の英数字とダッシュのみを使用できます。 シークレット ボリュームをマウントする場合は、Functions ホストで想定される点線のファイル名 (たとえば、pathsecretRef: host-master) にpath: host.master フィールドを明示的に設定する必要があります。 プラットフォームでは、名前の自動変換は実行されません。

キーの種類 Container Apps のシークレット名 (ダッシュ) ボリューム マウント path (ドット)
マスター キー host-master host.master
既定のホスト キー host-function-default host.function.default
カスタム ホスト キー host-function-<name> host.function.<name>
特定の関数の既定の関数キー functions-<functionname>-default functions.<functionName>.default
特定の関数のカスタム関数キー functions-<functionname>-<keyname> functions.<functionName>.<keyName>
システム キー host-systemkey-<extension> host.systemKey.<extension>

Tip

トラブルシューティングを行うときは、バックエンド ストアでこれらのパターンを検索して、キーが正しく構成されていることを確認します。

Container Apps シークレット ストアを構成する

Container Apps シークレット ストアが推奨されるバックエンドです。 キーは Container Apps プラットフォーム内に留まり、外部ストレージやKey Vaultは必要ありません。 Azure Resource Managerアクティビティ ログは、シークレットと環境変数への変更を追跡します。

このバックエンドでは、Functions ホストは、 /run/secrets/functions-keys/でボリュームマウントされたファイルからキーを読み取ります。 ホスト はキーを自動生成しません。 各キーは Container Apps シークレットとして作成する必要があります。プラットフォームでは、ホストが読み取るファイルとしてマウントします。

Important

Container Apps シークレット ストアは、 ホストの観点から読み取り専用です。 ホストはマウントされたキー ファイルを読み取りますが、書き込むことはありません。 必要なキーがない場合、ホストによって自動的に生成されることはありません。

手順 1: ストレージの種類を設定する

  1. Azure ポータルで Functions コンテナー アプリに移動します。

  2. [設定] で、[環境変数] を選択します

  3. [ 追加] を選択し、次の値を入力します。

    財産 価値
    氏名 AzureWebJobsSecretStorageType
    価値 containerapps
  4. [ 保存] を選択し、[ 適用 ] を選択して変更を確定します。

手順 2: アクセス キー シークレットを生成して格納する

キー値を生成し、Container Apps シークレットとして格納します。 少なくとも、 マスター キー既定のホスト キーが必要です。

  1. Functions コンテナー アプリの [設定] で、[シークレット] を選択 します

  2. [ 追加] を選択し、次の値を入力します。

    財産 価値
    氏名 host-master
    Type コンテナアプリのシークレット
    価値 ランダムに生成されたキー値。
  3. [] を選択し、[] を追加します。

  4. ランダムに生成された別の値で host-function-default を繰り返します。

  5. 関数ごとのキーを追加するには、 functions-<functionname>-default (すべて小文字) という名前のシークレットを追加します。

Note

Container Apps シークレット名では、小文字の英数字とダッシュのみを使用できます。 ボリューム構成の path フィールドを、Functions ホストが想定する点線のファイル名 (たとえば、 secretRef: host-masterpath: host.master) に明示的に設定する必要があります。 明示的な pathがないと、ディスク上のファイルは破線の名前を保持し、Functions ホストはキーを見つけることができません。

手順 3: ボリューム マウントを構成する

シークレットをファイルとして /run/secrets/functions-keys/マウントします。

  1. Functions コンテナー アプリの [ アプリケーション] で、[ リビジョンとレプリカ] を選択します。

  2. [ 新しいリビジョンの作成] を選択します

  3. [ スケールとボリューム ] タブの [ ボリューム] で、[ 追加] を選択します。

  4. 次の値を入力します。

    財産 価値
    ボリュームの種類 シークレット
    氏名 functions-keys
  5. シークレットごとに、[ パス ] フィールドを Functions ホストが想定する点線のファイル名に設定します (たとえば、 host-master をパス host.masterに設定し、 host-function-default をパス host.function.defaultに設定します)。

  6. [] を選択し、[] を追加します。

  7. [ コンテナー ] タブで、コンテナーを選択し、[ 編集] を選択します。

  8. [ ボリューム マウント ] タブを選択し、[ 追加] を選択します。

  9. 次の値を入力します。

    財産 価値
    ボリューム名 functions-keys
    マウント パス /run/secrets/functions-keys
  10. [保存] を選択し、[作成] を選択して新しいリビジョンをデプロイします。

手順 4: 確認する

アプリが再起動したら、キーが動作していることを確認します。

az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type hostKey

また、メッセージ Resolved secret storage provider ContainerAppsSecretsRepositoryのアプリ ログを確認することもできます。これは、ホストが Container Apps シークレット ストアを使用されていることを確認します。

鍵を回転させる

キーをローテーションするには、Container Apps シークレットを更新し、アプリを再起動します。

NEW_KEY=$(openssl rand -hex 32)

az containerapp secret set \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --secrets "host-function-default=$NEW_KEY"

az containerapp revision restart \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --revision "<REVISION_NAME>"

Note

すべてのレプリカは、同じマウントされたシークレットを共有します。 再起動後、すべてのレプリカが更新されたキー値を選択します。

Key VaultまたはBlob Storageをストアとして設定してください

Key Vault バックエンドは、アクセス キーをKey Vaultシークレットとして格納し、エンタープライズ レベルの監査とアクセス制御を提供します。

  1. Key Vaultを作成します (ない場合)。

    az keyvault create \
      --name "<KEYVAULT_NAME>" \
      --resource-group "<RESOURCE_GROUP>" \
      --location "<LOCATION>"
    
  2. コンテナー アプリでマネージド ID を有効にします (まだ有効になっていない場合)。

    az containerapp identity assign \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --system-assigned
    
  3. マネージド ID に Key Vault Secrets Officer ロールを付与します。 ランタイムには、キーを作成および管理するための読み取りと書き込みアクセスが必要です。

    PRINCIPAL_ID=$(az containerapp show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --query identity.principalId \
      --output tsv)
    
    KEYVAULT_ID=$(az keyvault show \
      --name "<KEYVAULT_NAME>" \
      --query id \
      --output tsv)
    
    az role assignment create \
      --role "Key Vault Secrets Officer" \
      --assignee "$PRINCIPAL_ID" \
      --scope "$KEYVAULT_ID"
    
  4. ストレージの種類とKey Vault URI を設定します。

    システム割り当て ID の場合:

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net"
    

    ユーザー割り当て ID の場合は、クライアント ID も設定します。

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars \
        "AzureWebJobsSecretStorageType=keyvault" \
        "AzureWebJobsSecretStorageKeyVaultUri=https://<KEYVAULT_NAME>.vault.azure.net" \
        "AzureWebJobsSecretStorageKeyVaultClientId=<USER_ASSIGNED_IDENTITY_CLIENT_ID>"
    
  5. キーを一覧表示してキーの作成をトリガーします。

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    

アクセス キーを管理する

バックエンドに関係なく、次のコマンドを使用して、アクセス キーの一覧表示、作成、削除を行います。

Note

これらの鍵管理操作を実行するために、少なくとも1つのレプリカを稼働させておくこと。

  • すべてのホストキーをリストアップ:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type hostKey
    
  • マスターキーをリストアップ:

    az containerapp function keys list \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-type masterKey
    
  • カスタムホストキーの作成または上書き:

    az containerapp function keys set \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "MyCustomKey" \
      --key-value "<YOUR_KEY_VALUE>" \
      --key-type hostKey
    
  • 特定のキーを表示:

    az containerapp function keys show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "<KEY_NAME>" \
      --key-type hostKey
    
  • ホストキーを削除する:

    az containerapp function keys delete \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --key-name "MyCustomKey" \
      --key-type hostKey
    

アクセス キーを使用して関数を呼び出す

クエリ パラメーターまたは要求ヘッダーとしてキーを渡します。

# Query parameter
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>?code=<HOST_KEY>"

# Header
curl "https://<FUNCTIONS_APP_URL>/api/<FUNCTION_NAME>" \
  -H "x-functions-key: <HOST_KEY>"