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

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

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

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

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

始める前に

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

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

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

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  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 がすでに有効になっている場合、この手順は省略できます。

Google Kubernetes Engine(GKE)内で実行しているアプリケーションから Google Cloud サービスにアクセスするには、セキュリティのプロパティと管理性が優れているため、Workload Identity を使用することをおすすめします。Eventarc を使用して Cloud Run for Anthos イベントを転送する必要もあります。

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

既存の Events for Cloud Run for Anthos のトリガーを特定する

既存の Events for Cloud Run for Anthos のトリガーを移行する前に、トリガーの詳細を取得する必要があります。

  1. クラスタの既存の Cloud Run for Anthos のトリガーを一覧表示します。

    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 が必要になります。既存の Events for Cloud Run for Anthos トリガーのトピック 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 は、既存の Events for Cloud Run for Anthos の ID または完全修飾 ID に置き換えます。

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

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

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

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

  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. Cloud Run for Anthos の既存のトリガーの構成に基づいて、新しい Eventarc トリガーを作成します。宛先サービス、クラスタ、トピック ID を含むすべての引数が、既存の Events for Cloud Run for Anthos トリガーと一致している必要があります。

    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 トピックに公開してテストイベントをトリガーし、既存の Events for Cloud Run for Anthos トリガーと Eventarc トリガーのそれぞれに、少なくとも 1 つのイベントが配信されていることを確認します。

たとえば、Pub/Sub からイベントを受信するのチュートリアルを完了し、そのイベントを Events for Cloud Run for Anthos トリガーしている場合は、テストイベントのトリガー後の出力が重複し、次のようになります。

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

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

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

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

    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"
        }
      }
    

    Events for Cloud Run for Anthos のイベント:

    ☁️  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 へのトリガーの移行をテストして検証したら、元の Event for Cloud Run for Anthos トリガーを削除できます。

  1. Events for Cloud Run for Anthos トリガーを削除します。

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

既存の Events for Cloud Run for Anthos がトリガーを Eventarc に移行されました。

次のステップ