8
7

More than 5 years have passed since last update.

GCSの更新情報をCloud Pub/Subに通知するメモ

Last updated at Posted at 2018-10-07

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を使ったエクスポートが選べますが、これは別物です。

Cloud Dataflowによるエクスポートの実行

サブスクライバの設定

さて、これでGCSバケットにファイルを置くとPub/Subに情報がパブリッシュされるようになりました。

送られた情報を受け取るためにCloud Functionsでサブスクライバを設定してみましょう。

「Cloud Functions」「関数を作成」から「トリガー」「Cloud Pub/Sub」を選べば、サブスクライバの設定とfunctionの設定と両方を一気に行うことができます。

Cloud Functionsの設定例

デフォルトで定義される関数はペイロードの中身をログに出すだけの処理になっています。アトリビュートはevent['attributes']でアクセスできます(Pythonの場合)。

通知の中身

GCSからPub/Subにパブリッシュされるデータは次のようなものです。

payload
{
   "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="
}
attributes
{
  '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」を選んだ方が楽かもしれません。

参考URL

8
7
0

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
8
7