Cloud Build无法SSH连接启用OS Login的仅内网IP Compute Engine VM
故障排查与解决方案
OS Login兼容性说明
启用OS Login功能的Compute Engine虚拟机完全支持通过Cloud SDK(gcloud命令行)发起SSH连接,连接失败与OS Login特性本身无关,你的故障由两个核心配置问题导致:
- 目标VM仅配置内部IP,默认
gcloud compute ssh会优先尝试连接实例公网IP,必然触发连接超时 - Cloud Build运行身份缺少OS Login、内网连接所需的权限,且默认公网Cloud Build运行环境无法直接访问VPC内的纯内网实例
具体修复步骤
1. 为Cloud Build服务账号授予必要权限
找到项目内Cloud Build默认服务账号(格式为[你的项目编号]@cloudbuild.gserviceaccount.com),绑定以下IAM角色:
- 基础SSH连接权限:
roles/compute.osLogin,如果脚本需要root执行权限则绑定roles/compute.osAdminLogin - 实例访问权限:
roles/compute.instanceAdmin.v1 - (推荐,无需配置私有池)IAP隧道权限:
roles/iap.tunnelResourceAccessor,通过IAP TCP转发直接访问内网实例,无需打通VPC网络
2. 修改cloudbuild.yaml配置
在SSH命令中增加内网IP、IAP隧道、关闭主机密钥校验的参数,避免交互阻塞和公网连接尝试,修正后的配置如下:
steps: - name: 'gcr.io/cloud-builders/gcloud' id: Update staging server entrypoint: /bin/sh args: - '-c' - | set -x && gcloud compute ssh vm_name \ --zone=us-central1-c \ --tunnel-through-iap \ --internal-ip \ --ssh-flag="-o StrictHostKeyChecking=no" \ --ssh-flag="-o UserKnownHostsFile=/dev/null" \ --command='/bin/sh /pullscripts/pull.sh'
可选:不使用IAP的方案
如果你不想走IAP隧道,需要创建Cloud Build私有工作池,将私有池与目标VM所在的VPC建立对等连接,配置路由和防火墙规则允许私有池网段访问VM的22端口,此时可以去掉--tunnel-through-iap参数,保留--internal-ip即可。
之前出现的连接超时、权限拒绝类报错,均为上述配置缺失导致,按步骤配置后即可正常通过Cloud Build触发VM内脚本执行。
内容的提问来源于stack exchange,提问作者dante alighieri
相关产品推荐
相关产品推荐

