カスタム制約の作成と管理
このページでは、GKE on Azure 環境でカスタム制約を有効にして使用する方法について説明します。 Google Cloudの組織のポリシー サービスを使用すると、リソース構成を管理し、クラウド環境にガードレールを作成できます。
概要
カスタム組織のポリシーを使用すると、GKE Multi-Cloud 環境全体で詳細なリソース ポリシーを作成して、組織の特定のセキュリティとコンプライアンスの要件を満たすことができます。ドライラン モードで組織のポリシーを作成して、本番環境のワークロードに影響を与えることなく新しいポリシーをテストすることもできます。
組織のポリシーの詳細については、組織ポリシー サービスの概要をご覧ください。
始める前に
始める前に、次のトピックについて理解しておきましょう。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、組織にポリシーを適用した場合、 Google Cloud はその組織内のすべてのプロジェクトにそのポリシーを適用します。ポリシーの継承と評価ルールの変更方法の詳細については、階層評価ルールをご覧ください。
制限事項
カスタム制約を作成する前に、次の制限事項に注意してください。
- カスタム制約は、GKE on Azure リソースの
CREATE
メソッドまたはUPDATE
メソッドにのみ適用できます。 - 新しく適用されたカスタム制約は、既存のリソースに自動的に適用されません。制約を適用するには、既存のリソースを更新する必要があります。更新が必要な既存のリソースを確認するには、組織のポリシーのドライランを実行します。
- 制約を作成して組織のポリシーを適用するには、 Google Cloud 組織の組織ポリシー管理者(
roles/orgpolicy.policyAdmin
)の IAM ロールが必要です。カスタム制約を使用して組織のポリシーを管理するために必要な権限の詳細については、必要なロールをご覧ください。
料金
組織のポリシーとカスタム制約に対して料金は発生しません。
カスタム制約を作成する
カスタム制約は、AzureCluster、AzureNodepool、AzureClient API リソース仕様のフィールドを使用して指定する必要があります。ただし、「出力専用」と説明されているフィールドは除きます。カスタム制約を作成する
新しいカスタム制約を作成するには、YAML ファイルで制約を定義し、Google Cloud CLI を使用して組織にカスタム制約を適用します。この制約には、GKE on Azure リソース全体に適用する特定のポリシーをカプセル化する必要があります。
クラスタのカスタム制約を定義する YAML ファイルを作成します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- gkemulticloud.googleapis.com/AzureCluster
methodTypes:
- CREATE
condition: CONDITION
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
ノードプールにカスタム制約を定義するには、次の YAML 構成を使用します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- gkemulticloud.googleapis.com/AzureNodePool
methodTypes:
- CREATE
condition: CONDITION
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
次のように置き換えます。
ORGANIZATION_ID
: 組織 ID(123456789
など)。CONSTRAINT_NAME
: 新しいカスタム制約の名前。カスタム制約はcustom.
で始まる必要があり、大文字、小文字、数字のみを含めることができます。例:custom.allowClusterCreateIfAnnotationPresent
。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例:organizations/123456789/customConstraints/custom
)。CONDITION
: Google Cloud リソースの表現に対して書き込まれる条件。条件は Common Expression Language(CEL)で記述します。このフィールドの最大長は 1,000 文字です。たとえば、条件は"key" in resource.annotations && resource.annotations.key == "created-by"
です。ACTION
: 条件が満たされている場合に実行するアクション。ALLOW
またはDENY
になります。DISPLAY_NAME
: 制約の表示名。このフィールドの最大長は 200 文字です。DESCRIPTION
: ポリシー違反時にエラー メッセージとして表示される制約の説明。たとえば、「"Allow new clusters only when certain annotations are set."
」のようにわかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。
カスタム制約の作成方法については、カスタム制約の定義をご覧ください。
制約をリソースに関連付ける
新しいカスタム制約の YAML ファイルを作成したら、制約を組織のポリシーで使用できるように設定する必要があります。
カスタム制約を設定するには、
gcloud org-policies set-custom-constraint
コマンドを使用します。gcloud org-policies set-custom-constraint PATH_TO_FILE
PATH_TO_FILE
は、カスタム制約の YAML 定義のパスに置き換えます。カスタム制約が作成されたことを確認するには、
gcloud org-policies list-custom-constraints
コマンドを使用します。gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
出力には、作成されたポリシーが一覧表示されます。
CUSTOM_CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent ACTION_TYPE: ALLOW METHOD_TYPES: CREATE RESOURCE_TYPES: gkemulticloud.googleapis.com/AzureCluster DISPLAY_NAME: Allow new clusters only when certain annotations are set.
カスタム制約を適用する
新しいカスタム制約を適用するには、制約を参照する組織のポリシーを作成してから組織のポリシーを適用します。
組織のポリシーの YAML ファイルを作成します。
name: RESOURCE_HIERARCHY/policies/POLICY_NAME spec: rules: - enforce: true
次のように置き換えます。
RESOURCE_HIERARCHY
: 新しいポリシーのロケーション。これは適用範囲に影響します。 Google Cloud リソース階層をガイドとして使用してください。たとえば、特定のプロジェクトにポリシーを適用する場合は、projects/
PROJECT_ID
を使用します。特定の組織にポリシーを適用する場合は、organizations/
ORGANIZATION_ID
を使用します。POLICY_NAME
: 新しいポリシーの名前。
ポリシーを適用します。
gcloud org-policies set-policy PATH_TO_POLICY
PATH_TO_POLICY
は、ポリシー定義ファイルのパスに置き換えます。ポリシーが存在することを確認します。
gcloud org-policies list --RESOURCE_FLAG=RESOURCE_ID
次のように置き換えます。
RESOURCE_FLAG
: ポリシーを適用した Google Cloud リソース。たとえば、プロジェクトや組織などです。RESOURCE_ID
: ポリシーを適用したリソースの ID。たとえば、プロジェクト ID や組織 ID などです。
出力は次のようになります。
CONSTRAINT: custom.allowClusterCreateIfAnnotationPresent LIST_POLICY: - BOOLEAN_POLICY: SET ETAG: CPjb27wGEOijhL4B-
ポリシーのテスト
制限付きプロジェクトに新しい Azure クラスタを作成して、組織のポリシーをテストします。
制限付きプロジェクトに Azure クラスタを作成します。
gcloud container azure clusters create CLUSTER_NAME \ --location GOOGLE_CLOUD_LOCATION \ --fleet-project FLEET_PROJECT \ --azure-tenant-id "${TENANT_ID}" \ --azure-application-id "${APPLICATION_ID}" \ --azure-region AZURE_REGION \ --pod-address-cidr-blocks POD_CIDR \ --service-address-cidr-blocks SERVICE_CIDR \ --vm-size VM_SIZE \ --cluster-version 1.31.1-gke.1800 \ --ssh-public-key "$SSH_PUBLIC_KEY" \ --resource-group-id "$CLUSTER_RG_ID" \ --vnet-id "$VNET_ID" \ --subnet-id "$SUBNET_ID" # Optional, see following note \ --tags "control-plane=CLUSTER_NAME" \ --admin-users ADMIN_USERS_LIST
出力は次のようになります。
FAILED_PRECONDITION: Operation denied by org policy on resource 'projects/PROJECT_NUMBER/locations/GOOGLE_CLOUD_REGION': ["customConstraints/custom.allowClusterCreateIfAnnotationPresent": "Allow new clusters only when certain annotations are set."] '@type': type.googleapis.com/google.rpc.ErrorInfo domain: googleapis.com metadata: customConstraints: customConstraints/custom.allowClusterCreateIfAnnotationPresent service: gkemulticloud.googleapis.com reason: CUSTOM_ORG_POLICY_VIOLATION