我正在尝试将云函数 pubsub 订阅转发到死信主题,如下所述:https://cloud.google.com/pubsub/docs/dead-letter-topics#gcloud
我试过了
$ gcloud pubsub subscriptions update gcf-worker-topic --dead-letter-topic=gcf-worker-dead-letter-topic
并尝试在控制台中修改 gcf-worker-topic 订阅。两者都给了我相同的错误:
ERROR: (gcloud.pubsub.subscriptions.update) INVALID_ARGUMENT: The supplied AppEngine URL project does not match the subscription's parent project
目标是在云函数崩溃时将消息转发到死信队列。
我做错了什么? 这不受支持吗? 是否有未来支持计划?
当您将云函数直接插入主题时,会创建一个具有奇怪端点的自动推送订阅:
https://d4d1290519676f29baf13a7bf18a25bf-dot-jea3ef1cff72566d8-tp.appspot.com/_ah/push-handlers/pubsub/projects/PROJECT_ID/topics/test-topic?pubsub_trigger=true
您可以看到此网址是appspot.com
,这是 App Engine 的典型特征。因此,直接插入 PubSub 的云函数生成了一个奇怪的 Hack,它在外部/谷歌项目中使用 AppEngine。您无法更新它。
解决方法是在HTTP触发模式下更改云函数,并在其上创建PubSub推送订阅。但是,请注意,因为 PubSub 消息格式并不完全相同
- 使用推送订阅:
{
"message": {
"attributes": {
"key": "value"
},
"data": "SGVsbG8gQ2xvdWQgUHViL1N1YiEgSGVyZSBpcyBteSBtZXNzYWdlIQ==",
"messageId": "136969346945"
},
"subscription": "projects/myproject/subscriptions/mysubscription"
}
- 直接链接到云功能:https://cloud.google.com/functions/docs/calling/pubsub#event_structure
您可能还需要--dead-letter-topic-project
。见剂量。
我相信您正在更新topic id
(gcf-worker-topic(而不是subscription id
。
dead-letter-topic
是在订阅中定义的。尝试创建新订阅:
gcloud pubsub subscriptions create subscription-id
--topic=gcf-worker-topic
--dead-letter-topic=gcf-worker-dead-letter-topic
--max-delivery-attempts=max-delivery-attempts
[--dead-letter-topic-project=dead-letter-topic-project]