Eventarc でトリガーを作成する

このページでは、Cloud Run サービスが別の Google Cloud サービスからイベントを受信できるように Eventarc トリガーを作成する方法について説明します。

Eventarc は、基盤となるインフラストラクチャを実装、カスタマイズ、またはメンテナンスすることなく、イベント ドリブン アーキテクチャを構築できる Google Cloud サービスです。

Eventarc トリガーを作成するには、トリガーのフィルタを指定し、イベントソースやターゲット Cloud Run サービスなど、イベントのルーティングを構成します。指定したイベントまたはイベントセットがフィルタと一致すると、イベントに応じて Cloud Run サービスが自動的に呼び出されます。Eventarc トリガーを使用するサービスは、イベント ドリブン サービスと呼ばれます。Cloud Run サービスに送信されたイベントは、HTTP リクエストの形式で受信されます。

サービスに対するリクエストをトリガーするイベントの種類は次のとおりです。

Google Cloud CLI または Eventarc コンソール ページで Eventarc トリガーを作成することもできます。特定のプロバイダ、イベントタイプ、宛先のトリガーを作成する手順については、リストをフィルタして、Eventarc のイベント プロバイダと宛先の詳細をご覧ください。

トリガーのロケーション

Eventarc トリガーを作成するときに、トリガーのロケーションを指定します。これは、イベントをモニタリングする Google Cloud リソースのロケーションと一致している必要があります。ほとんどの場合、イベント ドリブンの Cloud Run サービスを同じリージョンにデプロイする必要があります。詳細については、Eventarc のロケーションについてをご覧ください。

トリガー ID

Eventarc トリガーのサービス アカウントには、サービスを呼び出す権限が必要です。Compute Engine のデフォルトのサービス アカウントに、サービスを呼び出すための適切な権限があることを確認する必要があります。詳細については、必要なロールをご覧ください。

始める前に

  1. 設定ページの説明に従って、Cloud Run に新しいプロジェクトを設定したことを確認してください。

  2. Artifact Registry、Cloud Build、Cloud Run Admin API、Eventarc API を有効にします。

    API を有効にする

必要なロール

デプロイ担当者アカウント、トリガー ID、Pub/Sub サービス エージェント(必要な場合)に次の IAM ロールを付与する必要があります(このロールの付与は自身で行うか、管理者に依頼します)。

デプロイ担当者のアカウントに必要なロール

Eventarc トリガーの構成に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

デフォルトでは、Cloud Build の権限には、Artifact Registry アーティファクトをアップロードおよびダウンロードするための権限が含まれています

トリガー ID に必要なロール

  1. Compute Engine のデフォルトのサービス アカウントをメモしておいてください。テスト目的で、Eventarc トリガーに関連付けて、トリガーの ID を示すためです。このサービス アカウントは、Compute Engine を使用する Google Cloud サービスを有効にするか使用すると自動的に作成されます。メールアドレスの形式は次のとおりです。

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    PROJECT_NUMBER は、使用する Google Cloudプロジェクト番号に置き換えます。プロジェクト番号は、 Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドでも確認できます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    本番環境では、新しいサービス アカウントを作成して、必要最小限の権限を含む、最小権限の原則に従った 1 つ以上の IAM ロールを付与することを強くおすすめします。

  2. デフォルトでは、Cloud Run サービスを呼び出すことができるのは、プロジェクト オーナー、プロジェクト編集者、Cloud Run 管理者、起動元のみです。サービスごとにアクセスを制御できます。ただし、テスト目的の場合は、 Google Cloud プロジェクトの Cloud Run 起動元ロールrun.invoker)を Compute Engine サービス アカウントに付与してください。これにより、プロジェクト内のすべての Cloud Run サービスとジョブにロールが付与されます。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/run.invoker

    Cloud Run 起動元ロールを付与せずに認証済みの Cloud Run サービスのトリガーを作成すると、トリガーは正常に作成され、アクティブになります。ただし、トリガーが期待どおりに機能せず、次のようなメッセージがログに記録されます。

    The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
  3. プロジェクトの Eventarc イベント レシーバーのロールroles/eventarc.eventReceiver)を Compute Engine のデフォルト サービス アカウントに付与して、Eventarc トリガーがイベント プロバイダからイベントを受信できるようにします。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/eventarc.eventReceiver

Pub/Sub サービス エージェントのオプションのロール

  • 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールroles/iam.serviceAccountTokenCreator)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

サービスのトリガーを作成する

トリガーは、サービスをデプロイした後に指定できます。

使用するツールのタブをクリックして、手順を確認してください。

コンソール

  1. コンテナまたはソースを使用して Cloud Run サービスをデプロイします。

  2. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  3. サービスのリストで既存のサービスをクリックします。

  4. サービスの詳細ページで、[トリガー] タブに移動します。

  5. [トリガーを追加] をクリックし、オプションを選択します。

  6. [Eventarc トリガー] ペインで、トリガーの詳細を次のように変更します。

    1. [トリガー名] フィールドにトリガーの名前を入力するか、デフォルトの名前を使用します。

    2. リストからトリガーのタイプを選択して、次のいずれかのトリガータイプを指定します。

      • Google のソース: Pub/Sub、Cloud Storage、Firestore などの Google イベント プロバイダのトリガーを指定できます。

      • サードパーティ: Eventarc ソースを提供する Google 以外のプロバイダと統合できます。詳細については、Eventarc のサードパーティ イベントをご覧ください。

    3. [イベント プロバイダ] リストからイベント プロバイダを選択し、サービスをトリガーするイベントタイプを提供するプロダクトを選択します。イベント プロバイダのリストについては、イベント プロバイダと宛先をご覧ください。

    4. [イベントタイプ] リストからイベントタイプを選択します。トリガーの構成は、サポートされているイベントタイプによって異なります。詳細については、イベントタイプをご覧ください。

    5. [リージョン] フィールドが有効になっている場合は、Eventarc トリガーのロケーションを選択します。一般に、Eventarc トリガーのロケーションは、イベントをモニタリングする Google Cloud リソースのロケーションと一致している必要があります。ほとんどの場合に、サービスを同じリージョンにデプロイすることも必要です。Eventarc トリガーのロケーションの詳細については、Eventarc のロケーションについてをご覧ください。

    6. [サービス アカウント] フィールドで、サービス アカウントを選択します。Eventarc トリガーはサービス アカウントにリンクされ、サービスを呼び出すときに ID として使用します。Eventarc トリガーのサービス アカウントには、サービスを呼び出す権限が必要です。デフォルトでは、Cloud Run は Compute Engine のデフォルトのサービス アカウントを使用します。

    7. 受信リクエストの送信先であるサービスの URL パスを指定することもできます。これは、トリガーのイベントの送信先である宛先サービスの相対パスです。例: //routerouteroute/subroute.

    8. 必須フィールドに値を入力したら、[トリガーを保存] をクリックします。

  7. トリガーの作成後、[トリガー] タブにチェックマーク が付いていることを確認します。

gcloud

  1. コンテナまたはソースを使用して Cloud Run サービスをデプロイします。

  2. 次のコマンドを実行して、イベントをフィルタするトリガーを作成します。

    gcloud eventarc triggers create TRIGGER_NAME  \
        --location=REGION \
        --destination-run-service=SERVICE  \
        --destination-run-region=REGION \
        --event-filters="EVENT_FILTER" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

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

    • TRIGGER_NAME は、トリガーの名前に置き換えます。

    • EVENTARC_TRIGGER_LOCATION は、Eventarc トリガーのロケーションに置き換えます。一般に、Eventarc トリガーのロケーションは、イベントをモニタリングする Google Cloud リソースのロケーションと一致している必要があります。ほとんどの場合に、サービスを同じリージョンにデプロイすることも必要です。詳細については、Eventarc のロケーションをご覧ください。

    • SERVICE: デプロイするサービスの名前。

    • REGION: サービスの Cloud Run リージョン

    • PROJECT_NUMBER: Google Cloud プロジェクト番号。Eventarc トリガーはサービス アカウントにリンクされ、サービスを呼び出すときに ID として使用します。Eventarc トリガーのサービス アカウントには、サービスを呼び出す権限が必要です。デフォルトでは、Cloud Run はデフォルトのコンピューティング サービス アカウントを使用します。

    • event-filters フラグには、トリガーがモニタリングするイベント フィルタを指定します。event-filters フィルタにすべて一致するイベントがサービスの呼び出しをトリガーします。各トリガーには、サポートされているイベントタイプを指定する必要があります。作成後にイベント フィルタの種類を変更することはできません。イベント フィルタの種類を変更するには、新しいトリガーを作成して古いトリガーを削除する必要があります。(省略可)さらにフィルタを追加するには、--event-filters フラグを繰り返し、サポートされているフィルタを ATTRIBUTE=VALUE の形式で指定します。

Terraform

Cloud Run サービスの Eventarc トリガーを作成するには、Terraform を使用してトリガーを作成するをご覧ください。

関数のトリガーを作成する

任意のツールを使用して、手順のタブでクリックします。

コンソール

Google Cloud コンソールを使用して関数を作成する場合、関数の作成時にトリガーを追加することもできます。関数のトリガーを作成する手順は次のとおりです。

  1. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  2. [関数を作成] をクリックし、関数の詳細を入力します。デプロイ時に関数を構成する方法については、関数をデプロイするをご覧ください。

  3. [トリガー] セクションで [トリガーを追加] をクリックします。

  4. オプションを選択します。

  5. [Eventarc トリガー] ペインで、トリガーの詳細を次のように変更します。

    1. [トリガー名] フィールドにトリガーの名前を入力するか、デフォルトの名前を使用します。

    2. リストからトリガーのタイプを選択して、次のいずれかのトリガータイプを指定します。

      • Google のソース: Pub/Sub、Cloud Storage、Firestore などの Google イベント プロバイダのトリガーを指定できます。

      • サードパーティ: Eventarc ソースを提供する Google 以外のプロバイダと統合できます。詳細については、Eventarc のサードパーティ イベントをご覧ください。

    3. [イベント プロバイダ] リストからイベント プロバイダを選択し、関数をトリガーするイベントタイプを提供するプロダクトを選択します。イベント プロバイダのリストについては、イベント プロバイダと宛先をご覧ください。

    4. [イベントタイプ] リストからイベントタイプを選択します。トリガーの構成は、サポートされているイベントタイプによって異なります。詳細については、イベントタイプをご覧ください。

    5. [リージョン] フィールドが有効になっている場合は、Eventarc トリガーのロケーションを選択します。一般に、Eventarc トリガーのロケーションは、イベントをモニタリングする Google Cloud リソースのロケーションと一致している必要があります。ほとんどの場合に、関数を同じリージョンにデプロイすることも必要です。Eventarc トリガーのロケーションの詳細については、Eventarc のロケーションについてをご覧ください。

    6. [サービス アカウント] フィールドで、サービス アカウントを選択します。Eventarc トリガーはサービス アカウントにリンクされ、関数を呼び出すときに ID として使用します。Eventarc トリガーのサービス アカウントには、関数を呼び出す権限が必要です。デフォルトでは、Cloud Run は Compute Engine のデフォルトのサービス アカウントを使用します。

    7. 受信リクエストの送信先であるサービスの URL パスを指定することもできます。これは、トリガーのイベントの送信先である宛先サービスの相対パスです。例: //routerouteroute/subroute.

  6. 必須フィールドに値を入力したら、[トリガーを保存] をクリックします。

gcloud

gcloud CLI を使用して関数を作成する場合は、まず関数をデプロイしてからトリガーを作成する必要があります。関数のトリガーを作成する手順は次のとおりです。

  1. サンプルコードのあるディレクトリで次のコマンドを実行して、関数をデプロイします。

    gcloud run deploy FUNCTION \
            --source . \
            --function FUNCTION_ENTRYPOINT \
            --base-image BASE_IMAGE_ID \
            --region REGION
    

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

    • FUNCTION: デプロイする関数の名前。このパラメータは省略できますが、省略すると名前の入力を求められます。

    • FUNCTION_ENTRYPOINT: ソースコード内の関数のエントリ ポイント。これは、関数の実行時に Cloud Run が実行するコードです。このフラグには、ソースコード内に存在する関数名または完全修飾クラス名を指定する必要があります。

    • BASE_IMAGE_ID: 関数のベースイメージ環境。ベースイメージと各イメージに含まれるパッケージの詳細については、ランタイム ベースイメージをご覧ください。

    • REGION: 関数をデプロイする Google Cloudリージョン。例: europe-west1

  2. 次のコマンドを実行して、イベントをフィルタするトリガーを作成します。

    gcloud eventarc triggers create TRIGGER_NAME  \
        --location=REGION \
        --destination-run-service=FUNCTION  \
        --destination-run-region=REGION \
        --event-filters="EVENT_FILTER" \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

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

    • TRIGGER_NAME は、トリガーの名前に置き換えます。

    • EVENTARC_TRIGGER_LOCATION は、Eventarc トリガーのロケーションに置き換えます。一般に、Eventarc トリガーのロケーションは、イベントをモニタリングする Google Cloud リソースのロケーションと一致している必要があります。ほとんどの場合に、関数を同じリージョンにデプロイすることも必要です。詳細については、Eventarc のロケーションをご覧ください。

    • FUNCTION: デプロイする関数の名前。

    • REGION: 関数の Cloud Run リージョン

    • PROJECT_NUMBER: Google Cloud プロジェクト番号。Eventarc トリガーはサービス アカウントにリンクされ、関数を呼び出すときに ID として使用します。Eventarc トリガーのサービス アカウントには、関数を呼び出す権限が必要です。デフォルトでは、Cloud Run はデフォルトのコンピューティング サービス アカウントを使用します。

    • event-filters フラグには、トリガーがモニタリングするイベント フィルタを指定します。event-filters フィルタにすべて一致するイベントが関数の呼び出しをトリガーします。各トリガーには、サポートされているイベントタイプを指定する必要があります。作成後にイベント フィルタの種類を変更することはできません。イベント フィルタの種類を変更するには、新しいトリガーを作成して古いトリガーを削除する必要があります。(省略可)さらにフィルタを追加するには、--event-filters フラグを繰り返し、サポートされているフィルタを ATTRIBUTE=VALUE の形式で指定します。

Terraform

Cloud Run functions の関数の Eventarc トリガーを作成するには、Terraform を使用してトリガーを作成するをご覧ください。

Pub/Sub の確認応答期限を設定する

Cloud Run functions のイベント ドリブン関数は、Eventarc と Pub/Sub サブスクリプションを組み合わせて実装されます。デフォルトでは、この Pub/Sub サブスクリプションの確認応答(ack)期限は 10 秒です。この設定は多くの関数では不十分であり、不要な重複実行が発生する可能性があります。

サービスまたは関数の ack 期限を最大値の 600 秒に設定することをおすすめします。

コンソール

関数をデプロイしたら、次の手順で関数の ack 期限を変更します。

  1. Google Cloud コンソールで Cloud Run に移動します。

    Cloud Run に移動

  2. [サービス] リストで更新したいサービスをクリックして、サービスの詳細を表示します。

  3. [トリガー] タブを開きます。

  4. トリガー名をクリックして [トリガーの詳細] を開きます。

  5. [トピック] リンクをクリックして、トピック編集ペインを開きます。

  6. サブスクリプション ID の名前をクリックしてサブスクリプション ペインに移動し、ページ上部の [編集] をクリックします。

  7. [確認応答期限] の値を 600 に設定し、[更新] をクリックして変更を保存します。

gcloud

トリガーあたりの ack の期限を最大値の 600 秒に更新します。次のコマンドは、前の手順で値を設定した変数(TRIGGER_NAMEREGION)を参照します。

## Per Cloud Run function:

# Update Ack Deadline to max (600s)
SUBSCRIPTION_ID=$(gcloud eventarc triggers describe "$TRIGGER_NAME" --location $REGION --format json | jq -r '.transport.pubsub.subscription')
gcloud pubsub subscriptions update "$SUBSCRIPTION_ID" --ack-deadline=600

すべてのサービスと関数トリガーで一括更新を実行し、ack の期限を 600 秒に設定します。

### Match all Cloud Run service triggers and update all deadlines to 600s (max timeout)
### This will change ALL Cloud Run Service and Cloud Run function
TRIGGER_NAMES=($(gcloud eventarc triggers list | awk '/Cloud Run service/ {print $1}'))

if [ ${#TRIGGER_NAMES[@]} -eq 0 ]; then
  echo "No matching triggers found"
fi

for trigger in "${TRIGGER_NAMES[@]}"; do
echo "Updating ack deadline for trigger: $trigger"
SUBSCRIPTION_ID=$(gcloud eventarc triggers describe "$trigger" --location $REGION --format json | jq -r '.transport.pubsub.subscription')

if [ -z "$SUBSCRIPTION_ID" ]; then
    echo "Error: Could not retrieve subscription ID for trigger: $trigger"
    continue # Skip to the next trigger
fi
gcloud pubsub subscriptions update "$SUBSCRIPTION_ID" --ack-deadline=600
echo "Ack deadline updated for subscription: $SUBSCRIPTION_ID"
done

CloudEvent ID とソースを表示する

サービスをトリガーした CloudEvent ID とソースを確認するには、Cloud Run サービスログで次のリソースを表示します。

  • LogEntry.labels.run.googleapis.com/cloud_event_id
  • LogEntry.labels.run.googleapis.com/cloud_event_source

次のステップ