このチュートリアルでは、Eventarc を使用して Google Cloud プロジェクトのソースからイベントを読み取り、別の Google Cloud プロジェクトの宛先に転送する方法について説明します。これは、Pub/Sub をクロスプロジェクト トランスポート層として使用することで実現できます。
プロジェクト間での 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", } [...] }