認証された Cloud Run サービスを使用して Pub/Sub イベントを受信する

このチュートリアルでは、認証済みの Cloud Run サービスを使用して Pub/Sub 経由でイベントを受信する、コンテナ化されたアプリケーションをデプロイする方法について説明します。Pub/Sub はフルマネージドのリアルタイム メッセージング サービスで、個別のアプリケーション間でメッセージを送受信できます。

Artifact Registry 標準リポジトリを作成する

コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。

gcloud artifacts repositories create REPOSITORY \
    --repository-format=docker \
    --location=$REGION

REPOSITORY は、リポジトリの一意の名前に置き換えます。

Cloud Run にイベント レシーバーをデプロイする

イベントの内容をログに記録する Cloud Run サービスをデプロイします。

  1. GitHub リポジトリのクローンを作成します。

    Node.js

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Python

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Go

    git clone https://github.com/GoogleCloudPlatform/golang-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Java

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    Ruby

    git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

    C#

    git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git

    または、zip 形式のサンプルをダウンロードし、ファイルを抽出してもかまいません。

  2. Cloud Run のサンプルコードが含まれているディレクトリに移動します。

    Node.js

    cd nodejs-docs-samples/eventarc/pubsub/

    Python

    cd python-docs-samples/eventarc/pubsub/

    Go

    cd golang-samples/eventarc/pubsub/

    Java

    cd java-docs-samples/eventarc/pubsub/

    Ruby

    cd ruby-docs-samples/eventarc/pubsub/

    C#

    cd dotnet-docs-samples/eventarc/pubsub/
  3. コンテナをビルドして、Cloud Build にアップロードします。

    gcloud builds submit --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/trigger-pubsub:v1
  4. コンテナ イメージを Cloud Run にデプロイします。

    gcloud run deploy ${SERVICE_NAME} \
        --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/trigger-pubsub:v1
  5. [Allow unauthenticated invocations to trigger-pubsub (y/N)?] というプロンプトで、「n」と入力します。

Cloud Run サービスの URL が表示されたら、デプロイは完了しています。

Eventarc トリガーを作成する

Pub/Sub トピックにメッセージがパブリッシュされると、イベントにより Cloud Run サービスがトリガーされます。

  1. Pub/Sub メッセージをリッスンするトリガーを作成します。

    新しい Pub/Sub トピック

      gcloud eventarc triggers create ${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    これにより、新しい Pub/Sub トピックと trigger-pubsub というトリガーが作成されます。

    既存の Pub/Sub トピック

      gcloud eventarc triggers create ${SERVICE_NAME} \
          --destination-run-service=${SERVICE_NAME} \
          --destination-run-region=${REGION} \
          --location=${REGION} \
          --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
          --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID
    • TOPIC_ID: 既存の Pub/Sub トピックの ID

    これにより、既存の Pub/Sub トピックに trigger-pubsub というトリガーが作成されます。

    Google Cloud プロジェクトで初めて Eventarc トリガーを作成する場合は、Eventarc サービス エージェントのプロビジョニングに遅延が発生する可能性があります。この問題は通常、トリガーを再度作成することで解決できます。詳細については、権限拒否エラーをご覧ください。

  2. トリガーが正常に作成されたことを確認します。トリガーはすぐに作成されますが、トリガーが完全に機能するまでに 2 分ほどかかることがあります。

    gcloud eventarc triggers list --location=${REGION}

    返されたトリガーのステータスは ACTIVE: Yes になります。

イベントを生成して表示する

Pub/Sub トピックにメッセージをパブリッシュしてイベントを生成し、Cloud Run サービスをトリガーします。Cloud Run サービスは、メッセージをサービスログに記録します。

  1. Pub/Sub トピックを検索して、環境変数として設定します。

    export TOPIC_ID=$(gcloud eventarc triggers describe ${SERVICE_NAME} \
        --format='value(transport.pubsub.topic)')
  2. Pub/Sub トピックにメッセージを送信してイベントを生成します。

    gcloud pubsub topics publish $TOPIC_ID --message "Hello there"

    イベントが Cloud Run サービスに送信され、イベント メッセージがログに記録されます。

  3. サービスによって作成されたイベント関連ログエントリを表示します。

    gcloud logging read 'textPayload: "Hello there!"'

    ログエントリは次のようになります。

    textPayload: 'Hello, Hello there!'

ログが表示されるまで少し時間がかかることがあります。すぐに表示されない場合は、1 分後に再度確認してください。