【问题标题】:Ignore pubsub topic if it already created如果已经创建,则忽略 pubsub 主题
【发布时间】:2021-09-05 09:50:02
【问题描述】:

我有一个简单的脚本来部署 pubsub 应用程序。

此脚本将在我的 Cloud Run 服务的每次部署上运行,我有一行:

gcloud pubsub topics create some-topic

如果主题已经存在,我想改进我的脚本,目前如果我运行我的脚本,输出将是:

错误:无法创建主题 [projects/project-id/topics/some-topic]:项目中已存在资源 (resource=some-topic)。

错误:(gcloud.pubsub.topics.create) 未能创建以下内容:[some-topic]。

我尝试了标志--no-user-output-enabled,但没有成功。

如果资源已经存在,有没有办法忽略,或者有办法在创建前检查?

【问题讨论】:

    标签: gcloud google-cloud-pubsub gcloud-cli


    【解决方案1】:

    是的。

    您可以重复操作,如果事先不存在主题,则如果命令成功。

    你可以吞下stderr(用2>/dev/null),然后检查上一条命令($?)是否成功(0):

    gcloud pubsub topic create do-something 2>/dev/null
    if [ $? -eq 0 ]
    then
      # Command succeeded, topic did not exist
      echo "Topic ${TOPIC} did not exist, created."
    else
      # Command did not succeed, topic may (!) not have existed
      echo "Failure"
    fi
    

    注意这种方法忽略了这样一个事实,即命令可能会失败并且主题不存在(即其他问题)。

    或者(更准确,更昂贵!)您可以先枚举主题,然后尝试(!)创建它,如果它不存在:

    TOPIC="some-topic"
    RESULT=$(\
      gcloud pubsub topics list \
      --filter="name.scope(topics)=${TOPIC}" \
      --format="value(name)" 2>/dev/null)
    
    if [ "${RESULT}" == "" ]
    then
      echo "Topic ${TOPIC} does not exist, creating..."
      gcloud pubsub topics create ${TOPIC}
      if [ $? -eq 0 ]
      then
        # Command succeeded, topic created
      else
        # Command did not succeed, topic was not created
      fi
    fi
    

    根据您需要的复杂程度,您可以使用以下方法实现自动化:

    • 提供更好的错误处理和重试功能的任何 Google (Pub/Sub) 库。
    • Terraform 例如google_pubsub_topic

    【讨论】:

    • 运行命令gcloud pubsub topics list --filter=topicId=report.topic --format="value(topicId)"我收到警告:WARNING: The following filter keys were not present in any resource : topicId
    • 对不起...我从docs 拿走了它。让我启动一个项目并确认它应该是什么。
    • 文档不正确。请改用gcloud pubsub topics list --project=${PROJECT} --filter="name.scope(topics)=${TOPIC}" --format="value(name)"
    • 我的解决方案有问题。如果没有结果,gcloud --filter 将失败。如果您的主题为零,您将收到来自gcloud --filter 的错误。如果您想包含这种情况,请将2>/dev/null 添加到该命令的末尾以吞下错误...。您将继续获得RESULT=="",这很好。
    • 完美。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2012-12-14
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多