如果已经创建,则忽略 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 主题和订阅之间的依赖关系