如何通过Terraform获取GCP服务账号JSON密钥并保存至自建VM
实现Terraform自动将GCP服务账号完整JSON密钥写入VM指定目录
完全可行,核心是利用google_service_account_key资源的private_key字段(该字段本身就是完整的JSON格式密钥内容),同时解决启动脚本中的路径错误和转义问题,具体操作如下:
步骤1:确保正确创建服务账号及密钥资源
先在Terraform中定义服务账号和对应的密钥资源(如果已有服务账号,可直接创建密钥):
resource "google_service_account" "dez-sa" { account_id = "dez-sa" display_name = "Dez Service Account" } resource "google_service_account_key" "dez-sa-key" { service_account_id = google_service_account.dez-sa.name public_key_type = "TYPE_X509_PEM_FILE" }
步骤2:修正启动脚本逻辑
你的原脚本存在两个关键问题:路径错误(~/home/user是无效路径)、JSON写入时的转义问题。以下是修正后的启动脚本:
metadata_startup_script = <<-SCRIPT # 创建密钥存储目录(修正路径错误) mkdir -p /home/user/.gc # 写入完整JSON密钥文件(用printf避免转义问题) printf '%s' '${google_service_account_key.dez-sa-key.private_key}' > /home/user/.gc/sa_key_file.json # 设置文件权限,避免gcloud访问报错 chmod 600 /home/user/.gc/sa_key_file.json # 持久化环境变量(写入bashrc,确保所有会话生效) echo "export GOOGLE_APPLICATION_CREDENTIALS=/home/user/.gc/sa_key_file.json" >> /home/user/.bashrc # 立即加载环境变量并认证 export GOOGLE_APPLICATION_CREDENTIALS=/home/user/.gc/sa_key_file.json gcloud auth activate-service-account --key-file \$GOOGLE_APPLICATION_CREDENTIALS SCRIPT
关键说明
- 路径修正:
~/home/user会解析为/home/当前启动用户/home/user,这是错误路径,直接使用/home/user指向目标用户的家目录。 - JSON写入:
google_service_account_key.dez-sa-key.private_key本身就是完整的JSON密钥字符串,用printf '%s' '...'可以避免echo对特殊字符的转义错误。 - 权限设置:给密钥文件设置
600权限,符合GCP密钥文件的安全要求,避免后续gcloud命令因权限过高报错。 - 环境变量持久化:仅用
export设置的环境变量仅在当前启动会话有效,写入.bashrc可确保后续登录会话也能读取到该变量。
内容的提问来源于stack exchange,提问作者mrsvllmr
相关产品推荐
相关产品推荐

