首页 > 解决方案 > GCP 授予服务帐户使用 Deployment Manager 写入 GCS 存储桶的权限

问题描述

在 Deployment Manager Jinja 模板中,我正在尝试创建日志接收器:

- name: {{ ALOGSINK }}
  type: gcp-types/logging-v2:projects.sinks
  properties:
    sink: {{ ALOGSINK }}
    parent: projects/{{ PROJECT }}
    uniqueWriterIdentity: true
    outputVersionFormat: V2
    destination: storage.googleapis.com/{{ LOGGINGBUCKET }}
    filter: >-
      resource.type="deployment" AND
      resource.labels.name="{{ DEPLOYMENT }}"

我更愿意将它们配置为在写入目的地时使用“唯一写入者身份” ,即 GCS 存储桶。

这意味着将为每个日志接收器自动创建一个特定的服务帐户。

并且有必要为此服务帐户授予写入指定(和已经存在的)存储桶的权限。

因此,在授予权限的模板部分中,我可以使用$(ref.logsink>.writerIdentity).

现在有趣的部分 - 将绑定添加到存储桶的 ACL 的唯一可靠方法是使用对象的insert方法BucketAccessControls

- name:  {{ LOGGINGBUCKET }}-{{ ALOGSINK }}-acl
  action: gcp-types/storage-v1:storage.BucketAccessControls.insert
  properties:
    bucket: $(ref.bucket-name)
    entity: user-$(ref.{{ ALOGSINK }}.writerIdentity}
    role: WRITER

问题是writerIdentity是 的形式serviceAccount:<email>,但是方法所entity期望的insert应该是 的形式user-<email>

并且找不到将前者适合后者的方法。

标签: google-cloud-platformgoogle-deployment-manager

解决方案


可能您想使用支持服务帐户的存储桶 IAM 策略:

https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy

我同意这有点误导,很自然地认为 BucketAccessControls 也应该支持服务帐户......


推荐阅读