0

我有一个简单的脚本来部署 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,但没有成功。

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

4

1 回答 1

5

是的。

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

您可以吞下 stderr (with 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
于 2021-06-21T21:30:32.190 回答