【问题标题】:Deploying cloud function using terraform fails - "Invalid function service account requested"使用 terraform 部署云功能失败 - “请求的功能服务帐户无效”
【发布时间】: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


    【解决方案1】:

    在您的 functions.tf 文件中,您这样定义了您的服务帐户

    service_account_email = "serviceAccount:${google_service_account.sa.email}"
    

    去掉serviceAccount:前缀

    service_account_email = "${google_service_account.sa.email}"
    

    【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2022-12-17
    • 2017-11-19
    • 2022-09-01
    • 2020-12-08
    • 2019-01-30
    • 2021-12-17
    • 2021-10-05
    • 1970-01-01
    相关资源
    最近更新 更多