通过借用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
广告
将在 10 秒后关闭
bannerAds