terraform GCE 服务帐户节

Posted

技术标签:

【中文标题】terraform GCE 服务帐户节【英文标题】:terraform GCE service account stanza 【发布时间】:2019-04-16 21:03:25 【问题描述】:

我正在 GCP 上创建一个实例,但在使用服务帐户节时遇到了一些问题。当我这样做时:

service_account 
  email = "terraformdeploy-dev@projectxxx.org.com.iam.gserviceaccount.com"
  scopes = []

实例确实使用该服务帐户进行配置,但所有 Cloud API access scopes 在 UI 中显示 disabled

如果我这样做:

service_account 
  email = "terraformdeploy-dev@projectxxx.org.com.iam.gserviceaccount.com"
  scopes = ["cloud-platform"]

实例提供对所有 API 的完全访问权限,但奇怪的是上述服务帐户无权访问所有这些 API。我对如何在此处使用服务帐户节感到困惑,因为文档不是很清楚。

我可以只分配服务帐户,还是需要指定服务帐户及其范围?

【问题讨论】:

【参考方案1】:

GCE 提​​供了两种方法来限制实例可以提供的 API 访问,而您正被这两种方法所困扰。一个是 GCE 实例具有一个范围,该范围将来自该机器的任何 API 请求限制到这些服务。例如,如果您的 GCE 实例不允许 GCS 写入操作,则无论与实例关联的服务帐户如何,您都无法执行 GCS 写入操作。

您可以通过 SSH 登录,使用项目所有者帐户进行身份验证,然后尝试写入 GCS,但它会失败。这样做是为了提供额外的安全层,如果您知道“此实例组中的实例将只需要 GCS 读取和 StackDriver API 访问权限”,则主要有用。

现在,与实例关联的服务帐户仅在客户端库或 gcloud 命令在“应用程序默认”位置查找凭据时使用。因此,如果您的应用程序包含服务帐户 json 密钥并从中读取,则关联的密钥无关紧要。

因此,您指定的服务帐户使所有应用程序默认使用该帐户凭据执行 API 请求。

还要记住有much more refined scopes than just 'cloud-platform'.

【讨论】:

是的...我可以很好地做到这一点,但问题是...我似乎无法正确使用 Terraform...如果我只是将 SA 放入terraform...它似乎没有将其附加到 GCE 实例...但我可以通过控制台创建实例来手动执行此操作 创建一个定义了 service account.email 的实例,并且范围留空“[]”,成功创建了一个实例,并按预期禁用了所有 API,范围为零。使用服务帐户电子邮件和相关范围创建实例已启用所需的 API。您的问题是“我可以只分配服务帐户还是需要指定服务帐户及其具有的范围?”您必须关联您打算供该实例使用的范围。如果您不指定范围而不管附加的 SA 是什么,该实例将阻止对 google 服务的所有 API 调用。

以上是关于terraform GCE 服务帐户节的主要内容,如果未能解决你的问题,请参考以下文章

ruby 在OpenStack,GCE,DigitalOcean上应用terraform后生成ssh_config的快速脚本

为 Terraform 服务帐户定义 ClusterRoleBinding

Terraform 应用服务不会连接到存储帐户

在 GCE 帐户中插入图像

使用 terraform 如何创建一个跨多个项目使用的服务帐户?

从另一个 aws 帐户运行 terraform