このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。
clouddeploy.googleapis.com/Automation
clouddeploy.googleapis.com/CustomTargetType
clouddeploy.googleapis.com/DeliveryPipeline
clouddeploy.googleapis.com/DeployPolicy
clouddeploy.googleapis.com/Release
clouddeploy.googleapis.com/Rollout
clouddeploy.googleapis.com/Target
組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。
組織のポリシーと制約について
Google Cloud 組織のポリシー サービスを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud リソース階層内のGoogle Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織、フォルダ、プロジェクトのいずれかの単位で適用できます。
組織のポリシーを利用することで、あらかじめ用意されたマネージド制約をさまざまな Google Cloud サービスに適用できます。ただし、組織のポリシーで制限されている特定の項目をより細かくカスタマイズして制御したい場合は、カスタム制約を作成して、それを組織のポリシーで使うこともできます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、 Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Verify that billing is enabled for your Google Cloud project.
-
Install the Google Cloud CLI.
-
外部 ID プロバイダ(IdP)を使用している場合は、まずフェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
- 組織 ID を確認します。
ORGANIZATION_ID
: 組織 ID(123456789
など)。CONSTRAINT_NAME
: 新しいカスタム制約に付ける名前。カスタム制約はcustom.
で始まる必要があり、大文字、小文字、数字のみを含めることができます。例:custom.enableGkeTargets
。このフィールドの最大長は 70 文字です。RESOURCE_NAME
: 制限するオブジェクトとフィールドを含むGoogle Cloud リソースの完全修飾名。例:clouddeploy.googleapis.com/clouddeploy.googleapis.com/Target
CONDITION
: サポート対象のサービス リソースの表現に対して書き込まれる CEL 条件。このフィールドの最大長は 1,000 文字です。条件の書き込み先として使用できるリソースの詳細については、サポート対象のリソースをご覧ください。例:"has(resource.gke)"
ACTION
:condition
が満たされている場合に実行するアクション。有効な値はALLOW
とDENY
です。DISPLAY_NAME
: 制約の名前。わかりやすい名前を入力してください。このフィールドの最大長は 200 文字です。DESCRIPTION
: ポリシー違反時にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。- Google Cloud コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[Override parent's policy] を選択します。
- [ルールを追加] をクリックします。
- [適用] セクションで、この組織のポリシーの適用を有効にするかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグ付きの組織のポリシーの設定をご覧ください。
- [変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートします。以前のマネージド制約ではポリシー シミュレーションを使用できません。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最大 15 分かかります。
-
PROJECT_ID
: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME
: カスタム制約に定義した名前。たとえば、custom.enableGkeTargets
のようにします。 - 組織の ID
- プロジェクト ID
次のファイルに
constraint-enable-gke-targets.yaml
という名前を付けて保存します。name: organizations/ORGANIZATION_ID/customConstraints/custom.enableGkeTargets resourceTypes: - clouddeploy.googleapis.com/Target methodTypes: - CREATE - UPDATE condition: "has(resource.gke)" actionType: ALLOW displayName: Enable the creation and update of GKE targets description: All new targets must be GKE clusters.
これにより、作成された新しいターゲットごとに、ターゲット タイプが GKE クラスタでない場合にオペレーションが拒否される制約が定義されます。
制約を適用します。
gcloud org-policies set-custom-constraint ~/constraint-enable-gke-targets.yaml
制約が存在することを確認します。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
出力は次のようになります。
CUSTOM_CONSTRAINT ACTION_TYPE METHOD_TYPES RESOURCE_TYPES DISPLAY_NAME custom.enableGkeTargets ALLOW CREATE,UPDATE clouddeploy.googleapis.com/Target Enable the creation of GKE targets ...
次のファイルに
policy-enable-gke-targets.yaml
という名前を付けて保存します。name: projects/PROJECT_ID/policies/custom.enableGkeTargets spec: rules: - enforce: true
PROJECT_ID
は、実際のプロジェクト ID に置き換えます。ポリシーを適用します。
gcloud org-policies set-policy ~/policy-enable-gke-targets.yaml
ポリシーが存在することを確認します。
gcloud org-policies list --project=PROJECT_ID
出力は次のようになります。
CONSTRAINT LIST_POLICY BOOLEAN_POLICY ETAG custom.enableGkeTargets - SET COCsm5QGENiXi2E=
- Cloud Run ターゲットを定義する
clouddeploy.yaml
という名前の Cloud Deploy YAML ファイルを作成します。 Cloud Deploy でターゲットを作成する権限があることを確認します。
Cloud Deploy 構成を適用してターゲットを作成します。
- 組織のポリシー サービスについて詳細を学習する。
- 組織のポリシーの作成と管理の方法について学習する。
- マネージドの組織のポリシーの制約全一覧を参照する。
必要なロール
カスタムの組織のポリシーを管理するために必要な権限を取得するには、組織のリソースに対する組織のポリシー管理者(roles/orgpolicy.policyAdmin
)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
カスタム制約を作成する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- RESOURCE_NAME
methodTypes:
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
次のように置き換えます。
カスタム制約の作成方法については、カスタム制約の定義をご覧ください。
カスタム制約を設定する
新しいカスタム制約の YAML ファイルを作成したら、組織内の組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、gcloud org-policies set-custom-constraint
コマンドを使用します。gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH
は、カスタム制約ファイルのフルパスに置き換えます。例: /home/user/customconstraint.yaml
完了すると、カスタム制約が組織のポリシーとして Google Cloud 組織のポリシーのリストに表示されます。カスタム制約が存在することを確認するには、gcloud org-policies list-custom-constraints
コマンドを使用します。gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID
は、組織リソースの ID に置き換えます。詳細については、組織のポリシーの表示をご覧ください。カスタムの組織のポリシーを適用する
制約を適用するには、それを参照する組織のポリシーを作成し、その組織のポリシーを Google Cloud リソースに適用します。コンソール
gcloud
ブール型ルールを含む組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
次のように置き換えます。
制約を含む組織のポリシーを適用するには、次のコマンドを実行します。
gcloud org-policies set-policy POLICY_PATH
POLICY_PATH
は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタム組織のポリシーをテストする
次の例では、GKE ターゲットの作成と更新を許可するカスタム制約とポリシーを作成します。
始める前に、以下を把握しておく必要があります。
制約を作成する
ポリシーを作成する
ポリシーを適用したら、 Google Cloud がポリシーの適用を開始するまで 2 分ほど待ちます。
ポリシーのテスト
プロジェクトに Cloud Run ターゲットを作成してみます。
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: run-target
run:
location: projects/PROJECT_ID/locations/REGION
gcloud deploy apply --file=clouddeploy.yaml \
--project=PROJECT_ID \
--region=REGION
次のような出力が表示されます。
Operation denied by custom org policies: ["customConstraints/custom.enableGkeTargets": "All new targets must be GKE clusters."]
一般的なユースケースのカスタム組織ポリシーの例
次の表に、一般的なカスタム制約の構文例を示します。
次の例では、CEL マクロ all
と exists
を使用します。これらのマクロの詳細については、マクロをご覧ください。
説明 | 制約の構文 |
---|---|
単一ステージの配信パイプラインを許可しない |
name: organizations/ORGANIZATION_ID/customConstraints/custom.denySingleStagePipelines resourceTypes: - clouddeploy.googleapis.com/DeliveryPipeline methodTypes: - CREATE condition: "len(resource.serialPipeline.stages) == 1" actionType: DENY displayName: Deny single-stage delivery pipelines. description: All pipelines must have more than one stage. |
承認が必要なターゲットの作成または更新を許可する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.enableTargetRequireApproval resourceTypes: - clouddeploy.googleapis.com/Target methodTypes: - CREATE - UPDATE condition: "resource.requireApproval" actionType: ALLOW displayName: Enable require approval on all targets description: All targets must require approval. |
プロモーション ルールを含む自動化の作成を拒否する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.denyPromoteReleaseAutomationRules resourceTypes: - clouddeploy.googleapis.com/Automation methodTypes: - CREATE condition: "resource.rules.exists(r, has(r.promoteReleaseRule) || has(r.timedPromoteReleaseRule))" actionType: DENY displayName: Deny promote release or timed promote release automation rules. description: All automation rules must be of type advance rollout or repair rollout. |
Cloud Deploy でサポートされているリソース
次の表に、カスタム制約で参照できる Cloud Deploy リソースを示します。リソース | フィールド |
---|---|
clouddeploy.googleapis.com/Automation |
resource.annotations
|
resource.description
| |
resource.rules.advanceRolloutRule.id
| |
resource.rules.advanceRolloutRule.sourcePhases
| |
resource.rules.advanceRolloutRule.wait
| |
resource.rules.promoteReleaseRule.destinationPhase
| |
resource.rules.promoteReleaseRule.destinationTargetId
| |
resource.rules.promoteReleaseRule.id
| |
resource.rules.promoteReleaseRule.wait
| |
resource.rules.repairRolloutRule.id
| |
resource.rules.repairRolloutRule.jobs
| |
resource.rules.repairRolloutRule.phases
| |
resource.rules.repairRolloutRule.repairPhases.retry.attempts
| |
resource.rules.repairRolloutRule.repairPhases.retry.backoffMode
| |
resource.rules.repairRolloutRule.repairPhases.retry.wait
| |
resource.rules.repairRolloutRule.repairPhases.rollback.destinationPhase
| |
resource.rules.repairRolloutRule.repairPhases.rollback.disableRollbackIfRolloutPending
| |
resource.rules.timedPromoteReleaseRule.destinationPhase
| |
resource.rules.timedPromoteReleaseRule.destinationTargetId
| |
resource.rules.timedPromoteReleaseRule.id
| |
resource.rules.timedPromoteReleaseRule.schedule
| |
resource.rules.timedPromoteReleaseRule.timeZone
| |
resource.selector.targets.id
| |
resource.serviceAccount
| |
resource.suspended
| |
clouddeploy.googleapis.com/CustomTargetType |
resource.annotations
|
resource.customActions.deployAction
| |
resource.customActions.includeSkaffoldModules.configs
| |
resource.customActions.includeSkaffoldModules.git.path
| |
resource.customActions.includeSkaffoldModules.git.ref
| |
resource.customActions.includeSkaffoldModules.git.repo
| |
resource.customActions.includeSkaffoldModules.googleCloudBuildRepo.path
| |
resource.customActions.includeSkaffoldModules.googleCloudBuildRepo.ref
| |
resource.customActions.includeSkaffoldModules.googleCloudBuildRepo.repository
| |
resource.customActions.includeSkaffoldModules.googleCloudStorage.path
| |
resource.customActions.includeSkaffoldModules.googleCloudStorage.source
| |
resource.customActions.renderAction
| |
resource.description
| |
resource.name
| |
clouddeploy.googleapis.com/DeliveryPipeline |
resource.annotations
|
resource.description
| |
resource.name
| |
resource.serialPipeline.stages.deployParameters.matchTargetLabels
| |
resource.serialPipeline.stages.deployParameters.values
| |
resource.serialPipeline.stages.profiles
| |
resource.serialPipeline.stages.strategy.canary.canaryDeployment.percentages
| |
resource.serialPipeline.stages.strategy.canary.canaryDeployment.postdeploy.actions
| |
resource.serialPipeline.stages.strategy.canary.canaryDeployment.predeploy.actions
| |
resource.serialPipeline.stages.strategy.canary.canaryDeployment.verify
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.percentage
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.phaseId
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.postdeploy.actions
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.predeploy.actions
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.profiles
| |
resource.serialPipeline.stages.strategy.canary.customCanaryDeployment.phaseConfigs.verify
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.cloudRun.automaticTrafficControl
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.cloudRun.canaryRevisionTags
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.cloudRun.priorRevisionTags
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.cloudRun.stableRevisionTags
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.deployment
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.httpRoute
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.podSelectorLabel
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.routeDestinations.destinationIds
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.routeDestinations.propagateService
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.routeUpdateWaitTime
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.service
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.gatewayServiceMesh.stableCutbackDuration
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.serviceNetworking.deployment
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.serviceNetworking.disablePodOverprovisioning
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.serviceNetworking.podSelectorLabel
| |
resource.serialPipeline.stages.strategy.canary.runtimeConfig.kubernetes.serviceNetworking.service
| |
resource.serialPipeline.stages.strategy.standard.postdeploy.actions
| |
resource.serialPipeline.stages.strategy.standard.predeploy.actions
| |
resource.serialPipeline.stages.strategy.standard.verify
| |
resource.serialPipeline.stages.targetId
| |
resource.suspended
| |
clouddeploy.googleapis.com/DeployPolicy |
resource.annotations
|
resource.description
| |
resource.rules.rolloutRestriction.actions
| |
resource.rules.rolloutRestriction.id
| |
resource.rules.rolloutRestriction.invokers
| |
resource.rules.rolloutRestriction.timeWindows.oneTimeWindows.endDate
| |
resource.rules.rolloutRestriction.timeWindows.oneTimeWindows.endTime
| |
resource.rules.rolloutRestriction.timeWindows.oneTimeWindows.startDate
| |
resource.rules.rolloutRestriction.timeWindows.oneTimeWindows.startTime
| |
resource.rules.rolloutRestriction.timeWindows.timeZone
| |
resource.rules.rolloutRestriction.timeWindows.weeklyWindows.daysOfWeek
| |
resource.rules.rolloutRestriction.timeWindows.weeklyWindows.endTime
| |
resource.rules.rolloutRestriction.timeWindows.weeklyWindows.startTime
| |
resource.selectors.deliveryPipeline.id
| |
resource.selectors.target.id
| |
resource.suspended
| |
clouddeploy.googleapis.com/Release |
resource.annotations
|
resource.buildArtifacts.image
| |
resource.buildArtifacts.tag
| |
resource.deployParameters
| |
resource.description
| |
resource.name
| |
resource.skaffoldConfigPath
| |
resource.skaffoldConfigUri
| |
resource.skaffoldVersion
| |
clouddeploy.googleapis.com/Rollout |
resource.annotations
|
resource.description
| |
resource.name
| |
resource.targetId
| |
clouddeploy.googleapis.com/Target |
resource.annotations
|
resource.anthosCluster.membership
| |
resource.associatedEntities[*].anthosClusters.membership
| |
resource.associatedEntities[*].gkeClusters.cluster
| |
resource.associatedEntities[*].gkeClusters.dnsEndpoint
| |
resource.associatedEntities[*].gkeClusters.internalIp
| |
resource.associatedEntities[*].gkeClusters.proxyUrl
| |
resource.customTarget.customTargetType
| |
resource.deployParameters
| |
resource.description
| |
resource.executionConfigs.artifactStorage
| |
resource.executionConfigs.defaultPool.artifactStorage
| |
resource.executionConfigs.defaultPool.serviceAccount
| |
resource.executionConfigs.executionTimeout
| |
resource.executionConfigs.privatePool.artifactStorage
| |
resource.executionConfigs.privatePool.serviceAccount
| |
resource.executionConfigs.privatePool.workerPool
| |
resource.executionConfigs.serviceAccount
| |
resource.executionConfigs.usages
| |
resource.executionConfigs.verbose
| |
resource.executionConfigs.workerPool
| |
resource.gke.cluster
| |
resource.gke.dnsEndpoint
| |
resource.gke.internalIp
| |
resource.gke.proxyUrl
| |
resource.multiTarget.targetIds
| |
resource.name
| |
resource.requireApproval
| |
resource.run.location
|