Pub/Sub トリガーを Events for Cloud Run for Anthos から Eventarc に移行する

イベント トリガーを移行することで、Google Kubernetes Engine(GKE)サービス(Knative serving サービスを含む)が Eventarc を使用して Pub/Sub イベントを受信できるようになります。このガイドでは、既存のイベント トリガーを移行することと、GKE サービスが GKE クラスタで実行されていることを前提としています。移行はクラスタごとに行う必要があります。

この移行パスにより、重複を最小限に抑えながらイベントの損失を回避できます。

移行の手順は次のとおりです。

  1. Eventarc が GKE クラスタ内のリソースを管理できるようにするには、GKE の宛先を有効にします。
  2. 必要に応じて、ターゲット GKE サービスを実行している GKE クラスタの Workload Identity を有効にします
  3. 既存のイベント トリガーを確認します。
  4. 既存のトリガーと同じ GKE サービスを参照する Eventarc トリガーを作成します。
  5. Eventarc トリガーによってイベントが想定どおり配信されていることを確認します。
  6. 元のイベント トリガーを削除し、移行後にクリーンアップします。

始める前に

このガイドでは、次のものが用意されていることを前提としています。

コマンドライン環境を設定する

gcloud および kubectl コマンドライン ツールを設定するには:

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. お使いのアカウントを使用してログインします。

    gcloud auth login
  3. 次のように gcloud CLI のデフォルト設定を設定します。

    gcloud config set project PROJECT_ID
    gcloud config set run/cluster CLUSTER_NAME
    gcloud config set run/cluster_location CLUSTER_LOCATION
    gcloud config set run/platform gke
    gcloud config set eventarc/location LOCATION
    

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

    • PROJECT_ID: プロジェクト ID
    • CLUSTER_NAME: クラスタの名前
    • CLUSTER_LOCATION: GKE がサポートされている任意のゾーン(例: us-central1-a
    • LOCATION: Eventarc トリガーのロケーション(例: us-central1
  4. プロジェクトで次の API を有効にします。

    gcloud services enable cloudapis.googleapis.com
    gcloud services enable cloudbuild.googleapis.com
    gcloud services enable cloudresourcemanager.googleapis.com
    gcloud services enable container.googleapis.com
    gcloud services enable containerregistry.googleapis.com
    gcloud services enable eventarc.googleapis.com
    
  5. kubectl コマンドライン ツールをインストールします。

    gcloud components install kubectl
  6. インストール済みの gcloud CLI コンポーネントを更新します。

    gcloud components update

GKE の宛先を有効にする

Eventarc が GKE クラスタ内のリソースを管理できるようにするには、GKE の宛先を有効にし、Eventarc サービス アカウントを必要なロールにバインドします。

  1. Eventarc 用に GKE の宛先を有効にします。

    gcloud eventarc gke-destinations init
    
  2. 必要なロールをバインドするよう求められたら、「y」と入力します。

    次のロールがバインドされます。

    • roles/compute.viewer
    • roles/container.developer
    • roles/iam.serviceAccountAdmin

クラスタで Workload Identity を有効にする

クラスタで Workload Identity がすでに有効になっている場合、この手順は省略できます。

Workload Identity は、セキュリティ プロパティと管理性が向上しているため、GKE 内で実行しているアプリケーションから Google Cloud サービスにアクセスする場合に推奨される方法となります。Eventarc を使用して GKE イベントを転送する必要もあります。

既存のクラスタで Workload Identity を有効にするには、Workload Identity の使用をご覧ください。

既存のイベント トリガーを確認する

既存のイベント トリガーを移行する前に、トリガーの詳細を取得する必要があります。

  1. GKE クラスタの既存のイベント トリガーを一覧表示します。

    gcloud beta events triggers list --namespace EVENTS_NAMESPACE
    

    EVENTS_NAMESPACE は、イベント ブローカーの名前空間に置き換えます。

    出力は次のようになります。

       TRIGGER             EVENT TYPE                                     TARGET
    ✔  trigger-id          google.cloud.pubsub.topic.v1.messagePublished  cloud-run-service-name
    
  2. Eventarc トリガーを作成するには、トピック ID が必要になります。既存のイベント トリガーのトピック ID を取得します。

    gcloud beta events triggers describe TRIGGER_ID \
      --platform gke --namespace EVENTS_NAMESPACE \
      --format="flattened(serialized_source.spec.topic,serialized_trigger.spec.filter.attributes.type,serialized_trigger.spec.subscriber.ref.name,serialized_trigger.spec.subscriber.ref.namespace)"
    

    TRIGGER_ID は、既存のイベント トリガーの ID または完全修飾 ID に置き換えます。

    出力は次のようになります。

    topic:     topic-id
    type:      google.cloud.pubsub.topic.v1.messagePublished
    name:      cloud-run-service-name
    namespace: events
    

Eventarc トリガーを作成して既存のトリガーを置き換える

Eventarc トリガーを作成する前に、ユーザー管理のサービス アカウントを設定して特定のロールを付与し、Eventarc が GKE の宛先のイベントを管理できるようにします。

  1. Google Cloud サービス アカウント(GSA)を作成します。

    TRIGGER_GSA=SERVICE_ACCOUNT_NAME
    gcloud iam service-accounts create $TRIGGER_GSA

    SERVICE_ACCOUNT_NAME は、6~30 文字の名前に置き換えます。小文字の英数字とハイフンを使用できます。

  2. サービス アカウントに pubsub.subscriber ロールと monitoring.metricWriter ロールを付与します。

    PROJECT_ID=$(gcloud config get-value project)
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
      --role "roles/monitoring.metricWriter"
  3. 既存のイベント トリガーの構成に基づいて、新しい Eventarc トリガーを作成します。宛先サービス、クラスタ、トピック ID など、すべての引数が、既存のイベント トリガーと一致している必要があります。

    gcloud eventarc triggers create EVENTARC_TRIGGER_NAME \
      --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
      --location LOCATION \
      --destination-gke-service=DESTINATION_SERVICE \
      --destination-gke-cluster=CLUSTER_NAME  \
      --destination-gke-location=CLUSTER_LOCATION  \
      --destination-gke-namespace=EVENTS_NAMESPACE  \
      --destination-gke-path=/ \
      --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com \
      --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID
    

    EVENTARC_TRIGGER_NAME は、新しい Eventarc トリガーの名前に置き換えます。TOPIC_ID は、以前に取得した Pub/Sub トピック ID に置き換えます。

    これにより、Pub/Sub トピック ID の Eventarc トリガーが作成されます。

  4. トリガーが正常に作成されたことを確認します。

    gcloud eventarc triggers list
    

    出力は次のようになります。

    NAME                  TYPE                                           DESTINATION_RUN_SERVICE  DESTINATION_RUN_PATH  ACTIVE
    eventarc-trigger-name google.cloud.pubsub.topic.v1.messagePublished                                                 Yes
    

移行をテストして出力を確認する

移行をテストするには、Pub/Sub トピックに公開してテストイベントをトリガーし、既存のイベント トリガーと Eventarc トリガーのそれぞれに、少なくとも 1 つのイベントが配信されていることを確認します。

たとえば、テストイベントのトリガー後の出力は重複し、次のようになります。

  Hello, World! ID: 2896291125947199
  Hello, World! ID: 2896291125947199

次のシナリオは、イベント レシーバがイベントデータを表示するためのガイダンスとしても使用できます。

  1. Pub/Sub トピックにメッセージを公開します。

    gcloud pubsub topics publish TOPIC_ID \
      --message "Hello, World!"
    
  2. イベントとその配信が成功したことを確認します。たとえば、受信側の GKE サービスのログを確認します。

    kubectl logs \
      --selector serving.knative.dev/service=DESTINATION_SERVICE \
      -c user-container \
      -n EVENTS_NAMESPACE \
      --tail=100
    

    2 つのトリガーの出力は次のようになります。違いは Context AttributesExtensions のみです。Eventarc に移行した後にイベント レシーバを変更する必要がないように、subscription データを除き、実際のメッセージ データは同一にする必要があります。

    Eventarc イベント:

    ☁️  cloudevents.Event
    Validation: valid
    Context Attributes,
      specversion: 1.0
      type: google.cloud.pubsub.topic.v1.messagePublished
      source: //pubsub.googleapis.com/projects/project-id/topics/topic-name
      id: 2759155988927083
      time: 2021-07-22T17:47:19.964Z
      datacontenttype: application/json
    Data,
      {
        "subscription": "projects/project-id/subscriptions/eventarc-us-central1-eventarc-trigger-name-sub-567",
        "message": {
          "data": "V29ybGQ=",
          "messageId": "2759155988927083",
          "publishTime": "2021-07-22T17:47:19.964Z"
        }
      }
    

    Knative serving イベント:

    ☁️  cloudevents.Event
    Validation: valid
    Context Attributes,
      specversion: 1.0
      type: google.cloud.pubsub.topic.v1.messagePublished
      source: //pubsub.googleapis.com/projects/project-id/topics/topic-name
      id: 2759155988927083
      time: 2021-07-22T17:47:19.964Z
      dataschema: https://raw.githubusercontent.com/googleapis/google-cloudevents/master/proto/google/events/cloud/pubsub/v1/data.proto
      datacontenttype: application/json
    Extensions,
      knativearrivaltime: 2021-07-22T17:47:20.723302362Z
      knsourcetrigger: link0.09767362059083662
      traceparent: 00-f3cc6d754d361a0e49e83e5973fa3565-b4a20ef4ecffe96b-00
    Data,
      {
        "subscription": "cre-src_events_source-for-trigger-name_5ffa9638-8cab-4010-900a-2edb275d9eaf",
        "message": {
          "messageId": "2759155988927083",
          "data": "V29ybGQ=",
          "publishTime": "2021-07-22T17:47:19.964Z"
        }
      }
    

移行後のクリーンアップ

元のイベント トリガーは、Eventarc へのトリガーの移行をテストして検証した後に削除できます。

  1. 元のイベント トリガーを削除します。

    gcloud beta events triggers delete TRIGGER_NAME \
      --platform gke \
      --namespace EVENTS_NAMESPACE \
      --quiet
    

既存の Knative serving トリガーを Eventarc に移行しました。

次のステップ