Google Cloud Storage (GCS)の各種更新情報をCloud Pub/Subにpublishするよう設定したのですが、意外と手順が多かったので備忘録の意味で記事にしておきます。
gsutilコマンドでGCSからPub/Subへの通知を設定する
まず次のものを用意します。
- 更新情報を知りたいGCSのバケット
- 更新情報を流すCloud Pub/Subのtopic
次にgsutilコマンドで次のようにタイプします。
$ gsutil notification create -f json -t projects/[PROJECT_NAME]/topics/example-topic gs://example-storage
これでGCSからPub/Subへの通知設定ができました。
ちなみにGCPコンソールの「Storage」「ブラウザ」から各バケットのオプション「Cloud Pub/Subにエクスポート」というメニューでDataflowを使ったエクスポートが選べますが、これは別物です。
サブスクライバの設定
さて、これでGCSバケットにファイルを置くとPub/Subに情報がパブリッシュされるようになりました。
送られた情報を受け取るためにCloud Functionsでサブスクライバを設定してみましょう。
「Cloud Functions」「関数を作成」から「トリガー」「Cloud Pub/Sub」を選べば、サブスクライバの設定とfunctionの設定と両方を一気に行うことができます。
デフォルトで定義される関数はペイロードの中身をログに出すだけの処理になっています。アトリビュートはevent['attributes']
でアクセスできます(Pythonの場合)。
通知の中身
GCSからPub/Subにパブリッシュされるデータは次のようなものです。
{
"kind": "storage#object",
"id": "example-storage-0/example.txt/1538910622649455",
"selfLink": "https://www.googleapis.com/storage/v1/b/example-storage-0/o/example.txt",
"name": "example.txt",
"bucket": "example-storage-0",
"generation": "1538910622649455",
"metageneration": "1",
"contentType": "text/plain",
"timeCreated": "2018-10-07T11:10:22.649Z",
"updated": "2018-10-07T11:10:22.649Z",
"storageClass": "REGIONAL",
"timeStorageClassUpdated": "2018-10-07T11:10:22.649Z",
"size": "8",
"md5Hash": "H/hCXuUOBquznL0JpP4ApA==",
"mediaLink": "https://www.googleapis.com/download/storage/v1/b/example-storage-0/o/example.txt?generation=1538910622649455&alt=media",
"crc32c": "u9BeSg==",
"etag": "CO+YhOiY9N0CEAE="
}
{
'bucketId': 'example-storage-0',
'eventTime': '2018-10-07T11:10:22.649192Z',
'eventType': 'OBJECT_FINALIZE',
'notificationConfig': 'projects/_/buckets/example-storage-0/notificationConfigs/1',
'objectGeneration': '1538910622649455',
'objectId': 'example.txt',
'payloadFormat': 'JSON_API_V1'
}
私の理解ではペイロードが通知の本文、アトリビュートが付属情報のようなものです。GCSからの通知の場合、ペイロードに対象のファイルの情報がJSON形式で格納されており、アトリビュートにはそれ以外の情報が格納されるようです。
eventType
アトリビュートのうち、eventTypeはファイル操作の種類を示すものです。現在、次の4つが定義されています。
- OBJECT_FINALIZE ファイル作成
- OBJECT_METADATA_UPDATE メタデータ変更
- OBJECT_DELETE ファイル削除
- OBJECT_ARCHIVE アーカイブ
全ての操作は上記の操作の1つ以上の組み合わせで実現されています。たとえば、ファイル名の変更はDELETEとFINALIZEの2操作を連続して行っています。
補足
GCSのファイルの生成だけをフックしたい場合はCloud Functionsで「トリガー」「Cloud Storage」を選んだ方が楽かもしれません。