LoginSignup
7

More than 3 years have passed since last update.

posted at

updated at

Organization

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

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

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
What you can do with signing up
7