如何在Google Cloud Build中忽略标签绑定的ALREADY_EXISTS错误?
解决GCP Cloud Build中BigQuery策略标签绑定的ALREADY_EXISTS错误问题
问题背景
在GCP部署流程中,使用Terraform管理基础设施,但截至2024年夏季,多区域(如US)BigQuery数据集的策略标签绑定无法通过Terraform或常规gcloud命令实现,只能依赖gcloud alpha命令执行绑定操作:
gcloud alpha resource-manager tags bindings create \ --tag-value=$tag_value \ # 格式为"tagValues/12345678" \ --parent=$parent \ # BigQuery数据集,格式为"//bigquery.googleapis.com/projects/<project>/datasets/<dataset>" \ --location=US
但当标签已存在时,gcloud会抛出如下错误,导致Cloud Build流水线误失败:
ERROR: (gcloud.alpha.resource-manager.tags.bindings.create) ALREADY_EXISTS: A binding already exists between the given resource and TagValue.
需要修改Cloud Build脚本,捕获该错误并静默处理,避免构建因标签已存在而失败。
修改后的Cloud Build脚本
只需调整「将策略标签绑定到资源」步骤的命令逻辑,在执行gcloud命令后检查错误输出,仅当错误不是ALREADY_EXISTS时才终止流水线:
# 此流水线用于添加/2-terraform中定义的基础设施 steps: - id: 'terraform init' name: 'hashicorp/terraform:1.7.5' entrypoint: 'sh' args: - '-c' - | cd infrastructure/2-insights-infra/2-terraform terraform init - id: 'terraform plan' name: 'hashicorp/terraform:1.7.5' entrypoint: 'sh' args: - '-c' - | cd infrastructure/2-insights-infra/2-terraform terraform plan - id: 'terraform apply' name: 'hashicorp/terraform:1.7.5' entrypoint: 'sh' args: - '-c' - | cd infrastructure/2-insights-infra/2-terraform terraform apply -auto-approve - id: '捕获terraform输出供下一步使用' name: 'hashicorp/terraform:1.7.5' entrypoint: 'sh' args: - '-c' - | cd infrastructure/2-insights-infra/2-terraform echo "$(terraform output project | tr -d '"')" > /workspace/project.txt echo "$(terraform output -json tag_values_by_dataset)" > /workspace/tag_values_by_dataset.json echo "$(terraform output tagged_datasets | tr -d '",][')" > /workspace/datasets.txt - id: '将策略标签绑定到资源' name: 'gcr.io/cloud-builders/gcloud' entrypoint: bash args: - '-c' - | project=$(cat /workspace/project.txt) tag_values_by_dataset=$(cat /workspace/tag_values_by_dataset.json) datasets=$(cat /workspace/datasets.txt) for dataset in $datasets; do parent=$(echo "//bigquery.googleapis.com/projects/$project/datasets/$dataset") tag_values=$(echo "$tag_values_by_dataset" | sed -r "s|.*$dataset\":[^:]*:\"tagValues([^\"]+)\".*|tagValues\1|") for tag_value in $tag_values; do # 执行绑定命令并捕获错误输出 error_output=$(gcloud alpha resource-manager tags bindings create \ --tag-value=$tag_value \ --parent=$parent \ --location=$_LOCATION 2>&1) # 检查命令执行状态和错误内容 if [ $? -ne 0 ]; then if echo "$error_output" | grep -q "ALREADY_EXISTS"; then echo "标签绑定已存在,忽略错误: $tag_value -> $parent" else echo "$error_output" exit 1 fi else echo "标签绑定成功: $tag_value -> $parent" fi done done substitutions: _LOCATION: US
核心修改说明
- 执行
gcloud绑定命令时,同时捕获标准输出和错误输出 - 判断命令执行状态:
- 若执行成功,输出绑定成功提示
- 若执行失败,检查错误内容是否包含
ALREADY_EXISTS:- 若是,输出忽略提示并继续后续操作
- 若否,输出错误信息并终止流水线,确保真实错误被及时识别
内容的提问来源于stack exchange,提问作者Mike Williamson
相关产品推荐
相关产品推荐

