我正在尝试使用
gcloud
从 GitHub Actions 部署云函数,这是我的命令:
gcloud functions deploy delivery-channels \
--gen2 \
--runtime=nodejs20 \
--region=${{ env.GCP_LOCATION }} \
--source=workspaces/delivery-channels \
--trigger-http \
--entry-point=delivery-channel \
--allow-unauthenticated
此命令适用于我的“开发”项目,但现在我正在设置“生产”项目,但它失败了:
(gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[The caller does not have permission]
我创建服务帐户的方式是:
GH_SERVICE_ACCOUNT="serviceAccount:github-actions-${DEPLOYMENT_ENV}@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud iam service-accounts create github-actions-${DEPLOYMENT_ENV} --display-name="GitHub Actions (${DEPLOYMENT_ENV})"
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/alloydb.client
gcloud projects add-iam-policy-binding ${PROJECT_ID} --member="${GH_SERVICE_ACCOUNT}" --role='roles/cloudbuild.builds.builder'
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/cloudfunctions.admin
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/cloudfunctions.developer
gcloud iam service-accounts add-iam-policy-binding \
${PROJECT_NUMBER}[email protected] \
--member "${GH_SERVICE_ACCOUNT}" \
--role roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/cloudtasks.admin
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/container.admin
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/container.clusterViewer
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/serviceusage.serviceUsageConsumer
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/storage.admin
我不太确定我错过了什么,两行相关的行应该是:
gcloud projects add-iam-policy-binding $PROJECT_ID --member=${GH_SERVICE_ACCOUNT} --role=roles/cloudfunctions.developer
gcloud iam service-accounts add-iam-policy-binding \
${PROJECT_NUMBER}[email protected] \
--member "${GH_SERVICE_ACCOUNT}" \
--role roles/iam.serviceAccountUser
我还阅读了
cloudbuild.gserviceaccount.com
服务帐户有时也需要serviceAccountUser角色,所以我运行:
gcloud projects add-iam-policy-binding $PROJECT_ID --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com --role=roles/iam.serviceAccountUser
但我仍然遇到同样的错误。
您使用 gcloud 函数部署 和 --source 的命令适用于直接从本地目录或 Cloud Storage 存储桶进行部署。您使用的是 --source=workspaces/delivery-channels,它表示 workspace,但该命令无法将工作区识别为有效源。因此,根据您的首选部署方法,使用适当的 --source 参数更新您的 gcloud 函数部署命令。
您似乎添加了所需的 Cloud Functions 管理员角色 和 Cloud Functions 开发人员角色。如果您使用这种方法,还要确保服务帐号具有访问 Cloud Storage 所需的 IAM 角色。有关更多详细信息,请参阅云函数 IAM 角色。
该错误可能是由于服务帐户没有正确的权限或您没有使用正确的服务帐户引起的。因此,请检查以下故障排除步骤来解决问题:
检查您是否为服务帐户分配了适当的角色或权限。确保服务帐户已分配有generateIdToken方法或“服务帐户令牌创建者”角色
检查您是否使用了正确的服务帐号
确保 Google 管理的服务帐户和默认服务帐户之间没有混淆
Cloud Build 提供了从 GitHub Actions 部署 Cloud Functions 的最佳方式。您可以创建一个 Cloud Build 配置来构建、打包和部署您的函数。