次の方法で共有


Azure App Service と Azure Functions の App Configuration リファレンスを使用する

この記事では、コードを変更せずに、Azure App Service または Azure Functions アプリケーションで構成データを操作する方法について説明します。 Azure App Configuration は、アプリケーション構成を一元的に管理するために使用できる Azure サービスです。 また、時間の経過と同時に、またはリリース間で構成値を監査するための効果的なツールでもあります。

App Configuration へのアクセス権をアプリに付与する

App Service での App Configuration 参照の使用を開始するには、まず App Configuration ストアを作成します。 次に、ストア内の構成キーと値のペアにアクセスするためのアクセス許可をアプリに付与します。

  1. App Configuration ストアを作成するには、 App Configuration クイックスタートを完了します。

  2. アプリケーション用のマネージド ID を作成します。

    App Configuration 参照では、既定でアプリのシステム割り当て ID が使用されますが、 ユーザー割り当て ID を指定できます。

  3. App Configuration ストアへのアクセス許可の正しいセットを ID に付与します。 ストアのロールの割り当てを更新します。 リソースにスコープを設定して、この ID にアプリ構成データ閲覧者ロールを割り当てます。

ユーザー割り当て ID を使用して App Configuration ストアにアクセスする

場合によっては、アプリを作成するときに構成を参照する必要がありますが、システム割り当て ID はまだ使用できません。 このシナリオでは、 App Configuration ストアのユーザー割り当て ID を 事前に作成できます。

ユーザー割り当て ID にアクセス許可を付与したら、次の手順を実行します。

  1. アプリケーションに ID を割り当てます

  2. keyVaultReferenceIdentity プロパティにユーザー割り当て ID のリソース ID を設定することで、この ID を使用して App Configuration 参照操作を行うようにアプリを構成します。 プロパティには名前に keyVault がありますが、ID は App Configuration 参照にも適用されます。 コードは次のとおりです。

    userAssignedIdentityResourceId=$(az identity show -g MyResourceGroupName -n MyUserAssignedIdentityName --query id -o tsv)
    appResourceId=$(az webapp show -g MyResourceGroupName -n MyAppName --query id -o tsv)
    az rest --method PATCH --uri "${appResourceId}?api-version=2021-01-01" --body "{'properties':{'keyVaultReferenceIdentity':'${userAssignedIdentityResourceId}'}}"
    

この構成は、アプリ内のすべての参照に適用されます。

参照されているキー コンテナーへのアクセス権をアプリに付与する

App Configuration には、未加工の構成値を格納するだけでなく、 Azure Key Vault 参照を格納するための独自の形式があります。 App Configuration 参照の値が App Configuration ストアの Key Vault 参照である場合、アプリには、参照で指定されているキー コンテナーにアクセスするためのアクセス許可も必要です。

注意

App Configuration Key Vault の参照 は、 App Service と Azure Functions Key Vault の参照と混同しないでください。 アプリでは、これらの参照の任意の組み合わせを使用できますが、いくつかの重要な違いがあります。 コンテナーをネットワーク制限する必要がある場合、またはアプリを最新バージョンに定期的に更新する必要がある場合は、App Configuration リファレンスを使用するのではなく、App Service と Azure Functions のアプローチを使用することを検討してください。

アプリにキー コンテナーへのアクセス権を付与するには:

  1. App Configuration 参照に使用した ID を特定します。 同じ ID にコンテナーへのアクセスを許可する必要があります。

  2. その ID のアクセス ポリシーを Key Vault に作成します。 このポリシーで "Get" シークレット アクセス許可を有効にします。 マネージド ID と互換性がないため、 承認されたアプリケーション または applicationId 設定を構成しないでください。

参照構文

App Configuration 参照は @Microsoft.AppConfiguration({referenceString}) の形式であり、{referenceString} が次の表に示す値に置き換えられます。

参照文字列の部分 説明
Endpoint = <endpointURL> Endpoint (必須)。 App Configuration リソースの URL。
Key = <myAppConfigKey> Key (必須)。 アプリ設定に割り当てるキーの名前。
Label = <myKeyLabel> Label (省略可能)。 Keyで指定されているキー ラベルの値。

Labelを含む完全な参照の例を次に示します。

@Microsoft.AppConfiguration(Endpoint=https://myAppConfigStore.azconfig.io; Key=myAppConfigKey; Label=myKeyLabel)​

Labelを含まない例を次に示します。

@Microsoft.AppConfiguration(Endpoint=https://myAppConfigStore.azconfig.io; Key=myAppConfigKey)​

サイトの再起動が発生するアプリの構成変更により、App Configuration ストアから参照されているすべてのキーと値のペアが即座に再フェッチされます。

注意

App Configuration でキーと値のペアが更新されている場合、これらの値の自動更新と再フェッチは現在サポートされていません。

App Configuration からのソース アプリケーション設定

アプリケーション設定の値として App Configuration 参照を使用して、サイト構成 設定 ではなく App Configuration に構成データを保持できます。 アプリケーション設定と App Configuration のキーと値のペアは、どちらも保存時に安全に暗号化されます。 一元化された構成管理機能が必要な場合は、App Configuration に構成データを追加します。

アプリ設定に App Configuration 参照を使用するには、設定の値として参照を設定します。 アプリは、通常どおりキーを使用して構成値を参照できます。 コードに変更を加える必要はありません。

ヒント

App Configuration 参照を使用するほとんどのアプリケーション設定は、環境ごとに個別のストアまたはラベルが用意されるように、スロット設定としてマークする必要があります。

Azure Files のマウントに関する考慮事項

アプリでは、WEBSITE_CONTENTAZUREFILECONNECTIONSTRING アプリケーション設定を使用して、Azure Files をファイル システムとしてマウントできます。 この設定には、アプリが正しく起動できることを確認するための追加の検証チェックがあります。 プラットフォームは、Azure Files 内にコンテンツ共有を持つことに依存しており、 WEBSITE_CONTENTSHARE 設定で既定の名前が指定されていない限り、既定の名前を想定しています。 これらの設定を変更する要求の場合、プラットフォームはコンテンツ共有が存在することを検証しようとします。 共有が存在しない場合、プラットフォームは共有の作成を試みます。 コンテンツ共有が見つからないか、作成できない場合、要求はブロックされます。

この設定に App Configuration 参照を使用する場合、プラットフォームが受信要求を処理している間に接続自体を解決できないため、この検証チェックは既定で失敗します。 この問題を回避するには、 WEBSITE_SKIP_CONTENTSHARE_VALIDATION1 に設定して検証をスキップします。 この設定ではすべてのチェックがバイパスされ、コンテンツ共有は自動的に作成されません。 共有が事前に作成されていることを確認する必要があります。

注意事項

検証をスキップし、接続文字列またはコンテンツ共有のいずれかが無効な場合、アプリは正常に起動できないため、HTTP 500 エラーのみが処理されます。

サイトを作成するときに、マネージド ID のアクセス許可が伝達されない場合、または仮想ネットワーク統合が設定されていない場合、コンテンツ共有のマウントが失敗する可能性があります。 必要なセットアップに対応するために、デプロイ テンプレートの後半まで Azure Files のセットアップを先送りすることができます。 詳細については、次のセクションの Azure Resource Manager デプロイを参照してください。 App Service では、Azure Files が設定され、ファイルがコピーされない限り、既定のファイル システムのみが使用されます。 Azure Files がマウントされる前の中間期間にデプロイ試行が行われないようにします。

Azure Resource Manager デプロイ

Azure Resource Manager (ARM) テンプレートを使用してリソースのデプロイを自動化する場合は、App Configuration 参照を機能させるために、特定の順序で依存関係のシーケンスが必要になる場合があります。 そのシナリオでは、サイト定義で siteConfig プロパティを使用する代わりに、アプリケーション設定を独自のリソースとして定義する必要があります。 サイトを使用してシステム割り当て ID が作成されるように、最初にサイトを定義する必要があります。 その後、アクセス ポリシーでマネージド ID が使用されます。

App Configuration 参照がある関数アプリのサンプル テンプレートを次に示します。

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        }
    },
    "variables": {
        "functionAppName": "DemoMBFunc",
        "appConfigStoreName": "DemoMBAppConfig",
        "resourcesRegion": "West US2",
        "appConfigSku": "standard",
        "FontNameKey": "FontName",
        "FontColorKey": "FontColor",
        "myLabel": "Test",
        "App Configuration Data Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '516239f1-63e1-4d78-a4de-a74fb236a071')]"
    },
    "resources": [
        {
            "type": "Microsoft.Web/sites",
            "name": "[variables('functionAppName')]",
            "apiVersion": "2021-03-01",
            "___location": "[variables('resourcesRegion')]",
            "identity": {
                "type": "SystemAssigned"
            },
            //...
            "resources": [
                {
                    "type": "config",
                    "name": "appsettings",
                    "apiVersion": "2021-03-01",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))]"
                    ],
                    "properties": {
                        "WEBSITE_FONTNAME": "[concat('@Microsoft.AppConfiguration(Endpoint=', reference(resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))).endpoint,'; Key=',variables('FontNameKey'),'; Label=',variables('myLabel'), ')')]",
                        "WEBSITE_FONTCOLOR": "[concat('@Microsoft.AppConfiguration(Endpoint=', reference(resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))).endpoint,'; Key=',variables('FontColorKey'),'; Label=',variables('myLabel'), ')')]",
                        "WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true"
                        //...
                    }
                },
                {
                    "type": "sourcecontrols",
                    "name": "web",
                    "apiVersion": "2021-03-01",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]",
                        "[resourceId('Microsoft.Web/sites/config', variables('functionAppName'), 'appsettings')]"
                    ]
                }
            ]
        },
        {
            "type": "Microsoft.AppConfiguration/configurationStores",
            "name": "[variables('appConfigStoreName')]",
            "apiVersion": "2019-10-01",
            "___location": "[variables('resourcesRegion')]",
            "sku": {
                "name": "[variables('appConfigSku')]"
            },
            //...
            "dependsOn": [
                "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]"
            ],
            "properties": {
            },
            "resources": [
                {
                    "type": "keyValues",
                    "name": "[variables('FontNameKey')]",
                    "apiVersion": "2021-10-01-preview",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))]"

                    ],
                    "properties": {
                        "value": "Calibri",
                        "contentType": "application/json"
                    }
                },
                {
                    "type": "keyValues",
                    "name": "[variables('FontColorKey')]",
                    "apiVersion": "2021-10-01-preview",
                    //...
                    "dependsOn": [
                        "[resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))]"

                    ],
                    "properties": {
                        "value": "Blue",
                        "contentType": "application/json"
                    }
                }
            ]
        },
        {
            "scope": "[resourceId('Microsoft.AppConfiguration/configurationStores', variables('appConfigStoreName'))]",
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2020-04-01-preview",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables('App Configuration Data Reader')]",
                "principalId": "[reference(resourceId('Microsoft.Web/sites/', variables('functionAppName')), '2020-12-01', 'Full').identity.principalId]",
                "principalType": "ServicePrincipal"
            }
        }
    ]
}

注意

この例では、ソース管理の展開はアプリケーションの設定によって異なります。 ほとんどのシナリオでは、アプリ設定が非同期的に更新されるため、このシーケンスの安全性は低くなります。 ただし、この例には WEBSITE_ENABLE_SYNC_UPDATE_SITE アプリケーション設定が含まれているため、更新は同期的です。 ソース管理の展開は、アプリケーション設定が完全に更新された後にのみ開始されます。 アプリ設定の詳細については、「 Azure App Service の環境変数とアプリ設定」を参照してください。

App Configuration 参照のトラブルシューティング

参照が正しく解決されない場合は、代わりに参照値が使用されます。 構文 @Microsoft.AppConfiguration(...) を使用する環境変数が作成されます。 アプリケーションが構成値を予期していたため、参照によってエラーが発生する可能性があります。

このエラーは最も一般的に、App Configuration アクセス ポリシーの構成ミスが原因です。 ただし、参照に構文エラーがある場合や、構成キーと値のペアがストアに存在しない場合にも発生する可能性があります。