非交互式环境下用服务账号+IAP连接GCE实例及所需IAM权限
非交互式流水线中通过IAP代理登录GCE实例的配置方案
一、升级后的gcloud命令(适配Terraform local-exec)
在Terraform的local-exec中,需按顺序执行服务账号激活、IAP代理登录命令,确保全程非交互式:
resource "null_resource" "iap_ssh_login" { provisioner "local-exec" { command = <<EOT # 绑定服务账号凭证路径 export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account-key.json" # 非交互式激活服务账号 gcloud auth activate-service-account --key-file="$GOOGLE_APPLICATION_CREDENTIALS" --quiet # 通过IAP代理登录GCE实例,禁用主机密钥检查避免交互 gcloud compute ssh INSTANCE_NAME \ --zone=INSTANCE_ZONE \ --project=PROJECT_ID \ --tunnel-through-iap \ --quiet \ --ssh-flag="-o StrictHostKeyChecking=no" \ --ssh-flag="-o UserKnownHostsFile=/dev/null" EOT } }
若需登录后执行远程命令,可直接追加到ssh命令后:
gcloud compute ssh INSTANCE_NAME \ --zone=INSTANCE_ZONE \ --project=PROJECT_ID \ --tunnel-through-iap \ --quiet \ --ssh-flag="-o StrictHostKeyChecking=no" \ --ssh-flag="-o UserKnownHostsFile=/dev/null" \ --command="sudo apt update && sudo apt upgrade -y"
二、服务账号所需IAM权限
需为服务账号绑定以下两类权限,可通过项目级或实例级IAM配置:
1. IAP隧道访问权限
- 必须绑定角色:
roles/iap.tunnelResourceAccessor(允许通过IAP建立到实例的隧道) - 绑定范围:可覆盖整个GCP项目,或仅目标GCE实例/实例组层级
2. GCE实例访问权限
需具备以下基础权限,可通过预定义角色或自定义角色实现:
compute.instances.get:获取实例基础信息compute.instances.connect:允许通过SSH连接实例compute.projects.get:获取项目基础信息(部分场景必需)
推荐绑定预定义角色roles/compute.instanceAdmin.v1(包含上述所有权限);若需最小权限,可创建自定义角色仅包含上述三个权限。
3. 额外配置要求
- 目标GCE实例所在VPC需配置防火墙规则,允许来自
35.235.240.0/20的TCP 22端口流量(IAP代理的固定IP段) - 确保服务账号凭证JSON文件有效且未过期
内容的提问来源于stack exchange,提问作者Gabriele B
相关产品推荐
相关产品推荐

