首先,您需要在 GCP 项目中设置一个服务帐户,以便 Terraform Cloud 能够为您管理资源。只需执行以下操作:
- 登录 GCP 控制台并切换到所需的项目。
- 转到IAM & Admin → Service accounts 部分。
- 按"Create service account" 按钮。
- 为您的服务帐户指定一个有意义的名称,然后点击“创建并继续”。
- 为您的服务帐户指定一个角色。出于测试目的,您可以使用具有最大权限的
Owner 角色。但是,在生产环境中,我强烈建议您为您的服务帐号创建一个单独的角色,并尽可能减少权限。
- 然后点击“完成”,最终创建服务帐号。
- 现在,从列表中选择新创建的帐户并转到“KEYS”标签。
- 按“添加密钥”按钮并选择“创建新密钥”选项。
- 选择 JSON 格式并按“CREATE”。
- 将密钥文件下载到您的计算机并在您喜欢的文本编辑器中打开。
- 提供的密钥是多行 JSON 格式,但是,为了能够在 Terraform 配置中使用它,它应该被缩小。您可以使用任何您可以信任的 JSON 压缩器。否则,您可以使用文本编辑器的“查找和替换”功能来删除所有多行字符。最后,您应该会收到一个 JSON 文档作为单行文本,复制它。
现在,您需要在 Terraform 配置中指定 JSON 密钥。最直接的方法是将其直接放在您的 google 提供程序配置中的 credentials 属性下。但是,将此类敏感数据存储在代码中是一种非常糟糕的做法。我们会做其他事情:
- 将以下变量声明添加到您的 Terraform 配置文件:
variable "gcp_credentials" {
type = string
sensitive = true
description = "Google Cloud service account credentials"
}
这将告诉 Terraform 这个输入变量确实存在并且可以用于配置堆栈。
-
然后,转到 Terraform Cloud 控制台并切换到所需的工作区。转到“变量”标签。
-
现在,按“添加变量”按钮并指定以下数据:
-
密钥:
gcp_credentials
-
价值:
INSERT YOUR SINGLE-LINE JSON HERE
-
说明:
Google Cloud service account credentials
- 选中“敏感”复选框。
-
点击“保存变量按钮”。
最后,更新您的提供程序配置,如下所示:
provider "google" {
project = "my-project-id"
credentials = var.gcp_credentials
region = "europe-west3"
zone = "europe-west3-a"
}
使用这种方法,您的 JSON 密钥将由 Terraform Cloud 安全存储,任何人都无法直接读取它(感谢“敏感”选项),并且该密钥将在运行时通过以下方式提供给 Google Provider Terraform 输入变量的方法。
但是,请注意,这不是一种万无一失的秘密存储方式,并且在某些情况下,能够更新配置和读取日志文件的一方可以读取变量的内容。
我还建议从配置文件中移动其他信息,例如区域/区域和项目 ID。这将使您的堆栈更可重用并且您的配置更清晰(通过删除重复)。
这是最后一个例子:
#===========#
# VARIABLES #
#===========#
variable "gcp_project_id" {
type = string
description = "Google Cloud project ID"
}
variable "gcp_credentials" {
type = string
sensitive = true
description = "Google Cloud service account credentials"
}
variable "gcp_region" {
type = string
description = "Google Cloud region"
}
variable "gcp_zone" {
type = string
description = "Google Cloud zone"
}
#===========#
# PROVIDERS #
#===========#
provider "google" {
project = var.gcp_project_id
credentials = var.gcp_credentials
region = var.gcp_region
zone = var.gcp_zone
}
#===========#
# RESOURCES #
#===========#
resource "google_storage_bucket" "my-bucket" {
name = "my-bucket"
location = var.gcp_region
force_destroy = true
uniform_bucket_level_access = true
}