ぽくつなです

Cloud Functions PubSub トリガはデフォルトでは再送しない

タイトルそのまま

以下のように Cloud Functions をデプロイすることで、トピックへメッセージが来るたびに function を起動してくれる。

$ gcloud functions deploy --trigger-topic=TOPIC_NAME

裏では gcf-{function}-{topic} という設定のサブスクプションが作られる。挙動的にも PubSub のコンソール上でも Push 型のサブスクプションで、Push は成功するまで retry してくれるイメージでいたけど、デフォルトはしてくれないのだった。

f:id:pokutuna:20200221034959p:plain:w300

function には2種類あり、HTTP リクエストを受け付ける HTTP 関数と、それ以外の PubSub メッセージや Cloud Storage イベントなどを受け取るバックグラウンド関数がある。

push サブスクリプションの使用  |  Cloud Pub/Sub ドキュメント  |  Google Cloud
このページを読んで、Push 型は成功の応答をしないと再送してくれると思い込んでいたけど、HTTP 関数に対する言及でしかない。PubSub メッセージを受けるのはバックグラウンド関数で、こちらのデフォルトは再送なし! 上記の画像のように、Function のコンソールでチェックを入れるか、デプロイ時に --retry フラグを渡しておく必要がある。

ちゃんと読めばここに書いてある。
バックグラウンド関数の再試行  |  Cloud Functions のドキュメント  |  Google Cloud
メッセージのタイムスタンプを見てメッセージを捨てたり、Error を throw するのではなく return するサンプルが載っててためになる(でも return したからといって Error Reporting へ通知されたりはしない)。

リンク