LoginSignup
27
23

More than 5 years have passed since last update.

Object Change NotificationをApp Engineで受け取る設定

Last updated at Posted at 2015-08-11

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で設定しています。

Screen Shot 2015-08-10 at 11.02.02.png

Domain Verify

Domain Verifyする方法はいくつかありますが、App Engineでやりやすい方法は2つ

  • Web Master Toolが指定したHTML FileをDomainにdeploy
  • Web Master Toolが指定したHTML Tagが入っているHTMLをDomainにdeploy

どちらでもやりやすい方を使ってください。
完了したら、こんな画面になります。

Search_Console_-_Home.png

Push Notification Add domains

OCNを設定するbucketがあるGCP Projectで、Push Notificationを送ることができるDomainを追加

  • API Manager -> Credentials -> Domain verification -> Add domainをクリック

Screen Shot 2016-07-07 at 19.34.48.png

  • {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}
27
23
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
23