Carpe Diem

備忘録

Google Cloud Pub/SubでPush(Webhook)型のSubscriptionを設定するにはドメイン認証が必要

概要

タイトルの通りなのですが日本語記事がなかったのでまとめておきます。

経緯

developers.cyberagent.co.jp

の対応でGooglePlayの定期購読ユーザの購読状態をリアルタイムに更新するため、Real-time developer notificationsを導入しました。

その際Pub/SubのPush型Subscriptionでリアルタイムにwebhookが飛ぶようにPush型のSubscriptionを設定したのですが、Google Domains管理下に無い独自ドメインだとINVALID_ARGUMENTというエラーが出ていました。
日本語だとエラーがより分かりにくかった記憶です。残念ながらスクショ等撮っておらず覚えてません。

ググって見ると以下の記事がヒットし、ドメインの認証が必要であることが分かりました。

stackoverflow.com

ドキュメントにも以下のように書いてあります。

Cloud Pub/Sub では、望ましくないトラフィックを防止するために、push エンドポイントの所有権を検証する必要があります。次のものを除き、エンドポイントでは後続の手順を実行する必要があります。

Using push subscriptions  |  Cloud Pub/Sub Documentation  |  Google Cloud

Pub/Subは大量のメッセージを扱えるため、好き勝手にエンドポイントを設定できたらそれだけでDoS攻撃ができてしまいますし当然といえば当然な制限ですね。

手順

大きく2つのステップを踏みます。

  1. ドメインの認証をする
  2. Webhookに使うサブドメインの登録をする

1. ドメイン認証をする

まず以下のURLに飛びます。

https://console.cloud.google.com/apis/credentials/domainverification

そしてドメインの追加を押します。

f:id:quoll00:20190620001958p:plain

以下のポップアップが出るのでドメインを入力せずに、Search Consoleのリンクをクリックします。

f:id:quoll00:20190620003019p:plain

2019/02から新しいコンソールができたので、新しいSearch Consoleを使用するをクリック

f:id:quoll00:20190620003234p:plain

ハンバーガーメニューからプロパティの追加をクリック

f:id:quoll00:20190620003600p:plain

新機能のドメインの方に、認証したいドメインを入力

f:id:quoll00:20190620003900p:plain

以下のようにこのTXTレコードを追加してねと指定されるので

f:id:quoll00:20190620004049p:plain

自分の独自ドメインDNSの設定に上記のTXTレコードを追加します。
追加してdigで確認できたら

$ dig xxx.yyy txt

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;xxx.yyy.                                IN      TXT

;; ANSWER SECTION:
xxx.yyy.                 3600    IN      TXT     "google-site-verification=hogehoge-fugafuga"

先程のダイアログの確認ボタンを押します。

すると確認完了のダイアログが表示されます。

f:id:quoll00:20190620004857p:plain

2. Webhookに使うサブドメインの登録をする

先程サブドメインを入力しなかった画面で、今度は登録して追加ボタンを押します。

f:id:quoll00:20190620005807p:plain

するとドメインが登録され、SubscriptionのPushのエンドポイントとして利用することができるようになります。

f:id:quoll00:20190620005543p:plain

まとめ

一度ドメイン認証をしてしまえばサブドメインはさくっと追加することが可能です。
ただ新しいドメインの場合は都度認証が必要になります。

Push型はPull型と違ってハンドリングしやすくリアルタイム性も担保できるので是非活用したいですね。