问题描述
在使用Travis CI初始化terraform代码时遇到了一个错误:
Failed to load state: Failed to open state file at gs://{{project_id}}/terraform/state/default.tfstate: Get https://storage.googleapis.com/{{project_id}}/terraform/state/default.tfstate: metadata: GCE metadata "instance/service-accounts/default/token" not defined
用户已经使用服务账号初始化了gcloud(Google Cloud SDK),并设置了TF_CREDS
环境变量,但错误仍然存在。用户的terraform provider和backend的格式如下:
provider "google" {
region = "${var.region}"
zone = "${var.zone}"
project = "${var.project_id}"
}
terraform {
backend "gcs" {
bucket = "{{project_id}}"
prefix = "terraform/state"
}
}
用户尝试移除了默认的Google Cloud SDK,以为它可能与在CI/CD过程中使用的其他SDK冲突,但这并没有解决问题。用户希望能够得到帮助解决这个问题。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案1
设置GOOGLE_APPLICATION_CREDENTIALS
环境变量可以解决这个问题。在Travis CI的配置文件中添加以下代码:
env:
- GOOGLE_APPLICATION_CREDENTIALS=${TF_CREDS}
这将把TF_CREDS
环境变量的值赋给GOOGLE_APPLICATION_CREDENTIALS
环境变量,使得terraform能够正确加载Google Cloud服务账号的凭据文件。
解决方案2
如果解决方案1不起作用,可以尝试在Travis CI的配置文件中手动设置GOOGLE_APPLICATION_CREDENTIALS
环境变量的值。以下是一个示例:
env:
- GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/credentials.json
将/path/to/your/credentials.json
替换为你的Google Cloud服务账号凭据文件的路径。
解决方案3
如果以上解决方案都不起作用,可以尝试在Travis CI的配置文件中手动设置GOOGLE_APPLICATION_CREDENTIALS
环境变量,并使用base64
命令将服务账号凭据文件的内容进行编码。以下是一个示例:
env:
- GOOGLE_APPLICATION_CREDENTIALS=$(echo $SERVICE_ACCOUNT_JSON | base64 --decode > /tmp/credentials.json && echo /tmp/credentials.json)
将$SERVICE_ACCOUNT_JSON
替换为你的Google Cloud服务账号凭据文件的内容。
请注意,以上解决方案中的环境变量设置可能需要根据你的具体情况进行调整。确保将解决方案中的占位符替换为正确的值,并根据需要进行适当的修改。
希望以上解决方案能够帮助你解决问题。如果还有其他问题,请随时提问。