Apigee ハイブリッドによる Workload Identity の有効化

このトピックでは、Apigee ハイブリッドに対して Workload Identity を有効にする方法について説明します。

概要

Workload Identity は、GKE(Google Kubernetes Engine)内で実行されているアプリケーションが Google Cloud サービスにアクセスする方法です。Workload Identity の概要については、以下をご覧ください。

Google Cloud IAM サービス アカウントは、アプリケーションが Google API へのリクエストに使用できる ID です。このドキュメントでは、これらのサービス アカウントはを GSA(Google サービス アカウント)と呼びます。GSA の詳細については、サービス アカウントをご覧ください。

これとは別に、Kubernetes にはサービス アカウントというコンセプトもあります。サービス アカウントは、Pod で実行されるプロセスの ID を提供します。Kubernetes サービス アカウントは Kubernetes のリソースですが、Google サービス アカウントは Google Cloud 固有のものです。Kubernetes サービス アカウントの詳細については、Kubernetes ドキュメントの Pod のサービス アカウントの構成をご覧ください。

Apigee ハイブリッド 1.4 以降では、コンポーネントのタイプごとに Kubernetes サービス アカウントを作成して使用します。Workload Identity を有効にすると、ハイブリッド コンポーネントが Kubernetes サービス アカウントとやり取りできます。

Workload Identity を使用しない Apigee ハイブリッドでの Google サービス アカウント

Workload Identity を使用しない場合は、overrides.yaml ファイル内で証明書ファイルへの参照または Kubernetes Secret を使用して、各コンポーネントに Google サービス アカウントをリンクする必要があります。次に例を示します。

これらの手順で使用する環境変数

この手順では、次の環境変数を使用します。これらをコマンドシェルに設定するか、コードサンプル内のそれらを実際の値に置き換えます。

  • APIGEECTL_HOME: apigeectl をインストールしたディレクトリ。
  • CLUSTER_LOCATION: クラスタのリージョンまたはゾーン(例: us-west1)。
  • ENV_NAME: Apigee 環境の名前。
  • NAMESPACE: Apigee ハイブリッドに使用している Kubernetes 名前空間。通常は apigee
  • HYBRID_FILES: ハイブリッド ファイルのディレクトリ(例: hybrid-base-directory/hybrid-files)。
  • ORG_NAME: Apigee 組織の名前。
  • PROJECT_ID: Google Cloud プロジェクトの ID。

環境変数を確認します。

echo $PROJECT_ID
echo $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES

必要な変数を初期化します。

export PROJECT_ID=my-project-id
export ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_LOCATION=my-cluster-location
export APIGEECTL_HOME=hybrid-base-directory/apigeectl
export HYBRID_FILES=hybrid-base-directory/hybrid-files

Workload Identity とサービス アカウント キー ファイル

GKE で Apigee ハイブリッドを実行するときには、通常、各サービス アカウントの秘密鍵(.json ファイル)を作成してダウンロードします。Workload Identity を使用する場合、サービス アカウントの秘密鍵をダウンロードして GKE クラスタに追加する必要はありません。

Apigee ハイブリッド インストールの一部としてサービス アカウント キー ファイルをダウンロードした場合は、Workload Identity を有効にした後、それらのファイルを削除できます。ほとんどのインストールで、これらは hybrid-base-directory/hybrid-files/service-accounts/ ディレクトリにあります。

Apigee ハイブリッドで Workload Identity を有効にする

開始するには、Workload Identity を有効にする準備の手順に沿ってノードプールを更新し、Workload Identity を有効にする前に変数を初期化します。

実施する手順に応じて、次のいずれかのセクションの内容を行います。

Workload Identity を有効にする準備を行う

インストール プロセスを開始する前に、このセクションの手順に沿って進めてください。

  1. 変更するプロジェクトを設定します。
    gcloud config set project $PROJECT_ID
  2. 次のコマンドを使用して、Workload Identity を有効にするクラスタの gcloud 認証情報を取得します。
    gcloud container clusters get-credentials ${CLUSTER_NAME} \
      --region ${CLUSTER_LOCATION} \
      --project ${PROJECT_ID}
  3. 次のコマンドを使用して、Apigee を実行している GKE クラスタで Workload Identity が有効になっていることを確認します。
    gcloud container clusters describe $CLUSTER_NAME --region $CLUSTER_LOCATION --project $PROJECT_ID

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

    
      
      status: RUNNING
      subnetwork: default
      workloadIdentityConfig:
        workloadPool: my-project-id.svc.id.goog

    必要に応じて、クラスタで Workload Identity を有効にします。この処理には最長で 30 分ほどかかります。

      gcloud container clusters update $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --project $PROJECT_ID \
      --region $CLUSTER_LOCATION

    詳細については、Workload Identity の有効化をご覧ください。

  4. 各ノードプールで Workload Identity が有効になっていることを確認します。
    1. 次のコマンドを使用して、ノードプールを一覧表示します。
      gcloud container node-pools list \
        --cluster $CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID

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

        NAME            MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
        apigee-runtime  e2-standard-4  100           1.23.12-gke.100
        apigee-data     e2-standard-4  100           1.23.12-gke.100
    2. ノードプールごとに次のコマンドを使用して、ノードプールごとに Workload Identity が有効になっていることを確認します。
      gcloud container node-pools update NODE_POOL_NAME \
        --cluster=$CLUSTER_NAME \
        --region $CLUSTER_LOCATION \
        --project $PROJECT_ID \
        --workload-metadata=GKE_METADATA

      ここで、NODE_POOL_NAME は各ノードプールの名前です。

Google サービス アカウントを確認または作成する

Google サービス アカウントは、インストール時に多くの Apigee ハイブリッド コンポーネント用に作成されます。 この手順で Google サービス アカウントを確認し、必要なサービス アカウントを作成します。

  1. 次のコマンドを使用して、プロジェクトの Google サービス アカウントの名前を確認します。
    gcloud iam service-accounts list --project $PROJECT_ID

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

    本番

    本番以外の環境の場合:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-logger        apigee-logger@my_project_id.iam.gserviceaccount.com        False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    本番以外の環境

    非本番環境の場合:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    

    プロジェクトの Google サービス アカウントを作成する必要がある場合は、次の 2 つの方法を使用できます。

    • apigeectl/tools/ ディレクトリに Apigee とともに含まれる create-service-account ツールを使用します。このツールを使用すると、すべてのサービス アカウントを 1 つのコマンドで作成することも、個別に作成することもできます。
    • gcloud iam service-accounts create コマンドを使用してサービス アカウントを 1 つずつ作成し、gcloud projects add-iam-policy-binding コマンドを使用して各サービス アカウントに適切なロールを割り当てます。この方法では、各サービス アカウントを個別に作成する必要がありますが、キーファイルをダウンロードすることは回避できます。

    create-service-account

    次のコマンドを使用して、コンポーネントごとに Google サービス アカウントを作成します。

    本番

    本番以外の環境の場合:

    $APIGEECTL_HOME/tools/create-service-account --env prod --dir $APIGEECTL_HOME/../service-accounts

    このコマンドにより、次のサービス アカウントが作成されます。

    • apigee-cassandra
    • apigee-logger
    • apigee-mart
    • apigee-metrics
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    • apigee-watcher

    非本番環境

    本番以外の環境の場合:

    $APIGEECTL_HOME/tools/create-service-account --env non-prod --dir $APIGEECTL_HOME/../service-accounts

    このコマンドにより、単一のサービス アカウント apigee-non-prod が作成され、すべての Apigee コンポーネントの管理に必要なロールがすべて割り当てられます。

    gcloud

    次のサービス アカウントを作成してロールを割り当てます。

    1. サービス アカウント: apigee-cassandraロール: roles/storage.objectAdmin

      アカウントを作成します。

      gcloud iam service-accounts create apigee-cassandra \
        --display-name="apigee-cassandra" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/storage.objectAdmin"
                  
    2. サービス アカウント: apigee-loggerロール: roles/logging.logWriter

      アカウントを作成します。

      gcloud iam service-accounts create apigee-logger \
        --display-name="apigee-logger" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-logger@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/logging.logWriter"
                  
    3. サービス アカウント: apigee-martロール: roles/apigeeconnect.Agent

      アカウントを作成します。

      gcloud iam service-accounts create apigee-mart \
        --display-name="apigee-mart" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-mart@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigeeconnect.Agent"
                  
    4. サービス アカウント: apigee-metricsロール: roles/monitoring.metricWriter

      アカウントを作成します。

      gcloud iam service-accounts create apigee-metrics \
        --display-name="apigee-metrics" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/monitoring.metricWriter"
                  
    5. サービス アカウント: apigee-runtimeロール: ロールが割り当てられていません。

      アカウントを作成します。

      gcloud iam service-accounts create apigee-runtime \
        --display-name="apigee-runtime" \
        --project $PROJECT_ID
                  
    6. サービス アカウント: apigee-synchronizerロール: roles/apigee.synchronizerManager

      アカウントを作成します。

      gcloud iam service-accounts create apigee-synchronizer \
        --display-name="apigee-synchronizer" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.synchronizerManager"
                  
    7. サービス アカウント: apigee-udcaロール: roles/apigee.analyticsAgent

      アカウントを作成します。

      gcloud iam service-accounts create apigee-udca \
        --display-name="apigee-udca" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-udca@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.analyticsAgent"
                  
    8. サービス アカウント: apigee-watcherロール: roles/apigee.runtimeAgent

      アカウントを作成します。

      gcloud iam service-accounts create apigee-watcher \
        --display-name="apigee-watcher" \
        --project $PROJECT_ID
                  

      ロールを割り当てます。

      gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member="serviceAccount:apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com" \
        --role="roles/apigee.runtimeAgent"
                  

workloadIdentityEnabled: true を設定してサービス アカウントを作成する

オーバーライド ファイルで workloadIdentityEnabled: true を設定して変更を適用すると、apigeectl で Apigee ハイブリッド コンポーネントごとに Kubernetes サービス アカウントが作成されます。

  1. 以下の太字の行を、gcp スタンザの下の overrides.yaml ファイルに追加します。これにより、インストール用に Workload Identity が有効になり、構成を適用する際に apigeectl がトリガーされて Kubernetes サービス アカウントが作成されます。
    gcp:
      projectID: "my-project-id"
      name: "my-project-id"
      region: "analytics-region"
      workloadIdentityEnabled: true
  2. 以下の太字の行を、cassandra スタンザの下の overrides.yaml ファイルに追加します。これにより、apigee-cassandra-backup Kubernetes サービス アカウントの作成がトリガーされます。
    cassandra:
      ...
      backup:
        enabled: true
  3. apigeectl--restore フラグを指定して変更を適用します。
    $APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
  4. 次のコマンドを使用して、サービス アカウントを確認します。
    kubectl get sa -n $NAMESPACE

    出力は次のようになります。太字の Kubernetes サービス アカウントには、Google サービス アカウントでアノテーションを付ける必要があります。

    NAME                                                         SECRETS   AGE
    apigee-cassandra-backup                                      1         11m
    apigee-cassandra-restore                                     1         11m
    apigee-cassandra-schema-setup-my-project-id-123abcd-sa       1         11m
    apigee-cassandra-schema-val-my-project-id-123abcd            1         11m
    apigee-cassandra-user-setup-my-project-id-123abcd-sa         1         11m
    apigee-connect-agent-my-project-id-123abcd-sa                1         11m
    apigee-datastore-default-sa                                  1         11m
    apigee-ingressgateway                                        1         11m
    apigee-ingressgateway-my-project-id-123abcd                  1         11m
    apigee-ingressgateway-manager                                1         11m
    apigee-init                                                  1         11m
    apigee-mart-my-project-id-123abcd-sa                         1         11m
    apigee-metrics-sa                                            1         11m
    apigee-mint-task-scheduler-my-project-id-123abcd-sa          1         11m
    apigee-redis-default-sa                                      1         11m
    apigee-redis-envoy-default-sa                                1         11m
    apigee-runtime-my-project-id-env-name-234bcde-sa             1         11m
    apigee-synchronizer-my-project-id-env-name-234bcde-sa        1         11m
    apigee-udca-my-project-id-123abcd-sa                         1         11m
    apigee-udca-my-project-id-env-name-234bcde-sa                1         11m
    apigee-watcher-my-project-id-123abcd-sa                      1         11m
    default                                                      1         11m
        

Kubernetes サービス アカウントに Google サービス アカウントでアノテーションを付ける

Apigee コンポーネントごとに、そのコンポーネントの Google サービス アカウントで、対応する Kubernetes サービス アカウントにアノテーションを付けます。

組織レベルのコンポーネント

Kubernetes サービス アカウントのインスタンスは、Apigee 組織ごとに 1 つだけです。

コンポーネント Kubernetes サービス アカウント Google サービス アカウント
Cassandra apigee-cassandra-backup apigee-cassandra
apigee-cassandra-restore apigee-cassandra
apigee-cassandra-schema-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-cassandra-schema-val-my-project-id-num-id1 apigee-cassandra
apigee-cassandra-user-setup-my-project-id-num-id1-sa apigee-cassandra
apigee-datastore-default-sa apigee-cassandra
Apigee Connect apigee-connect-agent-my-project-id-num-id1-sa apigee-mart
MART apigee-mart-my-project-id-num-id1-sa apigee-mart
指標 apigee-metrics-sa apigee-metrics
UDCA(組織レベル) apigee-udca-my-project-id-num-id1-sa apigee-udca
Watcher apigee-watcher-my-project-id-num-id1-sa apigee-watcher

環境レベルのコンポーネント

Apigee 環境ごとに、Kubernetes サービス アカウントごとのインスタンスが 1 つ作成されます。

コンポーネント Kubernetes サービス アカウント Google サービス アカウント
Apigee ランタイム apigee-runtime-my-project-id-env-name-num-id2-sa apigee-runtime
Synchronizer apigee-synchronizer-my-project-id-env-name-num-id2-sa apigee-synchronizer
UDCA(環境レベル) apigee-udca-my-project-id-env-name-num-id2-sa apigee-udca

次のコマンドでは、kubectl get sa -n $NAMESPACE コマンドから返された Kubernetes サービス アカウント名(apigee-cassandra-schema-val-hybrid-example-project-123abcd など)を使用します。

この手順では、Kubernetes サービス アカウントごとに次の操作を行います。

  • Kubernetes サービス アカウントとプリンシパルの Google サービス アカウントを roles/iam.workloadIdentityUser IAM ロールにバインドします。
  • Kubernetes サービス アカウントに Google サービス アカウントでアノテーションを付けます。
  1. ロールをバインドし、サービス アカウントにアノテーションを付けます。

    組織レベルのコンポーネント

    組織レベルのコンポーネントに Kubernetes サービス アカウントのアノテーションを付けます。この操作は、Apigee 組織内のコンポーネントごとに 1 回行う必要があります。

    • Cassandra

      Cassandra コンポーネントには、次の 6 つの Kubernetes サービス アカウントが関連付けられています。

      • apigee-cassandra-backup
      • apigee-cassandra-restore
      • apigee-cassandra-schema-setup
      • apigee-cassandra-schema-val val = 検証)
      • apigee-cassandra-user-setup
      • apigee-datastore-default

      本番

      apigee-cassandra-backup

      1. KSA_NAME および GSA_NAME 環境変数を定義します。
        GSA_NAME="apigee-cassandra"
        KSA_NAME="apigee-cassandra-backup"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-restore"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"

        IAM ロールをバインドします。

        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      2. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-datastore-default-sa"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      apigee-cassandra-backup

      1. KSA_NAME および GSA_NAME 環境変数を定義します。
        GSA_NAME="apigee-non-prod"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-restore

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-restore"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-setup-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-schema-setup-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-schema-val-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-schema-val-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-cassandra-user-setup-service-account-name

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-cassandra-user-setup-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

      apigee-datastore-default-sa

      1. KSA_NAME 環境変数を再定義します。

        KSA_NAME="apigee-datastore-default-sa"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Connect

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。
        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-connect-agent-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-connect-agent-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • MART

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-mart"
        KSA_NAME="apigee-mart-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-mart-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee 指標

      本番環境

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-metrics"
        KSA_NAME="apigee-metrics-sa"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-metrics-sa"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA(組織レベル)

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-udca-org-level-service-account-name"
      2. IAM ロールをバインドします。
          gcloud iam service-accounts add-iam-policy-binding \
            --role roles/iam.workloadIdentityUser \
            --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
            $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
          kubectl annotate serviceaccount \
            --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Apigee Watcher

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-watcher"
        KSA_NAME="apigee-watcher-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-watcher-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com

    各環境の場合:

    • ランタイム

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-runtime"
        KSA_NAME="apigee-runtime-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-runtime-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • Synchronizer

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-synchronizer"
        KSA_NAME="apigee-synchronizer-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-synchronizer-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
    • UDCA(環境レベル)

      本番

      1. KSA_NAME および GSA_NAME 環境変数を定義します。

        GSA_NAME="apigee-udca"
        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com

      非本番環境

      1. KSA_NAME 環境変数を定義します。

        KSA_NAME="apigee-udca-env-level-service-account-name"
      2. IAM ロールをバインドします。
        gcloud iam service-accounts add-iam-policy-binding \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
          $GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
      3. サービス アカウントにアノテーションを付けます。
        kubectl annotate serviceaccount \
          --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
  2. 手順が動作するかどうかを確認します。
    gcloud config set project $PROJECT_ID
    

    テストする Kubernetes サービス アカウントを選択します(例: apigee-cassandra-backup)。

    KSA_NAME="kubernetes-service-account-name"
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    コマンド プロンプトが表示されない場合は、Enter キーを押してください。

    手順が正しく行われたら、次のようなレスポンスが表示されます。

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
  3. 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  4. ログを確認します。
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer
    

Workload Identity を使用するためにインストールをアップグレードする

既存のハイブリッド インストールに Workload Identity を追加するには、次の手順に沿って操作します。

次のサンプルは、Apigee 用に作成された Google サービス アカウント(GSA)を示しています。

gcloud iam service-accounts list --filter "apigee"
DISPLAY NAME       EMAIL                                                  DISABLED
apigee-cassandra   apigee-cassandra@PROJECT_ID.iam.gserviceaccount.com    False
apigee-connect     apigee-connect@PROJECT_ID.iam.gserviceaccount.com      False
apigee-runtime     apigee-runtime@PROJECT_ID.iam.gserviceaccount.com      False
apigee-metrics     apigee-metrics@PROJECT_ID.iam.gserviceaccount.com      False
apigee-mart        apigee-mart@PROJECT_ID.iam.gserviceaccount.com         False
apigee-watcher     apigee-watcher@PROJECT_ID.iam.gserviceaccount.com      False
apigee-sync        apigee-sync@PROJECT_ID.iam.gserviceaccount.com         False
apigee-udca        apigee-udca@$PROJECT_ID.iam.gserviceaccount.com        False

Apigee 用に作成された Kubernetes サービス アカウント(KSA)の例を次に示します。

kubectl get sa -n $NAMESPACE
apigee-cassandra-schema-setup-ORG_NAME-cb84b88-sa             1         xxd
apigee-cassandra-user-setup-ORG_NAME-cb84b88-sa               1         xxd
apigee-connect-agent-ORG_NAME-cb84b88-sa                      1         xxd
apigee-init                                                   1         xxd
apigee-mart-ORG_NAME-cb84b88-sa                               1         xxd
apigee-metrics-apigee-telemetry                               1         xxd
apigee-runtime-ORG_NAME-ENV_NAME-1d0dc5e-sa                   1         xxd
apigee-synchronizer-ORG_NAME-ENV_NAME-1d0dc5e-sa              1         xxd
apigee-udca-ORG_NAME-ENV_NAME-1d0dc5e-sa                      1         xxd
apigee-watcher-ORG_NAME-cb84b88                               1         xxd
  1. 各サービス アカウントに Workload Identity ロールを追加します。
    gcloud iam service-accounts add-iam-policy-binding \
      --role roles/iam.workloadIdentityUser \
      --member "serviceAccount:$PROJECT_ID.svc.id.goog[$NAMESPACE/$KSA_NAME]" \
      GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    たとえば、Apigee Synchronizer の権限を設定する場合は、次のコマンドを実行します。

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:$PROJECT_ID.svc.id.goog[apigee/$KSA_NAME]" apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  2. 各 KSA に GSA の詳細を付けます。
    kubectl annotate serviceaccount \
      --namespace $NAMESPACE \
      $KSA_NAME \
      iam.gke.io/gcp-service-account=GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
    

    たとえば、Apigee Synchronizer の権限を設定する場合は、次のコマンドを実行します。

    export KSA_NAME=$(kubectl get sa -n apigee -l app=apigee-synchronizer,env=$ENV_NAME,org=$ORG_NAME --output=jsonpath={.items..metadata.name})
    
    kubectl annotate serviceaccount --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-sync@$PROJECT_ID.iam.gserviceaccount.com
    
  3. 手順が動作するかどうかを確認します。
    gcloud config set project $PROJECT_ID
    
    kubectl run --rm -it --image google/cloud-sdk:slim \
      --namespace $NAMESPACE workload-identity-test\
      -- gcloud auth list

    コマンド プロンプトが表示されない場合は、Enter キーを押してください。

    手順が正しく行われたら、次のようなレスポンスが表示されます。

                       Credentialed Accounts
    ACTIVE  ACCOUNT
    *       GSA@PROJECT_ID.iam.gserviceaccount.com
  4. 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
    kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
    
  5. ログを確認します。
    kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer