このチュートリアルでは、Eventarc を使用して Google Cloud プロジェクトのソースからイベントを読み取り、別の Google Cloud プロジェクトの宛先に転送する方法について説明します。これは、Pub/Sub をクロスプロジェクト トランスポート層として使用することで実現できます。
目標
このチュートリアルの内容は次のとおりです。
1 つのプロジェクトでトピックを作成し、別のプロジェクトからそのトピックにパブリッシュする。これにより、Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントが転送されます。
Cloud Storage の Pub/Sub 通知を使用して、プロジェクト間で Cloud Storage イベントをパブリッシュする。Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントを転送します。
Cloud Logging シンクを使用して、プロジェクト間で Cloud Audit Logs をパブリッシュする。Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントを転送します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
このチュートリアルでは、2 つのプロジェクトが必要になります。次の手順は、両方のプロジェクトに適用されます。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- gcloud コンポーネントを更新します。
gcloud components update
- 自分のアカウントでログインします。
gcloud auth login
プロジェクト間での Pub/Sub イベントのルーティング
Pub/Sub はグローバルに分散されたサービスです。1 つのプロジェクトでトピックを作成し、別のプロジェクトからそのトピックにパブリッシュして、Cloud Run サービスにメッセージを転送する Eventarc をトリガーします。
Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。
gcloud config set project PROJECT_TWO_ID
PROJECT_TWO_ID
は、2 番目の Google Cloud プロジェクトの ID に置き換えます。2 番目のプロジェクトで、次の操作を行います。
Cloud Run と Eventarc API を有効にします。
gcloud services enable run.googleapis.com eventarc.googleapis.com
デフォルトのロケーションを設定します。
REGION=REGION
REGION
は、サポートされている Eventarc のロケーションに置き換えます。例:us-central1
Pub/Sub トピックを作成します。
TOPIC=my-topic gcloud pubsub topics create $TOPIC
ビルド済みイメージ
us-docker.pkg.dev/cloudrun/container/hello
を使用して、未認証の Cloud Run サービスをデプロイします。gcloud run deploy hello \ --image=us-docker.pkg.dev/cloudrun/container/hello \ --allow-unauthenticated \ --region=$REGION
サービス URL が表示されたら、デプロイは完了しています。
Eventarc トリガーを使用してトピックをサービスに接続します。
gcloud eventarc triggers create cross-project-trigger \ --destination-run-service=hello \ --destination-run-region=${REGION} \ --location=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_TWO_ID/topics/$TOPIC
これにより、
cross-project-trigger
というトリガーが作成されます。
Google Cloud プロジェクト ID を最初のプロジェクトに設定します。
gcloud config set project PROJECT_ONE_ID
PROJECT_ONE_ID
は、最初の Google Cloud プロジェクトの ID に置き換えます。最初のプロジェクトで、2 番目のプロジェクトのトピックにメッセージをパブリッシュします。
gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。
gcloud config set project PROJECT_TWO_ID
2 番目のプロジェクトで、生成されたイベントがログに記録されていることを確認します。
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:hello" --format=json
次のようなログエントリが返されます。
"message": "Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: hello"
プロジェクト間での Cloud Storage イベントのルーティング
Cloud Storage の Pub/Sub 通知を使用して、プロジェクト間でイベントをパブリッシュし、Eventarc トリガーを介して Cloud Run サービスにイベントを転送します。
Google Cloud プロジェクト ID を最初のプロジェクトに設定します。
gcloud config set project PROJECT_ONE_ID
Cloud Storage バケットを作成します。
PROJECT1=$(gcloud config get-value project) BUCKET=$PROJECT1-cross-project gcloud storage buckets create gs://$BUCKET --location=${REGION}
バケットに 2 番目のプロジェクトのトピックに対する Pub/Sub 通知を作成します。
gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
ファイルをバケットにアップロードします。
echo "Hello World" > random.txt gcloud storage cp random.txt gs://$BUCKET/random.txt
Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。
gcloud config set project PROJECT_TWO_ID
2 番目のプロジェクトで、生成されたイベントがログに記録されていることを確認します。
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:random.txt" --format=json
次のようなログエントリが返されます。
Received event of type google.cloud.pubsub.topic.v1.messagePublished. Event data: { "kind": "storage#object", "id": "project1-cross-project/random.txt/1635327604259719", "selfLink": "https://www.googleapis.com/storage/v1/b/project1-cross-project/o/random.txt", "name": "random.txt", "bucket": "project1-cross-project", "generation": "1635327604259719", [...] }
プロジェクト間での Cloud Audit Logs イベントのルーティング
トリガーのフィルタ条件に一致する監査ログエントリが作成されたときに、サービスへのリクエストがトリガーされます。詳細については、Cloud Audit Logs のイベント フィルタの決定をご覧ください。この場合、最初のプロジェクトで Compute Engine VM インスタンスが作成されると、トリガーのフィルタ条件に一致する監査ログエントリにより、2 番目のプロジェクトでイベントをキャプチャし、Cloud Run サービスに転送できます。
Google Cloud プロジェクト ID を最初のプロジェクトに設定します。
gcloud config set project PROJECT_ONE_ID
最初のプロジェクトで、Compute Engine のログタイプ(管理読み取り、データ読み取り、データ書き込み)を有効にします。
プロジェクト レベルで、Google Cloud リソースのデータアクセス監査ログを構成するには
roles/owner
Identity and Access Management(IAM)ロールが必要です。プロジェクトの IAM ポリシーを読み取り、ファイルに保存します。
gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
/tmp/policy.yaml
を編集します。データアクセス監査ログ構成のみを追加するか、変更します。auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_READ - logType: DATA_WRITE service: compute.googleapis.com
新しい IAM ポリシーを作成します。
gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
上記のコマンドで別の変更との競合が報告された場合は、プロジェクトの IAM ポリシーの読み取りからやり直してください。
最初のプロジェクトで Cloud Logging シンクを作成して、Cloud Audit Logs を 2 番目のプロジェクトのトピックに転送します。
gcloud logging sinks create cross-project-sink \ pubsub.googleapis.com/projects/PROJECT_TWO_ID/topics/my-topic \ --log-filter='protoPayload.methodName="beta.compute.instances.insert"'
次のようなリマインダーが返されます。
Please remember to grant `serviceAccount:p1011272509317-375795@gcp-sa-logging.iam.gserviceaccount.com` the Pub/Sub Publisher role on the topic.
Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。
gcloud config set project PROJECT_TWO_ID
2 番目のプロジェクトで、サービス アカウントにロールを付与します。
gcloud pubsub topics add-iam-policy-binding my-topic \ --member=SERVICE_ACCOUNT \ --role=roles/pubsub.publisher
SERVICE_ACCOUNT
は、前の手順で返されたサービス アカウントのメールアドレスに置き換えます。Google Cloud プロジェクト ID を最初のプロジェクトに設定します。
gcloud config set project PROJECT_ONE_ID
最初のプロジェクトで、Compute Engine VM インスタンスを作成します。
このチュートリアルでは、Google Cloud コンソールを使用して VM インスタンスを作成するときに、デフォルトの値をそのまま使用できます。
Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。
gcloud config set project PROJECT_TWO_ID
2 番目のプロジェクトで、生成されたイベントがログに記録されていることを確認します。
gcloud logging read "resource.labels.service_name=hello AND jsonPayload.message:beta.compute.instances.insert" --format=json
次のようなログエントリが返されます。
Received event of type google.cloud.pubsub.topic.v1.messagePublished. Eventdata: { "logName": "projects/workflows-atamel/logs/cloudaudit.googleapis.com%2Factivity", "operation": { "id": "operation-1635330842489-5cf5321f4f454-ecc363cd-3883c08d", "last": true, "producer": "compute.googleapis.com" }, "protoPayload": { "@type": "type.googleapis.com/google.cloud.audit.AuditLog", "methodName": "beta.compute.instances.insert", } [...] }
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用していて、このチュートリアルで行った変更を追加せずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
チュートリアル リソースの削除
このチュートリアルでデプロイした Cloud Run サービスを削除します。
gcloud run services delete SERVICE_NAME
SERVICE_NAME
は、選択したサービス名です。Cloud Run サービスは Google Cloud コンソールから削除することもできます。
チュートリアルの設定時に追加した gcloud CLI のデフォルト構成を削除します。
例:
gcloud config unset run/region
または
gcloud config unset project
このチュートリアルで作成した他の Google Cloud リソースを削除します。
Eventarc トリガーを削除します。
gcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
は、実際のトリガー名に置き換えます。Pub/Sub トピックを削除します。
gcloud pubsub topics delete TOPIC TOPIC_ID
TOPIC_ID
は、トピックの ID に置き換えます。Cloud Logging シンクを削除します。
gcloud logging sinks delete SINK_NAME
SINK_NAME
は、使用するシンクの名前に置き換えます。