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

Posted

技术标签:

【中文标题】如果已经创建,则忽略 pubsub 主题【英文标题】:Ignore pubsub topic if it already created 【发布时间】: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,但没有成功。

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

【问题讨论】:

【参考方案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=="",这很好。 完美。非常感谢!!

以上是关于如果已经创建,则忽略 pubsub 主题的主要内容,如果未能解决你的问题,请参考以下文章

使用 terraform 脚本的 pubsub 主题和订阅之间的依赖关系

GCP PubSub主题权限

主题的 GCP PubSub 权限

在哪里可以检查或管理使用 Google Firebase 创建的 PubSub 主题?

无证约束?发布到主题 *from* pubsub 触发器

GCP PubSub 主题推送问题