无法在 Terraform #GCP 中导出服务帐号密钥

无法在 Terraform #GCP 中导出服务帐号密钥

我已将 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(例如gsutilgcloud)的工具都将默认使用此服务帐户。

每个 GCP 项目都配备了一个“默认计算”服务帐户,或者您可以使用 Terraform 为相关实例专门创建一个服务帐户,并根据需要通过 IAM 授予权限。


但是,具体回答您的问题,由于嵌套的双引号,您的密钥未被部署。您的 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 文件。

相关内容