本頁說明如何使用 Organization Policy Service 自訂限制,限制下列 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 (
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.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 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 (
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.
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
如要初始化 gcloud CLI,請執行下列指令:
gcloud init - 請確認您知道機構 ID。
必要的角色
如要取得管理自訂機構政策所需的權限,請要求管理員授予您機構資源的機構政策管理員 (roles/orgpolicy.policyAdmin) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
建立自訂限制
自訂限制是在 YAML 檔案中定義,其中包含您要強制執行機構政策的服務所支援的資源、方法、條件和動作。自訂限制的條件是使用一般運算語言 (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 更改下列內容:
ORGANIZATION_ID:您的機構 ID,例如123456789。CONSTRAINT_NAME:新自訂限制的名稱。自訂限制條件必須以custom.開頭,且只能包含大寫英文字母、小寫英文字母或數字。例如,alertDocHasProject。這個欄位的長度上限為 70 個字元。RESOURCE_NAME:包含要限制物件和欄位的Google Cloud 資源完整名稱。例如:monitoring.googleapis.com/AlertPolicy。CONDITION:針對支援服務資源的代表項目編寫的 CEL 條件。這個欄位的長度上限為 1000 個字元。如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。例如:resource.documentation.content.contains('${resource.project}')。ACTION:如果符合condition,應採取的動作。可能的值為ALLOW和DENY。DISPLAY_NAME:限制條件的易記名稱。這個欄位的長度上限為 200 個字元。DESCRIPTION:違反政策時,要以錯誤訊息形式顯示的限制說明。這個欄位的長度上限為 2000 個字元。
如要進一步瞭解如何建立自訂限制,請參閱「定義自訂限制」。
設定自訂限制
為新的自訂限制建立 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 資源。控制台
- 前往 Google Cloud 控制台的「Organization policies」(機構政策) 頁面。
- 在專案選擇工具中,選取要設定機構政策的專案。
- 在「Organization policies」(機構政策) 頁面上的清單中選取限制條件,即可查看該限制條件的「Policy details」(政策詳情) 頁面。
- 如要設定資源的機構政策,請按一下「管理政策」。
- 在「編輯政策」頁面中,選取「覆寫上層政策」。
- 按一下「新增規則」。
- 在「Enforcement」(強制執行) 區段中,選取是否要強制執行這項機構政策。
- 選用:如要根據標記設定機構政策條件,請按一下「新增條件」。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「使用標記設定組織政策」。
- 按一下「測試變更」,模擬機構政策的影響。舊版受管理限制條件不支援政策模擬。詳情請參閱「 使用 Policy Simulator 測試組織政策變更」。
- 如要完成並套用機構政策,請按一下「設定政策」。這項政策最多需要 15 分鐘才會生效。
gcloud
如要建立含有布林值規則的機構政策,請建立參照限制的政策 YAML 檔案:
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true
取代下列項目:
-
PROJECT_ID:您要強制執行限制的專案。 -
CONSTRAINT_NAME:要強制執行的限制名稱。例如:alertDocHasProject。
如要強制執行包含限制的機構政策,請執行下列指令:
gcloud org-policies set-policy POLICY_PATH
將 POLICY_PATH 替換為機構政策 YAML 檔案的完整路徑。這項政策最多需要 15 分鐘才會生效。
測試自訂機構政策
以下範例會建立自訂限制和政策,檢查快訊政策的說明文件是否提及專案名稱。
開始之前,請先替換下列項目:
- ORGANIZATION_ID:機構的專屬數值 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/AlertPolicy將 ORGANIZATION_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: true將 PROJECT_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-
套用政策後,請等待約兩分鐘, Google Cloud 就會開始強制執行政策。
測試政策
請嘗試建立快訊政策,並在說明文件中排除資源專案名稱。
gcloud alpha 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."] 常見用途的自訂機構政策範例
下表提供一些常見自訂限制的語法範例。
| 說明 | 限制語法 |
|---|---|
| 快訊政策只能有一個條件 | 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 |
| 快訊政策必須至少使用兩個通知管道 | 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 |
| 暫緩時間不得超過一小時 | 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 |