管理项目的自定义约束条件

本页详细介绍了如何为 Cloud Run 服务和作业创建自定义约束条件,并在项目级别强制执行这些约束条件。如需了解自定义组织政策,请参阅创建和管理自定义组织政策

Google Cloud 组织政策可让您以编程方式集中控制组织的资源。作为组织政策管理员,您可以定义组织政策,这是一组称为限制条件的限制,会应用于 Google Cloud 资源层次结构中的 Google Cloud 资源及其后代。您可以在组织、文件夹或项目级强制执行组织政策。

组织政策为各种 Google Cloud 服务提供预定义限制条件。但是,如果您想要更精细地控制和自定义组织政策中受限的特定字段,还可以创建自定义组织政策。

优势

借助 Cloud Run,您可以使用 Cloud Run Admin API 中的大多数用户配置字段编写任意数量的自定义约束条件。例如,您可以创建自定义约束条件,指定将服务设置为内部服务或阻止非 GA 发布阶段。

应用后,违反强制执行自定义约束条件的政策的请求会在 gcloud CLI 和 Cloud Run 日志中显示错误消息。错误消息包含违反的自定义约束条件的 ID 和说明。

政策继承

如果您对资源强制执行政策,默认情况下,该资源的后代会继承组织政策。例如,如果您对某个文件夹强制执行一项政策,Google Cloud 会对该文件夹中的所有项目强制执行该政策。如需详细了解此行为及其更改方式,请参阅层次结构评估规则

价格

组织政策服务(包括预定义组织政策和自定义组织政策)可免费使用。

限制

准备工作

所需的角色

如需获得管理组织政策所需的权限,请让您的管理员为您授予组织资源的 Organization Policy Administrator (roles/orgpolicy.policyAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色可提供管理组织政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

管理组织政策需要以下权限:

  • orgpolicy.constraints.list
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

您也可以使用自定义角色或其他预定义角色来获取这些权限。

创建自定义限制条件

自定义限制条件是在 YAML 文件中,由实施组织政策的服务所支持的资源、方法、条件和操作定义的。自定义限制条件的条件使用通用表达式语言 (CEL) 进行定义。如需详细了解如何使用 CEL 构建自定义限制条件中的条件,请参阅创建和管理自定义限制条件的 CEL 部分。

如需为 Cloud Run 自定义限制条件创建 YAML 文件,请参阅以下示例:

name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
resourceTypes:
- run.googleapis.com/Service
methodTypes: 
- CREATE
- UPDATE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION

替换以下内容:

  • ORGANIZATION_ID:您的组织 ID,例如 123456789

  • CONSTRAINT_NAME:新的自定义限制条件的名称。 自定义限制条件必须以 custom. 开头,只能包含大写字母、小写字母或数字,例如 custom.ingressInternal。该字段的长度上限为 70 个字符,不计算前缀,例如 organizations/123456789/customConstraints/custom

  • CONDITION:针对受支持的服务资源的表示法编写的 CEL 条件。此字段的长度上限为 1,000 个字符。 例如,条件:"'run.googleapis.com/ingress' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/ingress'] == 'internal'"。

  • ACTION:满足 condition 时要执行的操作。可以是 ALLOWDENY

  • 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 资源。

控制台

  1. 在 Google Cloud 控制台中,转到组织政策页面。

    转到组织政策

  2. 在项目选择器中,选择要设置组织政策的项目。
  3. 组织政策页面上的列表中选择您的限制条件,以查看该限制条件的政策详情页面。
  4. 如需为该资源配置组织政策,请点击管理政策
  5. 修改政策页面,选择覆盖父级政策
  6. 点击添加规则
  7. 强制执行部分中,选择开启还是关闭此组织政策的强制执行。
  8. 可选:如需使组织政策成为基于某个标记的条件性政策,请点击添加条件。请注意,如果您向组织政策添加条件规则,则必须至少添加一个无条件规则,否则无法保存政策。如需了解详情,请参阅设置带有标记的组织政策
  9. 如果是自定义限制条件,您可以点击测试更改来模拟此组织政策的效果。如需了解详情,请参阅使用 Policy Simulator 测试组织政策更改
  10. 若要完成并应用组织政策,请点击设置政策。该政策最长需要 15 分钟才能生效。

gcloud

如需创建强制执行布尔值限制条件的组织政策,请创建引用该限制条件的 YAML 政策文件:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

请替换以下内容:

  • PROJECT_ID:要对其实施限制条件的项目。
  • CONSTRAINT_NAME:您为自定义限制条件定义的名称。例如,custom.ingressInternal

如需强制执行包含限制条件的组织政策,请运行以下命令:

    gcloud org-policies set-policy POLICY_PATH
    

POLICY_PATH 替换为组织政策 YAML 文件的完整路径。该政策最长需要 15 分钟才能生效。

测试自定义约束条件

如需测试限制入站流量设置的示例,请尝试在入站流量设置为 all 的项目中部署 Cloud Run 服务:

gcloud run deploy org-policy-test \
    --project=PROJECT_ID \
    --region=REGION_ID \
    --ingress=all

输出如下所示:

Operation denied by custom org policies: ["customConstraints/custom.ingressConstraint": "Require ingress to be set to internal."]

常见用例的自定义组织政策示例

下表提供了一些自定义约束条件示例,这些约束条件可能对 Cloud Run 服务和作业很有用:

说明 限制条件语法
要求将 Cloud Run 服务设置为内部服务。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.ingressInternal
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'run.googleapis.com/ingress' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/ingress'] == 'internal'"
    actionType: ALLOW
    displayName: IngressInternal
    description: Require ingress to be set to internal.
说明 限制条件语法
要求为 Cloud Run 服务的所有容器设置自定义内存限制。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.memoryLimit
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.all(container, 'memory' in container.resources.limits && container.resources.limits['memory'] <= 'MEMORY_LIMIT')"
    actionType: ALLOW
    displayName: memoryLimitCap
    description: Require the container memory limit to be set to <= MEMORY_LIMIT.
说明 限制条件语法
防止 Cloud Run 发布阶段从默认的 GA 发布阶段更改为非 GA 发布阶段。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.launchStage
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "!('run.googleapis.com/launch-stage' in resource.metadata.annotations) || resource.metadata.annotations['run.googleapis.com/launch-stage'] == 'GA'"
    actionType: ALLOW
    displayName: launchStage
    description: Only allow users to create and update Cloud Run services with either an unset launch stage (default is GA) or a launch stage explicitly set to GA.
说明 限制条件语法
要求将 Binary Authorization 设置为默认值。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.binaryAuthorization
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "'run.googleapis.com/binary-authorization' in resource.metadata.annotations && resource.metadata.annotations['run.googleapis.com/binary-authorization'] == 'default'"
    actionType: ALLOW
    displayName: binaryAuthorization
    description: Require binaryAuthorization to be set to default.
说明 限制条件语法
要求服务为每个容器提供活跃探测
    name: organizations/ORGANIZATION_ID/customConstraints/custom.livenessProbe
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.all(container, has(container.livenessProbe.initialDelaySeconds))"
    actionType: ALLOW
    displayName: livenessProbe
    description: Require all containers to have a liveness probe configured with initialDelaySeconds.
说明 限制条件语法
要求服务至少有一个边车容器,该容器使用以指定前缀开头的映像,且端口等于指定的数字。
    name: organizations/ORGANIZATION_ID/customConstraints/custom.requireSidecar
    resourceTypes:
    - run.googleapis.com/Service
    methodTypes:
    - CREATE
    - UPDATE
    condition: "resource.spec.template.spec.containers.exists(container, container.image.startsWith('us-docker.pkg.dev/cloud-ops-agents-artifacts/cloud-run-gmp-sidecar/') && container.ports.exists(port, port.containerPort == 8081))"
    actionType: ALLOW
    displayName: requireSidecar
    description: Require at least one container with an image that starts with "us-docker.pkg.dev/cloud-ops-agents-artifacts/cloud-run-gmp-sidecar/" and uses port 8081.

后续步骤