イベント トリガーを移行することで、Google Kubernetes Engine(GKE)サービス(Knative serving サービスを含む)が Eventarc を使用して Pub/Sub イベントを受信できるようになります。このガイドでは、既存のイベント トリガーを移行することと、GKE サービスが GKE クラスタで実行されていることを前提としています。移行はクラスタごとに行う必要があります。
この移行パスにより、重複を最小限に抑えながらイベントの損失を回避できます。
移行の手順は次のとおりです。
- Eventarc が GKE クラスタ内のリソースを管理できるようにするには、GKE の宛先を有効にします。
- 必要に応じて、ターゲット GKE サービスを実行している GKE クラスタの Workload Identity を有効にします。
- 既存のイベント トリガーを確認します。
- 既存のトリガーと同じ GKE サービスを参照する Eventarc トリガーを作成します。
- Eventarc トリガーによってイベントが想定どおり配信されていることを確認します。
- 元のイベント トリガーを削除し、移行後にクリーンアップします。
始める前に
このガイドでは、次のものが用意されていることを前提としています。
コマンドライン環境を設定する
gcloud
および kubectl
コマンドライン ツールを設定するには:
In the Google Cloud console, 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.
お使いのアカウントを使用してログインします。
gcloud auth login
次のように 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
次のように置き換えます。
プロジェクトで次の 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
kubectl
コマンドライン ツールをインストールします。gcloud components install kubectl
インストール済みの gcloud CLI コンポーネントを更新します。
gcloud components update
GKE の宛先を有効にする
Eventarc が GKE クラスタ内のリソースを管理できるようにするには、GKE の宛先を有効にし、Eventarc サービス アカウントを必要なロールにバインドします。
Eventarc 用に GKE の宛先を有効にします。
gcloud eventarc gke-destinations init
必要なロールをバインドするよう求められたら、「
y
」と入力します。次のロールがバインドされます。
roles/compute.viewer
roles/container.developer
roles/iam.serviceAccountAdmin
クラスタで Workload Identity Federation for GKE を有効にする
クラスタで Workload Identity Federation for GKE がすでに有効になっている場合は、この手順をスキップできます。
Workload Identity Federation for GKE は、セキュリティのプロパティと管理性が優れているため、GKE 内で実行されているアプリケーションから Google Cloud サービスにアクセスする場合におすすめの方法です。Eventarc を使用して GKE イベントを転送する必要もあります。
既存のクラスタで Workload Identity Federation for GKE を有効にするには、Workload Identity の使用をご覧ください。
既存のイベント トリガーを確認する
既存のイベント トリガーを移行する前に、トリガーの詳細を取得する必要があります。
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
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 の宛先のイベントを管理できるようにします。
Google Cloud サービス アカウント(GSA)を作成します。
TRIGGER_GSA=SERVICE_ACCOUNT_NAME gcloud iam service-accounts create $TRIGGER_GSA
SERVICE_ACCOUNT_NAME
は、6~30 文字の名前に置き換えます。小文字の英数字とハイフンを使用できます。サービス アカウントに
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"
既存のイベント トリガーの構成に基づいて、新しい 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 トリガーが作成されます。
トリガーが正常に作成されたことを確認します。
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
次のシナリオは、イベント レシーバがイベントデータを表示するためのガイダンスとしても使用できます。
Pub/Sub トピックにメッセージを公開します。
gcloud pubsub topics publish TOPIC_ID \ --message "Hello, World!"
イベントとその配信が成功したことを確認します。たとえば、受信側の GKE サービスのログを確認します。
kubectl logs \ --selector serving.knative.dev/service=DESTINATION_SERVICE \ -c user-container \ -n EVENTS_NAMESPACE \ --tail=100
2 つのトリガーの出力は次のようになります。違いは
Context Attributes
とExtensions
のみです。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 へのトリガーの移行をテストして検証した後に削除できます。
元のイベント トリガーを削除します。
gcloud beta events triggers delete TRIGGER_NAME \ --platform gke \ --namespace EVENTS_NAMESPACE \ --quiet
既存の Knative serving トリガーを Eventarc に移行しました。