【问题标题】:GCP grant a service account permission to write in a GCS bucket with Deployment ManagerGCP 授予服务帐户使用 Deployment Manager 写入 GCS 存储桶的权限
【发布时间】:2019-06-25 17:29:02
【问题描述】:

在 Deployment Manager Jinja 模板中,我正在尝试创建 log sinks

- 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 存储桶 destination 时使用“unique writer identity”。

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

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

因此,在授予权限的模板部分中,我可以使用$(ref.logsink>.writerIdentity) 引用服务帐户身份(电子邮件地址)。

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

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

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

并且无法找到将前者融入后者的方法。

【问题讨论】:

  • 查看API reference 没有提及服务帐户,即使提及组 (group-email)。一种可能性是在您的 GSuite 组织下创建一个组并将服务帐户添加到该组
  • 已经有一个组 (cloud-logs@google.com) 当它们设置为使用“共享写入者身份”(与“唯一写入者身份”相反)时可用于所有日志接收器。问题是我想避免使用“共享作者身份”。如果我必须将服务帐户添加到 DM 模板中的组,部署管理器的服务帐户需要更多权限/角色。
  • @MilenA.Radev 你有没有解决这个问题?有一个类似的案例:我已经有一个容器注册表(它是在部署管理器之外创建的),它是关联的存储桶;我想为我的 Kubernetes 服务帐户添加 ACL 存储桶绑定(整个 k8s 基础架构是通过 Deployment Manager 部署的,甚至应用程序部署也是通过 Flux 自动化的,因此手动关联绑定的这种手动步骤对我来说是不可接受的)

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


【解决方案1】:

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

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

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

【讨论】:

  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。请参阅:How to anwser
  • 已经尝试过了——它会用提供的绑定覆盖当前绑定。这意味着您需要“调用”getIamPolicy,添加新绑定并使用它“调用”setIamPolicy。这有点问题。
  • 抱歉,不是直接/通过 Ansible 使用 API,而是使用 Terraform,这会为您提供不同的原语(希望通过 API 您有等效的东西),具体取决于您是要覆盖还是仅合并:terraform.io/docs/providers/google/r/storage_bucket_iam.html
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2018-04-29
  • 2021-04-08
  • 2019-03-15
  • 1970-01-01
  • 2021-07-29
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多