Google Cloud プロジェクト間でのイベントのルーティング


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

目標

このチュートリアルの内容は次のとおりです。

  1. 1 つのプロジェクトでトピックを作成し、別のプロジェクトからそのトピックにパブリッシュする。これにより、Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントが転送されます。

  2. Cloud Storage の Pub/Sub 通知を使用して、プロジェクト間で Cloud Storage イベントをパブリッシュする。Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントを転送します。

  3. Cloud Logging シンクを使用して、プロジェクト間で Cloud Audit Logs をパブリッシュする。Eventarc トリガーを使用して、未認証の Cloud Run サービスにイベントを転送します。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

このチュートリアルでは、2 つのプロジェクトが必要になります。次の手順は、両方のプロジェクトに適用されます。

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud CLI をインストールします。
  5. gcloud CLI を初期化するには:

    gcloud init
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  7. Google Cloud プロジェクトで課金が有効になっていることを確認します

  8. Google Cloud CLI をインストールします。
  9. gcloud CLI を初期化するには:

    gcloud init
  10. gcloud コンポーネントを更新します。
    gcloud components update
  11. 自分のアカウントでログインします。
    gcloud auth login

プロジェクト間での 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
    gsutil mb -l $REGION gs://$BUCKET
    
  3. バケットに 2 番目のプロジェクトのトピックに対する Pub/Sub 通知を作成します。

    gsutil notification create -t projects/PROJECT_TWO_ID/topics/$TOPIC -f json gs://$BUCKET
    
  4. ファイルをバケットにアップロードします。

    echo "Hello World" > random.txt
    gsutil 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 Console を使用して 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",
      }
    [...]
    }
    

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用していて、このチュートリアルで行った変更を追加せずに残す場合は、チュートリアル用に作成したリソースを削除します

プロジェクトを削除する

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

チュートリアル リソースの削除

  1. このチュートリアルでデプロイした Cloud Run サービスを削除します。

    gcloud run services delete SERVICE_NAME

    SERVICE_NAME は、選択したサービス名です。

    Cloud Run サービスは Google Cloud コンソールから削除することもできます。

  2. チュートリアルの設定時に追加した gcloud CLI のデフォルト構成を削除します。

    例:

    gcloud config unset run/region

    または

    gcloud config unset project

  3. このチュートリアルで作成した他の 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 は、使用するシンクの名前に置き換えます。

次のステップ