Google Cloud Storage の Object Change Notification をGoogle App Engineで受け取るための設定方法。
だいたい公式Documentの日本語訳みたいなものだけど、ちょいちょい注意点なんかもいれていくよ。
因みに Google Calendarの Push Notificationを使う場合も同じような設定が必要なはず。
Object Chage Notification (OCN) とは?
Google Cloud Storage (GCS) にObjectがUpload/Replace/Deleteされた時に、指定したURLへHTTPS POSTで通知を送ってくれる機能。
UserがUploadした画像にサムネイル作ったりとか、Uploadされたcsvを自動でBigQueryに取り込むとかやりたい時に使う。
設定はbucket単位で、一つのbucketに複数の設定を行うこともできる。
OCNへのResponseについて
OCNのRequestへのResponseとしてError Responseを返した場合、自動でリトライされる。
また、OCNへのResponseを20sec以内に返せなかった場合も、Errorとみなされて、リトライに入る。
リトライ間隔は最初は30secで、リトライする度に長くなっていき、最長90minにとなり、7日間リトライを続けます。
Success, Failure Response Code List
Success
- 102 Processing
- 200 OK
- 201 Created
- 202 Accepted
- 204 No Content
Failure
- 401 Unauthorized
- 404 Not Found
- 500 Internal Server Error
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
App EngineでOCNを受け取れるようにする
Domain Verify
OCNを送る先のApplicationのDomainを自分が持っていることを証明します。
Web Master Toolにアクセス
Add Property をクリック
App Engine ApplicationのURLを入力
ここで注意することが、httpsで設定してやることです。httpsで設定しなかった場合、後で行うPush Notificationの設定が通りません。
App EngineのModuleを使おうと思っている場合も、ここでModuleにアクセスするようにURLを設定します。今回はocn-receiverというModuleを使おうと思っているので、https://ocn-reciever-dot-{application id}.appspot.comで設定しています。
Domain Verify
Domain Verifyする方法はいくつかありますが、App Engineでやりやすい方法は2つ
- Web Master Toolが指定したHTML FileをDomainにdeploy
- Web Master Toolが指定したHTML Tagが入っているHTMLをDomainにdeploy
どちらでもやりやすい方を使ってください。
完了したら、こんな画面になります。
Push Notification Add domains
OCNを設定するbucketがあるGCP Projectで、Push Notificationを送ることができるDomainを追加
- API Manager -> Credentials -> Domain verification -> Add domainをクリック
-
{youar application app id}.appspot.com
を登録
App EngineのModuleを使おうと思っている場合は、ここでModuleにアクセスするようにDomainを設定します。今回はocn-receiverというModuleを使おうと思っているので、 ocn-reciever-dot-{application id}.appspot.com
で設定しました。
https://ocn-reciever-dot-{application id}.appspot.com
で登録すると、gsutilでOCNを設定しようとした時に、BadRequestException: 400 No valid domain for WebHook callback
と言われてしまうので注意!
これでApp EngineでOCNを受け取る準備は完了!
BucketにOCNを設定する
Service Account
OCNの設定するためにはService Accountが必要です。
Service Accountを作成していない場合は、まず以下の手順でDevelopers Consoleから作成してください。
- APIs & auth > Credentials.
- Create new Client IDをクリック
- Service Accountを選択
- Okayをクリック
Service AccountにbucketのFull Controlを与える
Service AccountがBucketを扱えるようにACLを追加します。
因みにService AccountがProjectのEditorに入っていれば、この設定は無くても大丈夫かもしれません。
gsutil acl ch -u {your service account}@developer.gserviceaccount.com:FC gs://{your bucket name}
gcloudのAccountをService Accountに設定
OCNをgsutilで設定するために、gcloud sdkの認証をService Accountに設定します。
$ gcloud auth activate-service-account {service-account-email} --key-file path/to/key.json
service-account-email, path/to/key.jsonは自分のService AccountのEmail, key.jsonを利用します。
key.jsonはService accountのCreate Keyをクリックすればdownloadできます。
gcloud auth listで以下のようになっていれば、OK
$ gcloud auth list
Credentialed accounts:
- {your service account}.gserviceaccount.com (active)
OCN設定
いよいよOCNを設定します。
設定はgsutil notification watchbucketで行います。
この時に返ってくるレスポンスのWatch channel identifier, resource identifierが無いと、OCNを止めれないので、保存しておいた方が良いです。
これを忘れると、今のところOCNのRequestのHeaderを見るしかなくなるので、必ずOCNを受け取ることができるWeb Applicationが必要になります。
$ gsutil notification watchbucket https://ocn-receiver-dot-cp300demo1.appspot.com/notify gs://{your bucket name}
Watching bucket gs://cp300demo1-ocn/ with application URL https://ocn-receiver-dot-cp300demo1.appspot.com/notify ...
Successfully created watch notification channel.
Watch channel identifier: ※※※※※※※※※※※
Canonicalized resource identifier: ※※※※※※※※※※※
Client state token: None
OCNを止める
設定するとファイルをUpload,Deleteする度に、OCN Messageが飛んでくるので、止めたい!と思った時は、gsutilで設定を消します。
この時に必要になるのがchannel identifier, resource identifierなので、OCNを設定した時に、何処かにメモって置くのが良いです。
メモってない場合、OCNをWeb Applicationで受け取って、Headerを見ることになります。
$ gsutil notification stopchannel {channel identifier} {resource identifier}