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などのプラットフォーム拡張機能によって使用されます。 自動的に管理されます。

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

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

Key Vault

Key Vault バックエンドは、二重ダッシュ (--) 規則を使用して、各キーを個々のKey Vault シークレットとして格納します。

キーの種類 シークレット名パターン
マスター キー host--masterKey--master host--masterKey--master
関数キー (既定値) host--functionKey--default host--functionKey--default
関数キー (カスタム) host--functionKey--<name> host--functionKey--MyApiClient
システム キー host--systemKey--<extension> host--systemKey--eventgrid_extension
関数ごとのキー function--<functionName>--<keyName> function--myhttpfunc--default

Blob Storage

Blob Storage バックエンドは、キーを JSON ファイルとして azure-webjobs-secrets BLOB コンテナーに格納します。 すべてのホスト レベルのキー (マスター、ファンクション キー、およびシステム キー) は、1 つの host.json BLOB にまとめて格納されます。 関数ごとのキーは、関数ごとに名前が付けられた個別の BLOB に格納されます。

ブロブパス 内容
<siteSlotName>/host.json JSONファイルにはmasterKeyfunctionKeys、およびsystemKeysが含まれています。
<siteSlotName>/<functionName>.json 特定の関数のキーを含む JSON ファイル

Container Apps シークレット ストア

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

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

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

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

Important

運用ワークロードの場合は、次の順序でバックエンドを使用します。Container Apps シークレット ストア (containerapp) > Azure Key Vault (keyvault) > Azure Blob Storage (blob)。 Container Apps シークレット ストアには外部の依存関係がなく、最も操作が簡単です。

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

Warnung

AzureWebJobsSecretStorageTypefiles に設定しないでください。 Azure Container Appsでは、ファイル システムは ephemeral であるため、files バックエンドと共に格納されたホスト キーは、アプリがゼロにスケーリング、再起動、または新しいリビジョンをデプロイするたびに失われます。 上記の 3 つの運用バックエンドのいずれかを常に使用します。

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
    価値 containerapp
  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

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

Blob Storage の構成

Blob Storage バックエンドを使用すると、ランタイムはアクセス キーを自動生成および管理できます。 このオプションは、 AzureWebJobsStorage 用のストレージ アカウントが既にあり、一元的なガバナンスが不要な場合に使用します。

  1. コンテナー アプリでマネージド ID を有効にします (まだ有効になっていない場合)。

    az containerapp identity assign \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --system-assigned
    
  2. ストレージ アカウントの ストレージ BLOB データ共同作成者 ロールにマネージド ID を付与します。

    PRINCIPAL_ID=$(az containerapp show \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --query identity.principalId \
      --output tsv)
    
    STORAGE_ID=$(az storage account show \
      --name "<STORAGE_ACCOUNT_NAME>" \
      --resource-group "<RESOURCE_GROUP>" \
      --query id \
      --output tsv)
    
    az role assignment create \
      --role "Storage Blob Data Contributor" \
      --assignee "$PRINCIPAL_ID" \
      --scope "$STORAGE_ID"
    
  3. ストレージの種類を設定します。

    az containerapp update \
      --resource-group "<RESOURCE_GROUP>" \
      --name "<FUNCTIONS_APP_NAME>" \
      --set-env-vars "AzureWebJobsSecretStorageType=blob"
    
  4. ランタイムは、次のコールド スタート時にキーを自動生成します。 確認:

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

Key Vault を構成する

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
    

アクセス キーを管理する

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

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

# List the master key
az containerapp function keys list \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-type masterKey

# Create or overwrite a custom host key
az containerapp function keys set \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-name "MyCustomKey" \
  --key-value "<YOUR_KEY_VALUE>" \
  --key-type hostKey

# Show a specific key
az containerapp function keys show \
  --resource-group "<RESOURCE_GROUP>" \
  --name "<FUNCTIONS_APP_NAME>" \
  --key-name "<KEY_NAME>" \
  --key-type hostKey

# Delete a host key
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>"