Vagrant provision阶段使用GCP服务账号认证失败问题求助
问题诱因
- 核心逻辑错误:
gcloud iam service-accounts.keys.create属于GCP资源管理类命令,执行前必须先完成GCP身份认证。你交互式执行时环境已经存在可用认证信息(比如SSH代理了宿主机的gcloud认证、手动提前做过登录),所以可以正常生成密钥;但Vagrant provision阶段是全新的无状态root环境,没有任何预先配置的认证凭证,该命令直接执行失败。 - 错误连锁触发:上一步创建密钥失败后,
/root/key.json为空白/不存在的无效文件,导致后续gcloud auth activate-service-account读取JSON失败,服务账号激活流程中断,最终拉取GCS资源时没有有效身份凭证,触发401匿名访问错误。 - 配置文件警告的原因:gcloud SDK安装完成后,root用户目录下还未初始化
~/.config/gcloud相关配置目录,属于次要提示,不影响核心功能,提前创建目录即可消除。
解决方案
- 步骤1:提前生成服务账号密钥
在本地宿主机或GCP控制台提前生成对应服务账号的密钥文件key.json,存放到Vagrantfile所在的项目目录,将该文件加入.gitignore避免泄露敏感凭证。 - 步骤2:修改Vagrantfile注入密钥
在shell provision之前添加file provisioner,将本地密钥直接传入客户机,不需要在客户机内执行创建密钥的操作:
Vagrant.configure("2") do |config| # 其他原有配置 config.vm.provision "file", source: "./key.json", destination: "/root/key.json" config.vm.provision "shell", path: "你的provision脚本路径" end
- 步骤3:调整provision shell脚本
删除原脚本中cd ~ && gcloud iam service-accounts.keys.create key.json --iam-account=example@example.iam.gserviceaccount.com这一行,可额外添加配置目录初始化命令消除警告,调整后的脚本如下:
# Install Google Cloud SDK ## Add URI to package source list echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list ## Install packages needed sudo apt install -y apt-transport-https ca-certificates gnupg ## Import Google Cloud public key curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - ## Update and Install Google Cloud SDK sudo apt update && sudo apt install -y google-cloud-sdk # 初始化gcloud配置目录,消除警告 mkdir -p /root/.config/gcloud/configurations ## Activate service account gcloud auth activate-service-account \ example@example.iam.gserviceaccount.com \ --key-file /root/key.json \ --project example-project
内容的提问来源于stack exchange,提问作者tipotto
相关产品推荐
相关产品推荐

