将 setIamPolicy 操作替换为支持的资源类型

Action 功能是一项 Alpha 版功能,其扩展了 Deployment Manager 可以调用的 API 方法的范围。由于此功能不受支持,我们建议您迁移 Actions 的现有使用到受支持的替代方案。常用的操作 storage.buckets.setIamPolicy 对应于现有的 Deployment Manager 资源类型 virtual.buckets.iamMemberBinding,您可以使用它来替换该功能。

将部署从 storage.buckets.setIamPolicy 迁移到 virtual.buckets.iamMemberBinding

virtual.buckets.iamMemberBinding 资源是代表身份和访问权限管理 (IAM) 政策绑定的虚拟资源。其完整类型为 gcp-types/storage-v1:virtual.buckets.iamMemberBinding

virtual.buckets.iamMemberBinding 具有从 Deployment Manager 后端执行创建、读取、更新和删除 (CRUD) 操作的自定义实现。它会调用与操作 storage.buckets.setIamPolicy 调用的方法类似的方法,但它建模为正常资源而不是操作,并且它遵循与普通资源类型相同的生命周期。

如需迁移部署,请在所有部署配置文件中将操作 storage.buckets.setIamPolicy 替换为资源 virtual.buckets.iamMemberBinding。如果您有多个绑定,则可能需要多个资源来跨它们实现相同的逻辑。虚拟类型不会替换资源上的任何现有绑定,而是修补新绑定。

手动迁移的用法示例

如需手动完成迁移,请参阅以下用法示例。在某些情况下(例如,应用多个 IAM 绑定),您可能需要向 iamMemberBinding 资源添加 metadata.dependsOn 或对其他资源的引用,以避免出现争用情况等情况。

YAML + Jinja

以下示例显示了如何在 YAML 配置文件中使用 setIamPolicy 操作。此方法不受支持,应替换为使用 iamMemberBinding 虚拟资源:

- name: patch-iam-policy
  action: gcp-types/storage-v1:storage.buckets.setIamPolicy
  properties:
    bucket:
    policy: # existing policy, e.g. from a getIamPolicyAction
    gcpIamPolicyPatch:
      add:

以下示例演示了在 YAML 和 Jinja 模板中 iamMemberBinding 虚拟资源的建议用法:

{% set BUCKETNAME = "bucket-" + env["deployment"] %}

resources:
- type: gcp-types/storage-v1:buckets
  name: {{ BUCKETNAME }}
  properties:
  location: US
    storageClass: STANDARD
- type: gcp-types/storage-v1:virtual.buckets.iamMemberBinding
  name: test-bucket-iam
  properties:
    bucket: $(ref.{{ BUCKETNAME }}.name)
    member: projectEditor:{{ env["project"] }}
    role: roles/storage.admin

Python

以下示例展示了 Python 模板中使用的 setIamPolicy 操作。此方法不受支持,应替换为使用 iamMemberBinding 虚拟资源:

resources.append({
        'name': 'add-iam-policy',
        'action': 'gcp-types/storage-v1:storage.buckets.setIamPolicy',
        'properties': {
            'bucket': gcs_bucket,
            'userProject': project,
            'policy': '$(ref.get-iam-policy)',
            'gcpIamPolicyPatch': {
                'add': [{
                    'roles':
                        'roles/storage.objectViewer',
                    'members': [
                        'serviceAccount:$(ref.%s.serviceAccount)' % tpu_name
                    ]
                }]
            }
        }
    })

以下示例展示了 Python 模板中 iamMemberBinding 虚拟资源的建议用法:

iam_policy_resource = {
    'name': policy_name,
    'type': 'gcp-types/storage-v1:virtual.buckets.iamMemberBinding',
    'properties':
        {
           'bucket': '$(ref.{}.name)'.format(context.env['name']),
           'role': role['role'],
           'member': member,
         }
}

您可以在 GitHub 上的 cloud-foundation-toolkit 代码库中找到与 gcs-bucket.py 模板相关的其他示例。如需取得详细的演示来了解如何将 gcs-bucket.py 模板从使用操作 setIamPolicy 转换为使用虚拟资源 iamMemberBinding 的过程,请参阅示例转换。您还可以 用法示例 转换后模板的效果。