こんにちは、MLBお兄さんこと松村です。
開幕から好調を維持している我がニューヨーク・ヤンキースは、地区首位のみならず MLB 全体の勝ち星を上げています。(2022/06/12 現在)
5月に開催された Microsoft Build 2022 では、恒例の Cloud Skilling Challenge が行われています。
私は「Azure Cosmos DB Developer Challenge」という課題を進めていますが、Microsoft Learn が用意するラボ環境でテキストを進めるケースがあります。
そのラボ環境で Cosmos DB のリソースを東日本リージョンに作成しようとした際、このようなエラーが表示されました。(画像の赤枠部分)
Policy enforcement. Value does not meet requirements on resource: Microsoft.DocumentDB/databaseAccounts The field 'Location' with the value '(Asia Pacific) Japan East' is denied: Policy e56962a6-4747-49cd-b67b-bf8b01975c4c details
Cosmos DB のリソースは東日本リージョンに作成できないポリシーが適用されている、という内容ですね。
まぁ、ラボ環境なので色々制約があるんだなーとは思いますが、どのようにして制御しているのか気になりますよね。
Azure Policy
こういった制限は Azure Policy というサービスで設定することができます。
主にはガバナンス目的で、「できること」と「できないこと」を定義していきます。
リージョンを限定するポリシーを確認する
リソースが作成可能なリージョンを限定するには、 Allowed locations
というポリシーを割り当てることで構成することができます。
Allowed locations
というポリシーは、 Azure Policy に元々用意されているポリシーです。(ビルトインポリシー)
Azure CLI で Allowed locations
ポリシーの構成を見てみましょう。
$ az policy definition list --query "[?displayName=='Allowed locations']" [ { "description": "This policy enables you to restrict the locations your organization can specify when deploying resources. Use to enforce your geo-compliance requirements. Excludes resource groups, Microsoft.AzureActiveDirectory/b2cDirectories, and resources that use the 'global' region.", "displayName": "Allowed locations", "id": "/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c", "metadata": { "category": "General", "version": "1.0.0" }, "mode": "Indexed", "name": "e56962a6-4747-49cd-b67b-bf8b01975c4c", "parameters": { "listOfAllowedLocations": { "allowedValues": null, "defaultValue": null, "metadata": { "additionalProperties": null, "assignPermissions": null, "description": "The list of locations that can be specified when deploying resources.", "displayName": "Allowed locations", "strongType": "location" }, "type": "Array" } }, "policyRule": { "if": { "allOf": [ { "field": "location", "notIn": "[parameters('listOfAllowedLocations')]" }, { "field": "location", "notEquals": "global" }, { "field": "type", "notEquals": "Microsoft.AzureActiveDirectory/b2cDirectories" } ] }, "then": { "effect": "deny" } }, "policyType": "BuiltIn", "systemData": null, "type": "Microsoft.Authorization/policyDefinitions" } ]
ポリシーを適用する際に listOfAllowedLocations
というパラメーターに、選択可能なリージョンを指定します。
なお description にも記載されていますが、このポリシーは下記のリソースには適用されません。
- リソースグループ
- グローバルリージョンのサービス
- Azure Active Directory B2C テナント
ポリシーを割り当てる
では、実際に Azure サブスクリプションに Allowed locations
ポリシーを割り当ててみます。
下記の例では東日本リージョン (japaneast) だけを許可します。
$ az policy assignment create \ --name AllowJapanEastPolicy \ --policy e56962a6-4747-49cd-b67b-bf8b01975c4c \ --params "{ \"listOfAllowedLocations\": { \"value\": [\"japaneast\"] } }" \ --scope /subscriptions/$SUBSCRIPTION { "description": null, "displayName": null, "enforcementMode": "Default", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx38a1/providers/Microsoft.Authorization/policyAssignments/AllowJapanEastPolicy", "identity": null, "location": "japaneast", "metadata": { "createdBy": "27c09d4a-74aa-4a37-b887-33d7ff4e6f6e", "createdOn": "2022-06-12T07:49:55.0058908Z", "updatedBy": null, "updatedOn": null }, "name": "AllowJapanEastPolicy", "nonComplianceMessages": null, "notScopes": null, "parameters": { "listOfAllowedLocations": { "value": [ "japaneast" ] } }, "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/e56962a6-4747-49cd-b67b-bf8b01975c4c", "scope": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx38a1", "systemData": { "createdAt": "2022-06-12T07:49:54.965212+00:00", "createdBy": "xxxx@xxxx.co.jp", "createdByType": "User", "lastModifiedAt": "2022-06-12T07:49:54.965212+00:00", "lastModifiedBy": "xxxx@xxxx.co.jp", "lastModifiedByType": "User" }, "type": "Microsoft.Authorization/policyAssignments" }
※サブスクリプション ID やメールアドレスはマスクしています。
動作確認
ポリシーを適用した Azure サブスクリプションにて、東日本リージョン以外で Cosmos DB を作成しようとすると、ラボ環境と同じエラーメッセージが表示されることが確認できました。