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

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

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

virtual.buckets.iamMemberBinding 资源是一种虚拟资源,表示 Identity and Access Management (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 的过程,请参阅示例转换。您还可以找到转换后的模板的用法示例