Pub/Sub の HTTP Push 先を Cloud Functions にする
所有権の検証いらなくなった
注: Pub/Sub では、push サブスクリプションの URL ドメインの所有権の証明が不要になりました。ドメインが Pub/Sub からの予期しない POST リクエストを受信した場合は、不正行為を報告できます。
---.icon
プロジェクト内なら Pub/Sub トリガのCloudFunctions
プロジェクト内で Pub/Sub メッセージを処理する Cloud Functions を作るなら、Pub/Sub トリガの Function を作成する
Pub/Sub は異なるプロジェクトのトピックを projects/{projectId}/topics/{topic} で参照し、メッセージを購読(subscription)できるが、Cloud Functions の Pub/Sub トリガでは外部の project を指定することはできない
(デプロイコマンドの --trigger-topic [TOPIC NAME] は projectIdを含めることができない)
Pull
sub 側が Pub/Sub API を叩いてメッセージを受信する方式
プロジェクトを横断してサービスアカウントに権限を付与すればできるはず(利用したことはない)
Push
Pub/Sub がメッセージを受信するたびに、特定の http エンドポイントへメッセージを POST する方式
外部の URL へメッセージを送りまくるため、送信先 http エンドポイントドメインの所有権の検証が必要になる。
2. GCP プロジェクトの API とサービス でドメインを確認(プロジェクトへ追加)する
上記の手順をふむことで、そのプロジェクト内で Push Subscription を設定できる
Cloud Functions で push subscription を受けとる
Push メッセージを受けとる http トリガで起動する Function を作る必要がある。
http 関数の URL は https://{region}-{projectId}.cloudfunctions.net/{functionName} の形式になる。
前段に所有権を検証した独自ドメインを置き、Cloud Endpoints から特定の Function を起動するのが正攻法だけど、Function 単体で済ませたい場合は以下のワークアラウンドが使える。
最もシンプルな HTML タグを利用するのがよい
<meta name="google-site-verification" content="確認用の文字列"> を html レスポンスに埋め込む方法
Function GET した際に上記 meta 要素を含む HTML をレスポンスする
Search Console で所有権を確認する & GCP プロジェクトでドメインの確認を行う
ドメインじゃないので "URL プレフィックス" で確認
https://gyazo.com/fc443e992a88deaf638992c338a1f571
クエリパラメータを含めることはできない
末尾は / で終わるように正規化される
ドメインの確認でも同様
PubSub Push エンドポイントは、確認したドメイン文字列が含まれていないといけない
ドメインの確認で末尾が / で終わるよう正規化されているので、末尾のスラッシュまでを含むエンドポイントが Push リクエストを受け付けるように設定しないといけない
必然的に、所有権を確認した URL 以下の階層でリクエストを受けることになる
もし Function トップで Push を受けたくないなら、express.js など任意のパスへリクエストを受けられる Function として構成し、PubSub を扱う階層を下げる(実際の動作は未確認)
/function ← 何らかの Function 本体の動作をするエンドポイント
/function/pubsub/ ← 所有権を確認したドメイン
/function/pubsub/push ← push subscription で設定する push 先エンドポイント
ドメイン単位の認証
http 関数のドメインは {region}-{projectId}.cloudfunctions.net で決まるので、大抵の場合プロジェクトで1回通せばpush 仕放題にならないかな、と思ったけど無理そう
https://gyazo.com/7a3aadf2aae3a9d3c2c93e41e66b1144