このトピックでは、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 サービス アカウントをリンクする必要があります。次に例を示します。
- 証明書ファイル:
watcher: serviceAccountPath: ./apigee-org/my-hybrid-project-apigee-watcher.json
詳しくは、以下をご覧ください。
- Kubernetes Secret:
watcher: serviceAccountRef: my-watcher-k8s-secret
詳しくは、以下をご覧ください。
これらの手順で使用する環境変数
この手順では、次の環境変数を使用します。これらの変数をコマンドシェルで設定するか、コードサンプル内の値を実際の値に置き換えてください。
PROJECT_ID
: Google Cloud プロジェクトの ID。ORG_NAME
: Apigee 組織の名前。ENV_NAME
: Apigee 環境の名前。NAMESPACE
: Apigee 名前空間の名前。通常はapigee
です。CLUSTER_NAME
: クラスタの名前。CLUSTER_LOCATION
: クラスタのリージョンまたはゾーン(例:us-west1
)。APIGEECTL_HOME
:apigeectl
をインストールしたディレクトリ。HYBRID_FILES
: ハイブリッド ファイルのディレクトリ(例:hybrid-base-directory/hybrid-files
)。
環境変数を確認します。
echo $PROJECT_IDecho $ORG_NAME
echo $ENV_NAME
echo $NAMESPACE
echo $CLUSTER_NAME
echo $CLUSTER_LOCATION
echo $APIGEECTL_HOME
echo $HYBRID_FILES
必要な変数を初期化します。
export PROJECT_ID=my-project-idexport ORG_NAME=$PROJECT_ID
export ENV_NAME=my-environment-name
export NAMESPACE=apigee
export CLUSTER_NAME=my-cluster-name
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 を有効にする前に変数を初期化します。
次に、workloadIdentityEnabled: true
を設定してサービス アカウントを作成するの手順に沿って、Apigee ハイブリッド インストールで Workload Identity を有効にします。
Workload Identity を有効にする準備を行う
インストール プロセスを開始する前に、このセクションの手順に沿って進めてください。
- 変更するプロジェクトを設定します。
gcloud config set project $PROJECT_ID
-
次のコマンドを使用して、Workload Identity を有効にするクラスタの
gcloud
認証情報を取得します。gcloud container clusters get-credentials ${CLUSTER_NAME} \ --region ${CLUSTER_LOCATION} \ --project ${PROJECT_ID}
- 次のコマンドを使用して、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 の有効化をご覧ください。
- 各ノードプールで Workload Identity が有効になっていることを確認します。
- 次のコマンドを使用して、ノードプールを一覧表示します。
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
- ノードプールごとに次のコマンドを使用して、各ノードプールで 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 サービス アカウントを確認または作成する
インストール時に、多くの Apigee ハイブリッド コンポーネント用に Google サービス アカウントが作成されます。この手順で Google サービス アカウントを確認し、必要なサービス アカウントを作成します。
- 次のコマンドを使用して、プロジェクトの 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
コマンドを使用して各サービス アカウントに適切なロールを割り当てます。この方法では、各サービス アカウントを個別に作成する必要がありますが、鍵ファイルのダウンロードは回避できます。
次のコマンドを使用して、コンポーネントごとに Google サービス アカウントを作成します。create-service-account
本番環境
非本番環境の場合:
$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
次のサービス アカウントを作成してロールを割り当てます。
- サービス アカウント:
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"
- サービス アカウント:
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"
- サービス アカウント:
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"
- サービス アカウント:
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"
- サービス アカウント:
apigee-runtime
、ロール: ロールが割り当てられていません。アカウントを作成します。
gcloud iam service-accounts create apigee-runtime \ --display-name="apigee-runtime" \ --project $PROJECT_ID
- サービス アカウント:
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"
- サービス アカウント:
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"
- サービス アカウント:
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 サービス アカウントが作成されます。
gcp
スタンザの下のoverrides.yaml
ファイルに、以下の太字の行を追加します。これにより、インストール用に Workload Identity が有効になり、構成を適用する際にapigeectl
がトリガーされて Kubernetes サービス アカウントが作成されます。gcp: projectID: "my-project-id" name: "my-project-id" region: "analytics-region" workloadIdentityEnabled: true
cassandra
スタンザの下のoverrides.yaml
ファイルに、以下の太字の行を追加します。これにより、apigee-cassandra-backup
Kubernetes サービス アカウントの作成がトリガーされます。cassandra: ... backup: enabled: true
apigeectl
に--restore
フラグを指定して変更を適用します。$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --restore
- 次のコマンドを使用して、サービス アカウントを確認します。
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 サービス アカウントでアノテーションを付けます。
- ロールをバインドし、サービス アカウントにアノテーションを付けます。
組織レベルのコンポーネント
組織レベルのコンポーネントに Kubernetes サービス アカウントのアノテーションを付けます。この操作は、Apigee 組織内のコンポーネントごとに 1 回行う必要があります。
- Cassandra
Cassandra コンポーネントには、次の 6 つの Kubernetes サービス アカウントが関連付けられています。
apigee-cassandra-backup
apigee-cassandra-restore
apigee-cassandra-schema-setup
apigee-cassandra-schema-val
(val
= validation)apigee-cassandra-user-setup
apigee-datastore-default
本番環境
apigee-cassandra-backup
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-cassandra"
KSA_NAME="apigee-cassandra-backup
" - 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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
apigee-cassandra-restore
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-restore"
- 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
- サービス アカウントにアノテーションを付けます。
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
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
- サービス アカウントにアノテーションを付けます。
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
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-schema-val-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
- サービス アカウントにアノテーションを付けます。
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
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-user-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
apigee-datastore-default-sa
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-datastore-default-sa"
- 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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
apigee-cassandra-backup
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-non-prod"
KSA_NAME="apigee-connect-agent-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
apigee-cassandra-restore
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-restore"
- 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
- サービス アカウントにアノテーションを付けます。
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
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
- サービス アカウントにアノテーションを付けます。
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
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-schema-val-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
- サービス アカウントにアノテーションを付けます。
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
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-cassandra-user-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
- サービス アカウントにアノテーションを付けます。
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
KSA_NAME
環境変数を再定義します。KSA_NAME="apigee-datastore-default-sa"
- 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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- Apigee Connect
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-mart"
KSA_NAME="apigee-connect-agent-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-connect-agent-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- MART
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-mart"
KSA_NAME="apigee-mart-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-mart-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- Apigee 指標
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-metrics"
KSA_NAME="apigee-metrics-sa"
- 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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-metrics-sa"
- 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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- UDCA(組織レベル)
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-udca"
KSA_NAME="apigee-udca-org-level-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-udca-org-level-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- Apigee Watcher
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-watcher"
KSA_NAME="apigee-watcher-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-watcher-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
各環境の場合:
- ランタイム
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-runtime"
KSA_NAME="apigee-runtime-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-runtime-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- Synchronizer
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-synchronizer"
KSA_NAME="apigee-synchronizer-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-synchronizer-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- UDCA(環境レベル)
本番環境
- 環境変数
KSA_NAME
とGSA_NAME
を定義します。GSA_NAME="apigee-udca"
KSA_NAME="apigee-udca-env-level-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=$GSA_NAME@$PROJECT_ID.iam.gserviceaccount.com
非本番環境
KSA_NAME
環境変数を定義します。KSA_NAME="apigee-udca-env-level-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
- サービス アカウントにアノテーションを付けます。
kubectl annotate serviceaccount \ --namespace $NAMESPACE $KSA_NAME iam.gke.io/gcp-service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com
- 環境変数
- Cassandra
- 正しく実行されたかどうか確認します。
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
- 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- ログを確認します。
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
- 各サービス アカウントに 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
- 各 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
- 正しく実行されたかどうか確認します。
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
- 以前のインストールからアップグレードする場合は、サービス アカウントの秘密鍵を含むシークレットをクリーンアップします。
kubectl delete secrets -n $NAMESPACE $(k get secrets -n $NAMESPACE | grep svc-account | awk '{print $1}')
- ログを確認します。
kubectl logs -n $NAMESPACE -l app=apigee=synchronizer,env=$ENV_NAME,org=$ORG_NAME apigee-synchronizer