【发布时间】:2020-11-26 21:56:32
【问题描述】:
我想部署一个谷歌云函数,我希望使用 terraform 来实现。我还希望创建一个服务帐户作为非默认服务帐户来运行该功能,如Function Identity > Per-function identity 所述。该服务帐号的 ID 是 dataflowdemo。
我创建了一个服务帐户,希望用于运行我的部署(与上一段中提到的服务帐户不同),该服务帐户的 ID 是 deployer:
export PROJECT=myproject
gcloud iam service-accounts create --project $PROJECT deployer
我按照Terraform Google Provider > Adding credentials 的说明下载了一个可以在“$GOOGLE_APPLICATION_CREDENTIALS”中引用的密钥文件:
export GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/deployer.json
gcloud iam service-accounts keys create \
--project $PROJECT \
--iam-account deployer@${PROJECT}.iam.gserviceaccount.com $GOOGLE_APPLICATION_CREDENTIALS
并已授予它必要的权限
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/storage.admin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/cloudfunctions.admin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/iam.serviceAccountAdmin"
gcloud projects add-iam-policy-binding $PROJECT --member="serviceAccount:deployer@${PROJECT}.iam.gserviceaccount.com" --role="roles/iam.roleAdmin"
terraform 代码相当简单,它创建dataflowdemo 服务帐户并将该服务帐户指定为云功能的非默认服务帐户。代码可在https://github.com/jamiekt/dataflowdemo/tree/6775ff7fd395320705a82ecb16f3fb054993ed57 获得。
我像这样运行 terraform 部署:
terraform init && terraform apply --auto-approve
它随后失败:
错误:googleapi:错误 400:请求的功能服务帐户无效:serviceAccount:dataflowdemo@myproject.iam.gserviceaccount.com。请访问https://cloud.google.com/functions/docs/troubleshooting 获取深入的故障排除文档。badRequest
我访问了错误消息中给出的链接:
但是,要使用非默认运行时服务帐户,部署者必须对该非默认帐户具有 iam.serviceAccounts.actAs 权限。 创建非默认运行时服务帐户的用户会自动获得此权限
函数部署者(即deployer 服务帐户)与创建函数的帐户相同,因此我很困惑为什么会失败。
请有人告诉我哪里出了问题以及我需要做些什么来解决它?
【问题讨论】:
标签: google-cloud-functions google-cloud-iam