我正在使用 Terraform / Terragrunt 使用 GCP 配置,我发现获取 GCP 凭据的工作流程非常混乱。我以前专门使用 AWS,获取凭证并在 AWS CLI 中配置它们非常简单。
Google Cloud Provider 文档 指出您应该定义一个
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:语法错误:序列被截断
如果我将 Terraform 配置为指向 application_default_credentials.json 文件,则会收到以下错误:
提供程序配置中的
credentials
字段需要服务帐户密钥文件的路径,而不是用户帐户凭据文件的路径。如果您想使用您的用户帐户进行身份验证,请尝试省略 credentials
,然后运行 gcloud auth application-default login
; GOOGLE_APPLICATION_CREDENTIALS
环境变量设置为指向 ~/.config/gcloud/application_default_credentials.json
阅读此处了解更多有关服务帐户与用户帐户主题的信息。无论如何,Terraform 文档明确建议不要使用
application-default login
:
不建议使用此方法 - 某些 API 与通过 gcloud 获取的凭据不兼容
同样,GCP 文档声明以下内容:
重要提示:对于几乎所有情况,无论您是在本地开发还是在生产应用程序中开发,都应该使用服务帐户,而不是用户帐户或 API 密钥。
更改凭据以直接指向文件位置。其他看起来都不错。
示例:凭据 =“/home/scott/gcp/FILE_NAME”
仍然不建议使用
gcloud auth application-default login
,最好的方法是
https://www.terraform.io/docs/providers/google/guides/provider_reference.html#credentials-1