【问题标题】:Cloud Build fails with resource location constraintCloud Build 因资源位置限制而失败
【发布时间】:2018-11-08 11:17:22
【问题描述】:

我们制定了一项政策,将资源限制在欧盟地区。

当我尝试执行云构建时,gcloud 想要创建一个存储桶 (gs://[PROJECT_ID]_cloudbuild) 来存储暂存源。此步骤失败,因为使用了默认存储桶位置 ('us'):

"code": 412,
"message": "'us' violates constraint ‘constraints/gcp.resourceLocations’"

作为一种解决方法,我尝试传递位于有效区域中的现有存储桶(使用 --gcs-source-staging-dir),但我遇到了同样的错误。

如何解决?

这里是 HTTP 日志:

$ gcloud --log-http builds submit --gcs-source-staging-dir gs://my-custom-bucket/staging \
--tag gcr.io/xxxxxxxxxx/quickstart-image .
=======================
==== request start ====
uri: https://www.googleapis.com/storage/v1/b?project=xxxxxxxxxx&alt=json
method: POST
== headers start ==
accept: application/json
content-type: application/json
== headers end ==
== body start ==
{"name": "my-custom-bucket"}
== body end ==
==== request end ====
---- response start ----
-- headers start --
server: UploadServer
status: 412
-- headers end --
-- body start --
{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "conditionNotMet",
    "message": "'us' violates constraint ‘constraints/gcp.resourceLocations’",
    "locationType": "header",
    "location": "If-Match"
   }
  ],
  "code": 412,
  "message": "'us' violates constraint ‘constraints/gcp.resourceLocations’"
 }
}

-- body end --
---- response end ----
----------------------
ERROR: (gcloud.builds.submit) HTTPError 412: 'us' violates constraint ‘constraints/gcp.resourceLocations’

【问题讨论】:

    标签: google-cloud-platform


    【解决方案1】:

    我找到了解决这个问题的方法。创建项目后(启用资源位置限制),您应该在首选位置创建一个名为 [PROJECT_ID]_cloudbuild 的新存储桶。

    如果您不这样做,云构建提交将自动在美国创建一个存储桶,这是不可配置的。并且由于资源限制,cloud build 无法在美国创建此存储桶,并且失败并出现以下错误:

    ERROR: (gcloud.builds.submit) HTTPError 412: 'us' violates constraint 'constraints/gcp.resourceLocations'
    

    当您(手动)创建具有相同名称的存储桶时,cloudbuild 会将该存储桶作为默认存储桶。解决方案并未立即显现,因为对于在应用资源限制时已经有 cloudbuild 存储桶的项目,问题并未出现。

    【讨论】:

    • 我有同样的问题,但创建存储桶并没有为我解决这个问题。我仍然遇到同样的错误:(
    • 您是否删除了默认存储桶并在项目允许的区域中创建了一个名称完全相同的新存储桶?我已经为我们所有的 50 个项目都这样做了,它就像一个魅力。
    • 这对我有用。
    【解决方案2】:

    Cloud Build 将使用default bucket to store logs。您可以尝试将logsBucket 字段添加到具有特定存储桶的构建配置文件中,例如sn-p:

    steps:
    - name: 'gcr.io/cloud-builders/go'
      args: ['install', '.']
    logsBucket: 'gs://mybucket'
    

    您可以找到有关构建配置文件here的详细信息

    【讨论】:

    • 问题不是日志目录,而是暂存目录。
    • 对不起,布莱克,乍一看我误解了你的问题。由于您使用的是“资源位置限制”,因此您可以使用 --gcs-source-staging-dir 。您是否检查了登录的用户/服务帐户 gcloud 是否具有对自定义存储桶位置的写入权限?
    • 权限没问题。正如您在日志中看到的,用于创建存储桶的 API 是在没有位置属性的情况下调用的(根据 API 文档,默认为“我们”位置:https://cloud.google.com/storage/docs/json_api/v1/buckets/insert)。
    • 也许值得更改托管映像的 Container Registry 的位置。 'gcr.io' 在美国托管图像。例如,您可以使用“eu.gcr.io”主机名标记您的图像。在this 文档中,您可以找到更多选项。
    • 有一个开放的功能请求允许您选择构建发生的区域。你可以关注issue tracker
    【解决方案3】:

    Google 支持部门对我进行了调查。他们想出了以下答案:

    在与涉及此问题的不同团队进行调查后, 似乎是影响 Cloud Build 的限制(在这种情况下, 防止在美国分配资源)的目的。唯一的解决方法 从调查中得出的结论是创建一个新项目 没有允许使用 Cloud Build 的限制。

    他们还提到了feature request(@Christopher P 的评论中已经提到过——谢谢)

    【讨论】:

      【解决方案4】:

      我遇到了同样的位置限制问题,请按照以下步骤修复它

      1. 登录到 gcp 控制台后,选择您遇到问题的所需项目

      2. 然后从 IAM 控制台中选择“组织策略”。确保您拥有将其列出所需的权限

      3. 在列表中查找“Google Cloud Platform - 资源位置限制”政策。通常它属于自定义策略的类别

        请参考以下截图: location constraint

      4. 单击策略,单击编辑,在自定义值中向下拖动添加您想要的位置。

        在中使用前缀意味着它包括所有提及特定值的所有内容,使用不带前缀的位置名称

        这里“‘我们’违反了约束‘constraints/gcp.resourceLocations”

      5. 在自定义值中输入值 us 添加并保存,如果它需要 us-east 中的所有区域,则像这样提及前缀

        in:us-east4-locations
        

      希望这可行

      allowed values

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多