如果已创建,则忽略 pubsub 主题

Skh*_*haz 2 gcloud google-cloud-pubsub gcloud-cli

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

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

gcloud pubsub topics create some-topic
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有没有办法忽略资源是否已存在,或者在创建之前进行检查?

Daz*_*kin 5

是的。

您可以重复该操作,因为您知道,如果该主题之前不存在,那么如果该命令成功,该主题就会存在。

你可以吞掉 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
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

根据您需求的复杂性,您可以自动化使用:

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

  • 该文档不正确。请尝试使用 `gcloud pubsub topic list --project=${PROJECT} --filter="name.scope(topics)=${TOPIC}" --format="value(name)"` (2认同)
  • 我的解决方案有问题。如果没有结果,`gcloud --filter` 将失败。如果您的主题为零,您将从“gcloud --filter”中收到错误。如果您想包含这种情况,请将 `2>/dev/null` 添加到该命令的末尾以消除错误......您将继续得到 `RESULT==""` 这很好。 (2认同)