このチュートリアルでは、Eventarc を使用して、一般公開 BigQuery データセットに対するクエリのスケジューリング、データに基づいたグラフの生成、メールによるグラフのリンクの共有を行う処理パイプラインを構築する方法について説明します。
目標
このチュートリアルでは、未認証アクセスを許可し、Eventarc を使用してイベントを受信する 3 つの Cloud Run サービスをビルドしてデプロイします。
- Query Runner - Cloud Scheduler ジョブが Pub/Sub トピックにメッセージを公開するとトリガーされます。このサービスは、BigQuery API を使用して一般公開の COVID-19 データセットからデータを取得し、結果を新しい BigQuery テーブルに保存します。
- Chart Creator - Query Runner サービスが Pub/Sub トピックにメッセージを公開するとトリガーされます。このサービスは、Python プロット ライブラリ(Matplotlib)を使用してグラフを生成し、Cloud Storage バケットに保存します。
- Notifier - Chart Creator サービスが Cloud Storage バケットにグラフを保存すると監査ログによってトリガーされます。このサービスは、メールサービス(SendGrid)を使用して、グラフのリンクをメールアドレスに送信します。
次の図は、アーキテクチャの概要を示しています。
費用
このドキュメントでは、課金対象である次のコンポーネントを使用します。 Google Cloud
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、 制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- アカウントにログインします。 Google Cloud を初めて使用する場合は、 アカウントを作成して、 実際のシナリオでプロダクトがどのように機能するかを評価してください。 Google Cloud新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを作成または選択します Google Cloud 。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法を確認する。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Logging、Cloud Run、Cloud Scheduler、Eventarc、Pub/Sub API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enableロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します:
gcloud init -
プロジェクトを作成または選択します Google Cloud 。
プロジェクトを選択または作成するために必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、プロジェクト作成者ロール
(
roles/resourcemanager.projectCreator)が必要です。これにはresourcemanager.projects.create権限が含まれています。ロールを付与する方法を確認する。
-
プロジェクトを作成します。 Google Cloud
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Logging、Cloud Run、Cloud Scheduler、Eventarc、Pub/Sub API を有効にします。
API を有効にするために必要なロール
API を有効にするには、 権限を含む Service Usage 管理者 IAM ロール(
roles/serviceusage.serviceUsageAdmin)が必要です。serviceusage.services.enableロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com - Cloud Storage 向けには、
ADMIN_READ、DATA_WRITE、DATA_READのデータアクセス タイプの監査ロギングを有効にします。- プロジェクト、フォルダ、または組織に関連付けられた Identity and Access Management(IAM)ポリシーを読み取り、一時ファイルに保存します。 Google Cloud
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- テキスト エディタで
/tmp/policy.yamlを開き、 監査ログの構成のみをauditConfigsセクションで追加または変更します。auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- 新しい IAM ポリシーを作成します。
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
上記のコマンドで別の変更との競合が報告された場合は、IAM ポリシーの読み取りからやり直してください。詳細については、API でデータアクセス監査ログを構成するをご覧ください。
- プロジェクト、フォルダ、または組織に関連付けられた Identity and Access Management(IAM)ポリシーを読み取り、一時ファイルに保存します。 Google Cloud
- Compute Engine サービス アカウントに
eventarc.eventReceiverロールを付与します。export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- 2021 年 4 月 8 日以前に Pub/Sub サービス アカウントを有効にした場合は、Pub/Sub サービス アカウントに
iam.serviceAccountTokenCreatorロールを付与します。gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- このチュートリアルで使用するデフォルトを設定します。
export REGION=REGION gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
REGIONは、サポートされている Eventarc のロケーションに置き換えます。
SendGrid API キーを作成する
SendGrid はクラウドベースのメール プロバイダで、メールサーバーを維持せずにメールを送信できます。
- SendGrid にログインし、[Settings] > [API Keys] の順に移動します。
- [Create API Key] をクリックします。
- キーの権限を選択します。メールを送信するには、キーに少なくとも Mail send(メール送信)の権限が必要です。
- キーに名前を付け、キーを作成するには [保存] をクリックします。
- SendGrid によって、新しいキーが生成されます。これは、キーの唯一のコピーであるため、後で使用できるようにキーをコピーして保存してください。
Artifact Registry 標準リポジトリを作成する
Docker コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY は、リポジトリの一意の名前に置き換えます。
Cloud Storage バケットを作成する
グラフを保存する一意の Cloud Storage バケットを作成します。バケットとグラフが Cloud Run サービスと同じリージョンで一般公開されていることを確認します。
export BUCKET="$(gcloud config get-value core/project)-charts" gcloud storage buckets create gs://${BUCKET} --location=$(gcloud config get-value run/region) gcloud storage buckets update gs://${BUCKET} --uniform-bucket-level-access gcloud storage buckets add-iam-policy-binding gs://${BUCKET} --member=allUsers --role=roles/storage.objectViewer
Notifier サービスのデプロイ
Chart Creator イベントを受信し、SendGrid でグラフのリンクをメールで送信する Cloud Run サービスをデプロイします。
GitHub リポジトリのクローンを作成して、
notifier/pythonディレクトリに移動します。git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
コンテナ イメージをビルドして push します。
export SERVICE_NAME=notifier docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
コンテナ イメージを Cloud Run にデプロイし、メールの送信先アドレスと SendGrid API キーを渡します。
export TO_EMAILS=EMAIL_ADDRESS export SENDGRID_API_KEY=YOUR_SENDGRID_API_KEY gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars TO_EMAILS=${TO_EMAILS},SENDGRID_API_KEY=${SENDGRID_API_KEY},BUCKET=${BUCKET} \ --allow-unauthenticated
次のように置き換えます。
EMAIL_ADDRESSは、生成されたグラフのリンクを送信するメールアドレスで置き換えます。YOUR_SENDGRID_API_KEYは、前にメモした SendGrid API キーで置き換えます。
サービス URL が表示されたら、デプロイは完了しています。
Notifier サービスのトリガーの作成
Cloud Run にデプロイされた Notifier サービスの Eventarc トリガーは、methodName が storage.objects.create の Cloud Storage 監査ログをフィルタリングします。
トリガーを作成します。
gcloud eventarc triggers create trigger-${SERVICE_NAME} \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.audit.log.v1.written" \ --event-filters="serviceName=storage.googleapis.com" \ --event-filters="methodName=storage.objects.create" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
これにより、
trigger-notifierというトリガーが作成されます。
Chart Creator サービスのデプロイ
Query Runner イベントを受け取り、特定の国の BigQuery テーブルからデータを取得し、Matplotlib を使用してそのデータからグラフを生成する Cloud Run サービスをデプロイします。グラフが Cloud Storage バケットにアップロードされます。
chart-creator/pythonディレクトリに移動します。cd ../../chart-creator/python
コンテナ イメージをビルドして push します。
export SERVICE_NAME=chart-creator docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
コンテナ イメージを Cloud Run にデプロイし、
BUCKETを渡します。gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET} \ --allow-unauthenticated
サービス URL が表示されたら、デプロイは完了しています。
Chart Creator サービスのトリガーの作成
Cloud Run にデプロイされた Chart Creator サービスの Eventarc トリガーは、Pub/Sub トピックに公開されたメッセージをフィルタします。
トリガーを作成します。
gcloud eventarc triggers create trigger-${SERVICE_NAME} \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"
これにより、
trigger-chart-creatorというトリガーが作成されます。Pub/Sub トピックの環境変数を設定します。
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)'))
Query Runner サービスのデプロイ
Cloud Scheduler イベントを受け取り、一般公開の COVID-19 データセットからデータを取得し、結果を新しい BigQuery テーブルに保存する Cloud Run サービスをデプロイします。
processing-pipelinesディレクトリに移動します。cd ../../..
コンテナ イメージをビルドして push します。
export SERVICE_NAME=query-runner docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
コンテナ イメージを Cloud Run にデプロイし、
PROJECT_IDとTOPIC_QUERY_COMPLETEDを渡します。gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars PROJECT_ID=$(gcloud config get-value project),TOPIC_ID=${TOPIC_QUERY_COMPLETED} \ --allow-unauthenticated
サービス URL が表示されたら、デプロイは完了しています。
Query Runner サービスのトリガーの作成
Cloud Run にデプロイされた Query Runner サービスの Eventarc トリガーは Pub/Sub トピックに公開されたメッセージをフィルタします。
トリガーを作成します。
gcloud eventarc triggers create trigger-${SERVICE_NAME} \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"
これにより、
trigger-query-runnerというトリガーが作成されます。Pub/Sub トピックの環境変数を設定します。
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)')
ジョブのスケジュール設定
処理パイプラインは、2 つの Cloud Scheduler ジョブによってトリガーされます。
Cloud Scheduler に必要な App Engine アプリを作成し、適切なロケーションを指定します。
export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
1 日に 1 回 Pub/Sub トピックに公開する Cloud Scheduler ジョブを 2 つ作成します。
gcloud scheduler jobs create pubsub cre-scheduler-uk \ --schedule="0 16 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="United Kingdom"
gcloud scheduler jobs create pubsub cre-scheduler-cy \ --schedule="0 17 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="Cyprus"
スケジュールは unix-cron 形式で指定します。たとえば、
0 16 * * *はジョブが毎日午後 4 時(UTC)に実行されることを意味します。
パイプラインの実行
まず、すべてのトリガーが正常に作成されたことを確認します。
gcloud eventarc triggers list
出力は次のようになります。
NAME: trigger-chart-creator TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: chart-creator ACTIVE: Yes LOCATION: us-central1 NAME: trigger-notifier TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: notifier ACTIVE: Yes LOCATION: us-central1 NAME: trigger-query-runner TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: query-runner ACTIVE: Yes LOCATION: us-central1Cloud Scheduler ジョブ ID を取得します。
gcloud scheduler jobs list
出力は次のようになります。
ID LOCATION SCHEDULE (TZ) TARGET_TYPE STATE cre-scheduler-cy us-central1 0 17 * * * (Etc/UTC) Pub/Sub ENABLED cre-scheduler-uk us-central1 0 16 * * * (Etc/UTC) Pub/Sub ENABLEDジョブは毎日午後 4 時から午後 5 時に実行されるようにスケジュールされていますが、Cloud Scheduler ジョブを手動で実行することもできます。
gcloud scheduler jobs run cre-scheduler-cy gcloud scheduler jobs run cre-scheduler-uk
数分後、Cloud Storage バケットに 2 つのグラフが作成されていることを確認します。
gcloud storage ls gs://${BUCKET}
出力は次のようになります。
gs://BUCKET/chart-cyprus.png gs://BUCKET/chart-unitedkingdom.png
これで、グラフのリンクを含むメールが 2 通届いたはずです。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用していて、このチュートリアルで行った変更を追加せずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除します。 Google Cloud
gcloud projects delete PROJECT_ID
チュートリアル リソースの削除
このチュートリアルでデプロイした Cloud Run サービスを削除します。
gcloud run services delete SERVICE_NAME
SERVICE_NAMEは、選択したサービス名です。Cloud Run サービスは Google Cloud コンソールで削除することもできます。
チュートリアルの設定で追加した Google Cloud CLI のデフォルト構成を削除します。
gcloud config unset project gcloud config unset run/region gcloud config unset run/platform gcloud config unset eventarc/location
このチュートリアルで作成した Eventarc トリガーをすべて削除します。
gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAMEは、実際のトリガー名に置き換えます。Artifact Registry からイメージを削除します。
gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/notifier:v1 gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/chart-creator:v1 gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/query-runner:v1
バケット内のすべてのオブジェクトと一緒にバケットを削除します。
gcloud storage rm --recursive gs://${BUCKET}/Cloud Scheduler ジョブを削除します。
gcloud scheduler jobs delete cre-scheduler-cy gcloud scheduler jobs delete cre-scheduler-uk