Pub/Sub と Cloud Functions を利用して GCS バケット間でオブジェクトを同期する方法
この記事では、Pub/Sub と Cloud Functions を利用して GCS バケット間でオブジェクトを同期する方法について紹介します。
Cloud Functions 以外のリソースは全て Terraform でデプロイし、Cloud Functions のみ CLI でデプロイします。
構成図

サンプルソースディレクトリ構造
この記事で使用する各種ソースのディレクトリ構造は以下の通りです。
Cloud Functions
Cloud Fuctions にデプロイする Python コードと requirements.txt は以下の通りです。
main.py の処理フローの概要
- pubsub からメッセージを pull する
- 取得済みのメッセージを ack する
- メッセージに含まれるオブジェクト名を使って GCS 間でオブジェクトをコピーする
main.py
requirements.txt
Cloud Functions デプロイ
CLI で Cloud Functions をデプロイします。
CLI で Cloud Functions をデプロイすることで、新バージョンのデプロイの手間を省くための CI/CD 環境を構築しやすくなるメリットがあります。
Cloud Functions 以外のリソースは下記の Terraform コードを使用してデプロイします。
provider.tf
main.tf
variables.tf
上記 Terraform を環境に適用する際は下記コマンドを実行します。
作成されるリソースの概要
| address | mode | type |
| :-------------------------------------------------------------- | :------ | :------------------------------------- | ----- |
| data.google_cloudfunctions_function.pubsub_client_function | data | google_cloudfunctions_function |
| data.google_compute_default_service_account.gce_service_account | data | google_compute_default_service_account |
| data.google_storage_project_service_account.gcs_service_account | data | google_storage_project_service_account |
| google_cloud_scheduler_job.scheduler["pubsub"] | managed | google_cloud_scheduler_job |
| google_pubsub_subscription.subscription["pubsub"] | managed | google_pubsub_subscription |
| google_pubsub_topic.topic["pubsub"] | managed | google_pubsub_topic | topic |
| google_pubsub_topic_iam_binding.binding_pubsub["pubsub"] | managed | google_pubsub_topic_iam_binding |
| google_storage_bucket.dst_bucket["pubsub"] | managed | google_storage_bucket |
| google_storage_bucket.src_bucket["pubsub"] | managed | google_storage_bucket |
| google_storage_notification.notification["pubsub"] | managed | google_storage_notification |
動作確認
GCS(src)にサンプルファイルをアップロード
下記コマンドを実行して、storage ディレクトリ配下にある upload1.txt、upload2.txt、upload3.txt を GCS へアップロードします。
GCS へアップロードされました。

Cloud Functions ログ
5 分おきに起動する Cloud Scheduler により Cloud Function が起動できていることがわかります。

GCS(dst)確認
Cloud Fuction が GCS へファイルを転送したか確認します。
upload1.txt、upload2.txt、upload3.txt が pubsub-demo-dst-bucket に存在するため転送されていることがわかります。

参考