このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。
monitoring.googleapis.com/AlertPolicymonitoring.googleapis.com/NotificationChannelmonitoring.googleapis.com/Snooze
組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。
組織のポリシーと制約について
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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
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 を確認します。
- Google Cloud コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
- [ カスタム制約] をクリックします。
- [表示名] ボックスに、制約のわかりやすい名前を入力します。この名前はエラー メッセージで使用され、識別とデバッグに使用できます。エラー メッセージで漏えいする可能性があるため、表示名には PII や機密データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
-
[制約 ID] ボックスに、新しいカスタム制約の名前を入力します。カスタム制約には、英字(大文字と小文字を含む)または数字のみを含めることができます(例:
custom.disableGkeAutoUpgrade)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで含めることができます(例:organizations/123456789/customConstraints/custom)。エラー メッセージで漏えいする可能性があるため、制約 ID には PII や機密データを含めないでください。 - [説明] ボックスに、制約の説明を入力します。この説明は、ポリシー違反時にエラー メッセージとして使用されます。ポリシー違反が発生した理由と、ポリシー違反を解決する方法に関する詳細を含めます。エラー メッセージで漏えいする可能性があるため、説明には PII や機密データを含めないでください。このフィールドには、最大 2,000 文字を入力できます。
-
[リソースの種類] ボックスで、制限するオブジェクトとフィールドを含む Google Cloud REST リソースの名前(
container.googleapis.com/NodePoolなど)を選択します。ほとんどのリソースタイプは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。 - [適用方法] で、REST CREATE メソッドに制約を適用するのか、または CREATE メソッドと UPDATE メソッドの両方に制約を適用するのかを選択します。制約に違反するリソースに対して UPDATE メソッドを使用して制約を適用すると、そのリソースに対する変更は、違反が解決されない限り、組織のポリシーによってブロックされます。
- 条件を定義するには、[ 条件を編集] をクリックします。
-
[条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例:
resource.management.autoUpgrade == false)。このフィールドには、最大 1,000 文字を入力できます。CEL の使用方法の詳細については、 Common Expression Language をご覧ください。カスタム制約で使用できるサービス リソースの詳細については、 カスタム制約でサポートされているサービスをご覧ください。 - [保存] をクリックします。
- [アクション] で、条件を満たしている場合に、評価された方法を許可するかどうかを選択します。
- [制約を作成] をクリックします。
- カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
-
ORGANIZATION_ID: 組織 ID(123456789など)。 -
CONSTRAINT_NAME: 新しいカスタム制約に付ける名前。カスタム制約には、文字(大文字と小文字を含む)または数字のみを含めることができます(例:alertDocHasProject)。このフィールドには、最大 70 文字まで入力できます。 -
RESOURCE_NAME: 制限するオブジェクトとフィールドを含む Google Cloudリソースの完全修飾名。例:monitoring.googleapis.com/AlertPolicy。 -
CONDITION: サポートされているサービス リソースの表現に対して書き込まれる CEL 条件。このフィールドには、最大 1,000 文字を入力できます。例:resource.documentation.content.contains('${resource.project}')。 -
ACTION:conditionが満たされている場合に実行するアクション。有効な値はALLOWとDENYです。 -
DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。このフィールドには、最大 200 文字を入力できます。 -
DESCRIPTION: ポリシー違反時にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドには、最大 2,000 文字を入力できます。 -
新しいカスタム制約の YAML ファイルを作成したら、組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、
gcloud org-policies set-custom-constraintコマンドを使用します。 -
カスタム制約が存在することを確認するには、
gcloud org-policies list-custom-constraintsコマンドを使用します。 - Google Cloud コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[Override parent's policy] を選択します。
- [ルールを追加] をクリックします。
- [適用] セクションで、この組織のポリシーを適用するかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、 タグを使用した組織のポリシーの設定をご覧ください。
- 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最大 15 分かかります。
- ブール型ルールを含む組織のポリシーを作成するには、制約を参照するポリシー YAML ファイルを作成します。
-
PROJECT_ID: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME: 適用する制約の名前。例:alertDocHasProject。 - 制約を含む組織のポリシーを適用するには、次のコマンドを実行します。
- ORGANIZATION_ID: 組織の一意の数値識別子。この ID を取得する方法については、組織 ID の取得をご覧ください。
- PROJECT_ID: プロジェクトの ID。
次のファイルに
constraint-alert-doc-has-project.yamlという名前を付けて保存します。actionType: DENY condition: resource.documentation.content.contains('${resource.project}') description: Requires documentation to include the project name. displayName: Alerting policy documentation must include project name. methodTypes: - CREATE - UPDATE name: organizations/ORGANIZATION_ID/customConstraints/custom.alertDocHasProject resourceTypes: - monitoring.googleapis.com/AlertPolicyORGANIZATION_ID は、実際の組織 ID に置き換えます。
この制約により、アラート ポリシーのドキュメントにリソース プロジェクトの名前がない場合、アラート ポリシーを作成または更新できなくなります。
制約を適用します。
gcloud org-policies set-custom-constraint ~/constraint-alert-doc-has-project.yaml制約が存在することを確認します。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID出力は次のようになります。
CUSTOM_CONSTRAINT: custom.alertDocHasProject ACTION_TYPE: DENY METHOD_TYPES: CREATE,UPDATE RESOURCE_TYPES: monitoring.googleapis.com/AlertPolicy DISPLAY_NAME: Alerting policy documentation must include the project name.次のファイルに
policy-alert-doc-has-project.yamlという名前を付けて保存します。name: projects/PROJECT_ID/policies/custom.alertDocHasProject spec: rules: - enforce: truePROJECT_ID は、実際のプロジェクト ID に置き換えます。
ポリシーを適用します。
gcloud org-policies set-policy ~/policy-alert-doc-has-project.yamlポリシーが存在することを確認します。
gcloud org-policies list --project=PROJECT_ID出力は次のようになります。
CONSTRAINT: custom.alertDocHasProject LIST_POLICY: - BOOLEAN_POLICY: SET ETAG: CKSx5LwGEPjBuKwD-- 組織のポリシー サービスについて詳細を学習する。
- 組織のポリシーの作成と管理の方法について学習する。
- マネージドの組織のポリシーの制約全一覧を参照する。
必要なロール
カスタムの組織のポリシーを管理するために必要な権限を取得するには、組織のリソースに対する組織のポリシー管理者(roles/orgpolicy.policyAdmin)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
カスタム制約を設定する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
コンソール
カスタム制約を作成する手順は次のとおりです。
すべての Google Cloud サービスが両方のメソッドをサポートしているわけではありません。各サービスでサポートされているメソッドを確認するには、 サポートされているサービスをご覧ください。
拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。
許可アクションは、条件が true と評価された場合にのみ、リソースを作成または更新するオペレーションが許可されることを意味します。条件に明示的にリストされているケースを除き、他のすべてのケースはブロックされます。
各フィールドに値を入力すると、このカスタム制約の YAML 構成が右側に表示されます。
gcloud
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: - RESOURCE_NAME methodTypes: - CREATE
- UPDATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
次のように置き換えます。
条件の書き込み先として使用できるリソースの詳細については、サポート対象のリソースをご覧ください。
許可アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションが許可されることを意味します。つまり、条件に明示的にリストされているケースを除き、他のすべてのケースはブロックされます。
拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH は、カスタム制約ファイルのフルパスに置き換えます。例: /home/user/customconstraint.yaml。
このオペレーションが完了すると、カスタム制約が Google Cloud 組織のポリシーのリストに表示され、使用可能になります。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID は、組織リソースの ID に置き換えます。
詳細については、 組織のポリシーの表示をご覧ください。
カスタムの組織のポリシーを適用する
制約を適用するには、それを参照する組織のポリシーを作成し、その組織のポリシーを Google Cloud リソースに適用します。コンソール
gcloud
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
次のように置き換えます。
gcloud org-policies set-policy POLICY_PATH
POLICY_PATH は、組織のポリシーの YAML ファイルのパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタム組織のポリシーをテストする
次の例では、アラート ポリシーのドキュメントにプロジェクト名が記載されているかどうかを確認するカスタムの制約とポリシーを作成します。
始める前に、次のように置き換えます。
制約を作成する
ポリシーを作成する
ポリシーを適用したら、 Google Cloud がポリシーの適用を開始するまで 2 分ほど待ちます。
ポリシーのテスト
ドキュメントにリソース プロジェクト名がないアラート ポリシーを作成してみます。
gcloud monitoring policies create \
--display-name="CPU Utilization - 5% Threshold" \
--project=PROJECT_ID \
--condition-display-name="Condition 1" \
--condition-filter='resource.type="gce_instance" AND metric.type="compute.googleapis.com/instance/cpu/utilization"' \
--duration='60s' \
--if='>5' \
--combiner='AND' \
--documentation='The ${metric.display_name} of the ${resource.type} ${resource.label.instance_id} has exceeded 5% for over 60 seconds.' \
PROJECT_ID は、実際のプロジェクト ID に置き換えます。
次のような出力が表示されます。
Operation denied by custom org policies: ["customConstraints/alertDocHasProject": "Alerting policy documentation must include project name."]
一般的なユースケースのカスタム組織ポリシーの例
次の表では一般的なカスタム制約の構文例をまとめています。
| 説明 | 制約の構文 |
|---|---|
| アラート ポリシーに含めることができる条件は 1 つだけです |
actionType: DENY condition: "resource.conditions.size() > 1" description: Requires alerting policies to have only one condition. displayName: Alerting policies must have only one condition methodTypes: - CREATE - UPDATE name: organizations/ORGANIZATION_ID/customConstraints/custom.oneCondition resourceTypes: - monitoring.googleapis.com/AlertPolicy |
| アラート ポリシーは少なくとも 2 つの通知チャンネルを使用する必要があります |
actionType: DENY condition: "resource.notificationChannels.size() < 2" description: Alerting policies must use at least two notification channels. displayName: Policies must have a backup notification channel methodTypes: - CREATE - UPDATE name: organizations/ORGANIZATION_ID/customConstraints/custom.alertOnTwoChannels resourceTypes: - monitoring.googleapis.com/AlertPolicy |
| メール通知チャンネルのみを許可します |
actionType: DENY condition: "resource.type != 'email'" description: Requires notification channels to use only the email channel type. displayName: Always use email for notification channels methodTypes: - CREATE - UPDATE name: organizations/ORGANIZATION_ID/customConstraints/custom.emailChannelsOnly resourceTypes: - monitoring.googleapis.com/NotificationChannel |
| スヌーズは 1 時間未満にする必要があります |
actionType: DENY condition: "int(resource.interval.endTime) > int(resource.interval.startTime) + 3600" description: Requires snoozes to be under 1 hour. displayName: Snooze must be less than 1 hour methodTypes: - CREATE - UPDATE name: organizations/ORGANIZATION_ID/customConstraints/custom.setMaxSnooze resourceTypes: - monitoring.googleapis.com/Snooze |
Cloud Monitoring でサポートされているリソース
次の表に、カスタム制約で参照できる Cloud Monitoring リソースを示します。| リソース | フィールド |
|---|---|
| monitoring.googleapis.com/AlertPolicy |
resource.alertStrategy.autoClose
|
resource.alertStrategy.notificationChannelStrategy.notificationChannelNames
| |
resource.alertStrategy.notificationChannelStrategy.renotifyInterval
| |
resource.alertStrategy.notificationRateLimit.period
| |
resource.combiner
| |
resource.conditions.conditionAbsent.aggregations.alignmentPeriod
| |
resource.conditions.conditionAbsent.aggregations.crossSeriesReducer
| |
resource.conditions.conditionAbsent.aggregations.groupByFields
| |
resource.conditions.conditionAbsent.aggregations.perSeriesAligner
| |
resource.conditions.conditionAbsent.duration
| |
resource.conditions.conditionAbsent.filter
| |
resource.conditions.conditionAbsent.trigger.count
| |
resource.conditions.conditionAbsent.trigger.percent
| |
resource.conditions.conditionMatchedLog.filter
| |
resource.conditions.conditionMatchedLog.labelExtractors
| |
resource.conditions.conditionMonitoringQueryLanguage.duration
| |
resource.conditions.conditionMonitoringQueryLanguage.evaluationMissingData
| |
resource.conditions.conditionMonitoringQueryLanguage.query
| |
resource.conditions.conditionMonitoringQueryLanguage.trigger.count
| |
resource.conditions.conditionMonitoringQueryLanguage.trigger.percent
| |
resource.conditions.conditionPrometheusQueryLanguage.alertRule
| |
resource.conditions.conditionPrometheusQueryLanguage.duration
| |
resource.conditions.conditionPrometheusQueryLanguage.evaluationInterval
| |
resource.conditions.conditionPrometheusQueryLanguage.labels
| |
resource.conditions.conditionPrometheusQueryLanguage.query
| |
resource.conditions.conditionPrometheusQueryLanguage.ruleGroup
| |
resource.conditions.conditionSql.booleanTest.column
| |
resource.conditions.conditionSql.daily.periodicity
| |
resource.conditions.conditionSql.hourly.minuteOffset
| |
resource.conditions.conditionSql.hourly.periodicity
| |
resource.conditions.conditionSql.minutes.periodicity
| |
resource.conditions.conditionSql.query
| |
resource.conditions.conditionSql.rowCountTest.comparison
| |
resource.conditions.conditionSql.rowCountTest.threshold
| |
resource.conditions.conditionThreshold.aggregations.alignmentPeriod
| |
resource.conditions.conditionThreshold.aggregations.crossSeriesReducer
| |
resource.conditions.conditionThreshold.aggregations.groupByFields
| |
resource.conditions.conditionThreshold.aggregations.perSeriesAligner
| |
resource.conditions.conditionThreshold.comparison
| |
resource.conditions.conditionThreshold.denominatorAggregations.alignmentPeriod
| |
resource.conditions.conditionThreshold.denominatorAggregations.crossSeriesReducer
| |
resource.conditions.conditionThreshold.denominatorAggregations.groupByFields
| |
resource.conditions.conditionThreshold.denominatorAggregations.perSeriesAligner
| |
resource.conditions.conditionThreshold.denominatorFilter
| |
resource.conditions.conditionThreshold.duration
| |
resource.conditions.conditionThreshold.evaluationMissingData
| |
resource.conditions.conditionThreshold.filter
| |
resource.conditions.conditionThreshold.forecastOptions.forecastHorizon
| |
resource.conditions.conditionThreshold.thresholdValue
| |
resource.conditions.conditionThreshold.trigger.count
| |
resource.conditions.conditionThreshold.trigger.percent
| |
resource.conditions.displayName
| |
resource.conditions.name
| |
resource.displayName
| |
resource.documentation.content
| |
resource.documentation.links.displayName
| |
resource.documentation.links.url
| |
resource.documentation.mimeType
| |
resource.documentation.subject
| |
resource.enabled
| |
resource.name
| |
resource.notificationChannels
| |
resource.severity
| |
| monitoring.googleapis.com/NotificationChannel |
resource.description
|
resource.displayName
| |
resource.enabled
| |
resource.type
| |
| monitoring.googleapis.com/Snooze |
resource.criteria.policies
|
resource.displayName
| |
resource.interval.endTime
| |
resource.interval.startTime
|