我已将 GCP 服务帐户密钥下载到本地系统。在 Terraform 中,我已将 GOOGLE_APPLICATION_CREDENTIALS 设置为堡垒实例启动脚本部分中此文件的路径。以下是代码片段:
variable "credentials"{
default="C:/GCP/service-account-key.json"
}
。 。 。 。 。 。
metadata= {
startup-script=<<SCRIPT
export GOOGLE_APPLICATION_CREDENTIALS="${file("${var.credentials}")}"
SCRIPT
}
后来我编写了一个 #!/bin/bash 脚本来将此凭据存储到另一个文件中,如下所示:
#!/bin/bash
printf "$GOOGLE_APPLICATION_CREDENTIALS" > /home/ubuntu/credentials
但是当我打开上述凭证文件时,文件被截断如下,并且整个密钥丢失:
{
type: service_account,
project_id: acn-devopsgcp,
private_key_id: xxxxx,
private_key: -----BEGIN
请有人告诉我为什么服务帐户密钥没有正确导出到文件中,或者是否有任何需要更正的地方。
答案1
如果此堡垒实例是 Google Cloud Compute Engine (GCE) 实例,则无需将 JSON 密钥传递给虚拟机。
您应该使用 GCE 实例运行的服务帐户 - 如果没有使用环境变量提供凭据,任何使用 GCP API/SDK(例如gsutil
或gcloud
)的工具都将默认使用此服务帐户。
每个 GCP 项目都配备了一个“默认计算”服务帐户,或者您可以使用 Terraform 为相关实例专门创建一个服务帐户,并根据需要通过 IAM 授予权限。
- 有关服务帐户的更多信息:https://cloud.google.com/iam/docs/understanding-service-accounts
- 上述链接中有关 GCE 的具体部分:https://cloud.google.com/iam/docs/understanding-service-accounts#using_service_accounts_with_compute_engine
但是,具体回答您的问题,由于嵌套的双引号,您的密钥未被部署。您的 JSON 密钥包含双引号,如果不进行转义,将终止以字符串开头的引号。
如果你有要使用 JSON 密钥文件,我会将其作为文件部署到虚拟机,然后在启动脚本中读取该文件:
#!/bin/bash
cat <<EOF > /etc/gce_credentials.json
${file("${var.credentials}")}
EOF
export GOOGLE_APPLICATION_CREDENTIALS=$(cat /etc/gce_credentials.json)
答案2
您必须配置变量 GOOGLE_APPLICATION_CREDENTIALS
https://cloud.google.com/docs/authentication/
您可以从服务帐户下载 JSON 文件。
在 IAM 和管理 > 服务帐户部分中,单击要使用的服务帐户的 3 个点,然后选择“创建密钥”> JSON > 创建
这将生成/下载 JSON 文件。