带有 Terraform 的 Google Cloud 凭据

Posted

技术标签:

【中文标题】带有 Terraform 的 Google Cloud 凭据【英文标题】:Google Cloud credentials with Terraform 【发布时间】:2019-12-18 13:51:35 【问题描述】:

这是一个新手问题,但我刚刚开始使用 Terraform / Terragrunt 进行 GCP 配置,我发现获取 GCP 凭据的工作流程非常混乱。我是专门使用 AWS 的,在 AWS CLI 中获取凭证并对其进行配置非常简单。

基本上,Google Cloud Provider documentation 声明您应该像这样定义一个 provider 块:

provider "google" 
  credentials = "$file("account.json")"
  project     = "my-project-id"
  region      = "us-central1"
  zone        = "us-central1-c"

这个credentials 字段显示我(显然)必须生成一个服务帐户,并在我的文件系统中的某个位置保存一个 JSON。

但是,如果我运行命令gcloud auth application-default login,则会生成一个位于~/.config/gcloud/application_default_credentials.json 的令牌;或者我也可以使用gcloud auth login <my-username>。从那里我可以使用gcloud 命令从命令行访问Google API(这也是Terraform 在后台所做的事情)。

那么为什么 Terraform 提供程序需要服务帐户的 JSON 文件?为什么不能只使用gcloud CLI 工具已经在使用的凭据?

顺便说一句,如果我将 Terraform 配置为指向 application_default_credentials.json 文件,我会收到以下错误:

正在初始化模块...

正在初始化后端...

错误:无法获取现有工作区:查询云存储 失败:获取 https://www.googleapis.com/storage/v1/b/terraform-state-bucket/o?alt=json&delimiter=%2F&pageToken=&prefix=projects%2Fsomeproject%2F&prettyPrint=false&projection=full&versions=false: 私钥应该是 PEM 或普通 PKCS1 或 PKCS8;解析错误: asn1:语法错误:序列被截断

【问题讨论】:

【参考方案1】:

如果我将 Terraform 配置为指向 application_default_credentials.json 文件,我会收到以下错误:

提供者配置中的 credentials 字段需要服务帐户密钥文件的路径,而不是用户帐户凭据文件。如果您想使用您的用户帐户进行身份验证,请尝试省略credentials,然后运行gcloud auth application-default login如果 Terraform 找不到您的凭据文件,您可以将 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为指向 ~/.config/gcloud/application_default_credentials.json

阅读here for more 关于服务帐户与用户帐户的主题。对于它的价值,Terraform 文档明确建议不要使用application-default login

不推荐使用此方法 - 某些 API 与通过 gcloud 获取的凭据不兼容

同样GCP docs 声明如下:

重要提示:对于几乎所有情况,无论您是在本地开发还是在生产应用程序中,您都应该使用服务帐户,而不是用户帐户或 API 密钥。

【讨论】:

啊,我明白了,非常感谢!我很困惑为什么会发生这种情况。您在 Terraform Docs 中提到的部分(“不推荐使用这种方法 - 某些 API 与通过 gcloud 获得的凭据不兼容”)仍然让我有些担心。这意味着我无法通过常规 gcloud 命令执行 一些 操作。这看起来很奇怪。 实际上看起来用户必须使用服务帐户。当我执行您推荐的步骤并将GOOGLE_APPLICATION_CREDENTIALS 指向~/.config/gcloud/application_default_credentials.json 时,它仍然给我上面的错误,说它不是PEM 格式。 哦,对了,我的错。如果取消设置 GOOGLE_APPLICATION_CREDENTIALS 变量,application-default login 是否仍然有效? FWIW,链接的“GCP 文档”不再包含“您应该使用服务帐户”短语。用户帐户似乎并不气馁,而且似乎是为开发人员准备的。【参考方案2】:

仍然不建议使用gcloud auth application-default login,最好的方法是

https://www.terraform.io/docs/providers/google/guides/provider_reference.html#credentials-1

【讨论】:

这是错误的,相同的链接,registry.terraform.io/providers/hashicorp/google/latest/docs/… 指出:如果您在工作站上使用 Terraform,我们建议您安装 gcloud 并使用用户应用程序默认凭据(“ADC”)作为主要身份验证身份验证方法。您可以通过运行命令 gcloud auth application-default login 来启用 ADC。【参考方案3】:

更改凭据以直接指向文件位置。其他一切看起来都不错。

示例:凭据 = "/home/scott/gcp/FILE_NAME"

【讨论】:

以上是关于带有 Terraform 的 Google Cloud 凭据的主要内容,如果未能解决你的问题,请参考以下文章

需要说明如何使用 Terraform 管理 Google Cloud 项目

如何通过 terraform 使用服务帐户创建 google cloud pubsub pull 订阅?

使用 Google Cloud Platform 时 Terraform 状态锁定的机制是啥?

Terraform data.google_container_cluster.cluster.endpoint 为空

使用 Terraform 和启动脚本创建专用网络 - Google Cloud Platform

带有特殊字符的 terraform 标签值