google-cloud-platform - 如何为 Cloud Build 用于 Cloud Run 部署的 Cloud Storage 存储分区指定区域?

标签 google-cloud-platform google-cloud-storage google-cloud-build google-cloud-run

在将 docker 容器镜像部署到 Cloud Run 时,我可以选择一个区域,这很好。 Cloud Run 将构建委托(delegate)给 Cloud Build,后者显然会创建两个存储桶来实现这一点。出乎意料的行为是未在 Cloud Run 部署的区域中创建存储桶,而是默认为多区域美国。

如何将区域指定为“us-east1”,以便“始终免费”层吸收存储成本? (显然,美国多区域存储桶将数据存储在免费层限制之外的区域中,这导致了一个意外的账单——我试图避免这个账单。)

如果重要的话,我也在这个项目中使用 Firebase。我在 us-east1 区域创建了 Firebase 默认存储桶,希望它也可能成为其他桶的默认存储桶,但事实并非如此。最终的存储桶列表如下所示,您可以在其中看到使用不需要的多区域设置自动创建的两个存储桶。

enter image description here

这是我用来构建和部署的 shell 脚本:

#!/bin/sh

project_id=$1
service_id=$2

if [ -z "$project_id" ]; then
    echo "First argument must be the Google Cloud project ID" >&2
    exit 1
fi

if [ -z "$service_id" ]; then
    echo "Second argument must be the Cloud Run app name" >&2
    exit 1
fi

echo "Deploying $service_id to $project_id"

tag="gcr.io/$project_id/$service_id"

gcloud builds submit \
    --project "$project_id" \
    --tag "$tag" \
&& \
gcloud run deploy "$service_id" \
    --project "$project_id" \
    --image "$tag" \
    --platform managed \
    --update-env-vars "GOOGLE_CLOUD_PROJECT=$project_id" \
    --region us-central1 \
    --allow-unauthenticated

最佳答案

正如您所提到的,Cloud Build 创建了一个或多个具有多区域的存储桶,因为在 Cloud Run 中创建服务时,只添加了部署服务所需的标志和参数。
documentation对于命令 gcloud builds submit为标志 --gcs-source-staging-dir 提及以下内容:

--gcs-source-staging-dir=GCS_SOURCE_STAGING_DIR

A directory in Google Cloud Storage to copy the source used for staging the build. If the specified bucket does not exist, Cloud Build will create one. If you don't set this field, gs://[PROJECT_ID]_cloudbuild/source is used.


由于未设置此标志,因此在 multi-region 中创建存储桶在 us .此行为也适用于标志 --gcs-log-dir .
现在,在您想要的双区域、区域或多区域中使用存储桶的必要步骤是使用 cloudbuild.yaml并使用标志--gcs-source-staging-dir .您可以执行以下操作:
  • 在您可能需要的区域、双区域或多区域中创建存储桶。例如,我在 australia-southeast1 中创建了一个名为“example-bucket”的存储桶。 .
  • 创建 cloudbuild.yaml文件。如前所述,这是将构建的工件存储在您想要的存储桶中所必需的 here .一个例子如下:

  • steps:
    - name: 'gcr.io/cloud-builders/gcloud'
        args:
        - 'run'
        - 'deploy'
        - 'cloudrunservice'
        - '--image'
        - 'gcr.io/PROJECT_ID/IMAGE'
        - '--region'
        - 'REGION_TO_DEPLOY'
        - '--platform'
        - 'managed'
        - '--allow-unauthenticated'
    artifacts:
        objects:
        location: 'gs://example-bucket'
        paths: ['*']
    
  • 最后,您可以运行以下命令:

  • gcloud builds submit --gcs-source-staging-dir="gs://example-bucket/cloudbuild-custom" --config cloudbuild.yaml
    
    前面提到的步骤可以适应您的脚本。请试一试 :) 你会发现即使 Cloud Run 服务部署在亚洲、欧洲或美国,之前指定的存储桶也可以在其他位置。

    关于google-cloud-platform - 如何为 Cloud Build 用于 Cloud Run 部署的 Cloud Storage 存储分区指定区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60982068/

    相关文章:

    google-cloud-platform - 写入 Spanner 的数据流作业中出现 EOFException

    node.js - 云函数 : Delete file on Cloud Storage when Firestore document is deleted

    javascript - 如何从客户端 React 应用程序使用 firebase 存储?

    laravel - 无法在Google Compute Engine上部署容器镜像

    google-apps-script - 在 Google App 脚本中额外授权运行 google chat

    node.js - 是否可以在多个项目上部署一个谷歌云功能?

    python - Google BigQuery API(Python 客户端库)> 查询数据(异步)

    csv - 从 Google Cloud Storage 加载 csv 文件时出现 BigQuery 错误

    docker - GCP中的Cloud Run服务显示 “Container failed to start and then listen on the port defined by the PORT environment variable” Codeigniter 4

    python - 在 Google Build 中使用 python 包