Google Cloud プロジェクト間でイベントを転送する

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

プロジェクト間での Pub/Sub イベントのルーティング

Pub/Sub はグローバルに分散されたサービスです。1 つのプロジェクトでトピックを作成し、別のプロジェクトからそのトピックにパブリッシュして、Cloud Run サービスにメッセージを転送する Eventarc をトリガーします。

プロジェクト間のイベント処理: Cloud Pub/Sub と Eventarc

  1. Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。

    gcloud config set project PROJECT_TWO_ID

    PROJECT_TWO_ID は、2 番目のGoogle Cloud プロジェクトの ID に置き換えます。

  2. 2 番目のプロジェクトで、次の操作を行います。

    1. Cloud Run と Eventarc API を有効にします。

      gcloud services enable run.googleapis.com eventarc.googleapis.com
    2. デフォルトのロケーションを設定します。

      REGION=REGION

      REGION は、サポートされている Eventarc のロケーションに置き換えます。例: us-central1

    3. Pub/Sub トピックを作成します。

      TOPIC=my-topic
      gcloud pubsub topics create $TOPIC
    4. ビルド済みイメージ 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 が表示されたら、デプロイは完了しています。

    5. 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 というトリガーが作成されます。

  3. Google Cloud プロジェクト ID を最初のプロジェクトに設定します。

    gcloud config set project PROJECT_ONE_ID

    PROJECT_ONE_ID は、最初のGoogle Cloud プロジェクトの ID に置き換えます。

  4. 最初のプロジェクトで、2 番目のプロジェクトのトピックにメッセージをパブリッシュします。

    gcloud pubsub topics publish projects/PROJECT_TWO_ID/topics/$TOPIC --message="hello"
  5. Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。

    gcloud config set project PROJECT_TWO_ID
  6. 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 サービスにイベントを転送します。

プロジェクト間のイベント処理: Cloud Storage と Eventarc

  1. Google Cloud プロジェクト ID を最初のプロジェクトに設定します。

    gcloud config set project PROJECT_ONE_ID
  2. Cloud Storage バケットを作成します。

    PROJECT1=$(gcloud config get-value project)
    BUCKET=$PROJECT1-cross-project
    gcloud storage buckets create gs://$BUCKET --location=${REGION}
  3. バケットに 2 番目のプロジェクトのトピックに対する Pub/Sub 通知を作成します。

    gcloud storage buckets notifications create gs://$BUCKET --topic=projects/PROJECT_TWO_ID/topics/$TOPIC --payload-format=json
  4. ファイルをバケットにアップロードします。

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://$BUCKET/random.txt
  5. Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。

    gcloud config set project PROJECT_TWO_ID
  6. 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 サービスに転送できます。

プロジェクト間のイベント処理: Cloud Audit Logs と Eventarc

  1. Google Cloud プロジェクト ID を最初のプロジェクトに設定します。

    gcloud config set project PROJECT_ONE_ID
  2. 最初のプロジェクトで、Compute Engine のログタイプ(管理読み取りデータ読み取りデータ書き込み)を有効にします。

    プロジェクト レベルで、 Google Cloud リソースのデータアクセス監査ログを構成するには roles/owner Identity and Access Management(IAM)ロールが必要です。

    1. プロジェクトの IAM ポリシーを読み取り、ファイルに保存します。

      gcloud projects get-iam-policy PROJECT_ONE_ID > /tmp/policy.yaml
      
    2. /tmp/policy.yaml を編集します。データアクセス監査ログ構成のみを追加するか、変更します。

      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: compute.googleapis.com
      
    3. 新しい IAM ポリシーを作成します。

      gcloud projects set-iam-policy PROJECT_ONE_ID /tmp/policy.yaml
      

      上記のコマンドで別の変更との競合が報告された場合は、プロジェクトの IAM ポリシーの読み取りからやり直してください。

  3. 最初のプロジェクトで 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.
  4. Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。

    gcloud config set project PROJECT_TWO_ID
  5. 2 番目のプロジェクトで、サービス アカウントにロールを付与します。

    gcloud pubsub topics add-iam-policy-binding my-topic \
        --member=SERVICE_ACCOUNT \
        --role=roles/pubsub.publisher

    SERVICE_ACCOUNT は、前の手順で返されたサービス アカウントのメールアドレスに置き換えます。

  6. Google Cloud プロジェクト ID を最初のプロジェクトに設定します。

    gcloud config set project PROJECT_ONE_ID
  7. 最初のプロジェクトで、Compute Engine VM インスタンスを作成します。

    このチュートリアルでは、 Google Cloud コンソールを使用して VM インスタンスを作成するときに、デフォルトの値をそのまま使用できます。

  8. Google Cloud プロジェクト ID を 2 番目のプロジェクトに設定します。

    gcloud config set project PROJECT_TWO_ID
  9. 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",
      }
    [...]
    }