我尝试部署一个存储触发的云功能,虽然这个过程通常适用于同一组织中的许多项目和类似的设置,但从昨天开始,我很难做到这一点。
我可以在多个组织的所有GCP项目中观察到以下模式:
-
A类如果在昨天之前至少有一个存储触发功能已部署到项目中,我可以再次将相同的功能或新功能部署到该项目中,没有问题。
- 这些项目有一个云存储服务帐户,如存储>设置下的GCP控制台所示,即
$API_PROJECT_ID@gs-project-accounts.iam.gserviceaccount.com
- 我可以从云存储API项目检索此帐户。serviceAccount:get
- 这些项目有一个云存储服务帐户,如存储>设置下的GCP控制台所示,即
-
类别B如果昨天之前没有将存储触发功能部署到项目中,无论我是通过Cloud Build部署功能,还是通过GCP控制台创建简单的bucket功能,我都无法部署存储触发功能,即使当我只是按原样使用UI建议的示例代码并链接到项目中的默认bucket时也是如此。
- 这些项目没有云存储服务帐户,如存储>设置下的GCP控制台中所示
- 我也无法从云存储API项目检索此帐户。serviceAccount:get,我将看到
503 Backend Error
我在这两个类别之间的设置中找不到任何其他显著差异,特别是IAM和ACL,启用了API,我已经确保该函数始终与作为触发器资源的bucket在同一项目中创建。
使用gcloud functions deploy
时出错
$是收回的名称
gcloud functions deploy $FUNCTION_NAME --region=us-central1 --source=https://source.developers.google.com/projects/$PROJECT_ID/repos/$REPO_NAME/moveable-aliases/$BRANCH_NAME/paths/$FUNCTION_NAME/src --trigger-resource=$API_PROJECT_ID-input --trigger-event=google.storage.object.finalize --timeout=540 --runtime=python37 --entry-point=main --memory=128MB --project=$API_PROJECT_ID --retry
将显示属于B类的项目的此错误。
ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Failed to configure trigger GCS Bucket: $API_PROJECT_ID-input
在A类项目中做同样的事情会像预期的那样成功。
使用谷歌云控制台时出错
在页面创建功能上,
- 我选择
Cloud Storage
作为触发器 - 事件类型:`Finalize/Create*
- 作为存储桶,我选择一个默认存储桶,例如
$API_PROJECT_ID.appspot.com
- 默认情况下的所有其他内容,包括建议的示例代码
- 保存
对于B类的所有项目,部署都将失败,但对于A类的项目,部署成功。
UI中的部署状态消息显示以下错误:
Deployment failure:
Failed to configure trigger GCS Bucket: $API_PROJECT_ID
错误:未创建云存储服务帐户
然后,我开始比较设置,并注意到在GCP控制台的"云存储">"设置"下,只有类别A的项目具有云存储服务帐户。类别B的项目没有云存储服务帐户。因此,我尝试从API检索帐户:
https://cloud.google.com/storage/docs/json_api/v1/projects/serviceAccount/get
正如您所猜测的,我将仅为类别A中的项目获得具有相应云存储服务帐户名称的200 OK
,但对于类型B的所有项目,我将看到此错误响应,代码为503
:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "Backend Error"
}
],
"code": 503,
"message": "Backend Error"
}
}
从昨天开始,我已经为许多不同的项目尝试了几次,但都没有改变。
进一步信息和解决尝试
我已遵循以下说明:https://cloud.google.com/storage/docs/getting-service-account使用此页面上的API资源管理器:https://cloud.google.com/storage/docs/json_api/v1/projects/serviceAccount/get
我不能100%确定503错误、缺乏服务帐户和部署失败(代码13)的问题是否相关。但是IIRC,GCF的存储触发器实际上是基于Pub/Sub的,并且需要服务帐户,如GCP控制台中存储>设置下的帮助文本所述:
每个项目都有一个关联的云存储服务帐户。这用于执行某些后台操作:接收PubSub通知和加密/解密KMS加密的对象。
我也在这里阅读了有关此服务帐户的建议:https://cloud.google.com/storage/docs/projects#service-账户
我还尝试了以下解决方案:
- 使用gsutil IAM和GCP控制台比较了A类和B类项目之间的IAM
- 使用gsutil ACL比较A类和B类项目之间的ACL
- 通过API其他具有不同预定义的测试桶手动部署
- 删除了bucket
$API_PROJECT_ID-input
,并在没有预定义Acl的情况下再次部署 - 使用了已自动创建的项目的默认存储桶,例如
$API_PROJECT_ID.appspot.com
- 为类别B中的项目更新了云部署管理器的部署配置
- 尝试禁用和启用几个API,但为了避免引发其他问题,大多数API都不会这样做
- 为类别B中的项目启用了云构建API(有趣的是,这只是在那时才将不同云构建服务帐户的继承IAM权限带入
$API_PROJECT_ID-input
存储桶的IAM中) - 将
Storage Object Creator
角色添加到默认服务帐户($API_PROJECT_ID@appspot.gserviceaccount.com)
我打开了一个案例,后来GCP支持部门通知我,这是一个影响不到1%项目的一般问题。
截至2019-01-11星期五17:48美国/太平洋地区,我们收到了一份关于谷歌云Pub/Sub问题的报告。我们将在2019-01-11星期五18:30之前提供更多信息。
背景信息:Cloud函数的bucket触发器使用Cloud Pub/Sub。