Alternative Architecture DOJO

オルターブースのクラウドネイティブ特化型ブログです。

リソースを作成可能なリージョンを限定するAzure Policyの作り方

こんにちは、MLBお兄さんこと松村です。
開幕から好調を維持している我がニューヨーク・ヤンキースは、地区首位のみならず MLB 全体の勝ち星を上げています。(2022/06/12 現在)


5月に開催された Microsoft Build 2022 では、恒例の Cloud Skilling Challenge が行われています。

www.microsoft.com

私は「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 というサービスで設定することができます。
主にはガバナンス目的で、「できること」と「できないこと」を定義していきます。

azure.microsoft.com

リージョンを限定するポリシーを確認する

リソースが作成可能なリージョンを限定するには、 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"
  }
]

docs.microsoft.com

ポリシーを適用する際に listOfAllowedLocations というパラメーターに、選択可能なリージョンを指定します。
なお description にも記載されていますが、このポリシーは下記のリソースには適用されません。

  • リソースグループ
  • グローバルリージョンのサービス
  • Azure Active Directory B2C テナント

ポリシーを割り当てる

では、実際に Azure サブスクリプションに Allowed locations ポリシーを割り当ててみます。
下記の例では東日本リージョン (japaneast) だけを許可します。

docs.microsoft.com

$ 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 を作成しようとすると、ラボ環境と同じエラーメッセージが表示されることが確認できました。