通过借用GCP服务账号来执行terraform
首先
本文提到了一个关于使用服务账号进行GCloud命令的方法,通过实施服务账号的借用,可以在执行GCloud命令时无需在本地拥有服务账号密钥,而是以服务账号的权限来执行命令。现在衍生出来的话题是,在执行terraform时也尝试使用服务账号的借用。
常见的服务帐号使用方式。
当在使用Terraform时,如果要使用服务账号密钥,也是需指定密钥文件(JSON)的路径,基本上与使用gcloud命令时没有太大区别。(关于如何发行服务账号密钥的方法,请参考之前的文章,此处省略)
1. 以 terraform 源代码进行指定的方法。
在适当的tf文件中添加以下描述。provider.tf
provider "google" {
credentials = file("/path/to/serviceaccount-key.json")
project = "YOUR-GCP-PROJECT"
region = "YOUR-GCP-REGION"
}
选项2. 使用环境变量进行设定
在执行terraform命令的终端上,将其设置为环境变量。
将服务账号密钥的文件路径导出为GOOGLE_APPLICATION_CREDENTIALS。
请注意处理服务账户。
如前所述,下载并使用服务帐户密钥存在风险。如果像这次一样使用terraform进行基础架构管理,则更需要将密钥文件放置在terraform源代码目录中,并进行git管理。因此,上传文件至git并不小心泄漏的可能性将进一步增加。
借用服务账号
关于借用的好处,就像以前的文章中所写的那样,这里就不详述了。
在terraform中进行借用操作是在实际的terraform源代码中执行的。
variable "impersonate_serviceaccount" {
type = string
default = "sa-terraform-executor@PROJECT_ID.iam.gserviceaccount.com"
}
provider "google" {
alias = "tokengen"
}
# get config of the client that runs
data "google_client_config" "default" {
provider = google.tokengen
}
data "google_service_account_access_token" "sa" {
provider = google.tokengen
target_service_account = var.impersonate_serviceaccount
lifetime = "1800s"
scopes = ["userinfo-email", "cloud-platform"]
}
/******************************************
GA Provider configuration
*****************************************/
provider "google" {
access_token = data.google_service_account_access_token.sa.access_token
project = var.project
}
provider "google-beta" {
access_token = data.google_service_account_access_token.sa.access_token
project = var.project
}
使用google_service_account_access_token来获取令牌,并将其用作提供程序的访问令牌,这是大致的工作原理。
在这里指定的lifetime是生成的令牌的存活时间。最大值为3600秒(60分钟)。为了避免在terraform执行过程中过期,最好根据构建的规模设置。
总结
在使用Google Cloud时,我们无需再发行服务账户密钥,这样一来,我们可以更加专注于开发而无需担心信息泄露的风险。让我们创造出这样一种情况,让我们能够专心开发而不用担忧信息泄露的风险。
请参考
-
- Terraform で GKE を構築する | Qiita
-
- Using Google Cloud Service Account impersonation in your Terraform code | Google Cloud
- google_service_account_access_token | Terraform