ステップ 5: サービス アカウントの認証を設定する

概要

このステップでは、前のステップで作成した Google Cloud サービス アカウントの認証方法を設定する方法について説明します。

使用する認証方法の手順を選択します。さまざまな認証方法の概要については、Apigee ハイブリッドのサービス アカウント認証方法をご覧ください。

Kubernetes Secret

サービス アカウント

次のサービス アカウントの Kubernetes Secret を作成する必要があります。

本番環境

  • apigee-cassandra
  • apigee-logger
  • apigee-mart
  • apigee-metrics
  • apigee-mint-task-schedulerApigee ハイブリッドの収益化を使用している場合)
  • apigee-runtime
  • apigee-synchronizer
  • apigee-udca
  • apigee-watcher

非本番環境

  • apigee-non-prod

これらの Secret は、オーバーライド ファイルを作成するの手順で指定します。

この手順では、次の省略可能な環境変数を使用します。

  • $APIGEE_HELM_CHARTS_HOME
  • $APIGEE_NAMESPACE
  • $PROJECT_ID

これらの変数を定義していない場合は、コードサンプルの各変数を適切な値で置き換えてください。

Kubernetes Secret を作成する

サービス アカウント キーを保存する Kubernetes Secret を作成します。

次のコードサンプルの kubectl create secret コマンドの構造は次のとおりです。

kubectl create secret generic SECRET_NAME \
  --from-file="client_secret.json=PATH_TO_SERVICE_ACCOUNT_KEY" \
  -n $APIGEE_NAMESPACE

本番環境

kubectl create secret generic apigee-logger-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-logger.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-metrics-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-metrics.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-watcher-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-watcher.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-udca-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-udca.json" \
  -n $APIGEE_NAMESPACE
    
kubectl create secret generic apigee-mart-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mart.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-synchronizer-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-synchronizer.json" \
  -n $APIGEE_NAMESPACE

kubectl create secret generic apigee-runtime-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-runtime.json" \
  -n $APIGEE_NAMESPACE

Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler サービス アカウントの Kubernetes Secret も作成する必要があります。

kubectl create secret generic apigee-mint-task-scheduler-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mint-task-scheduler.json" \
  -n APIGEE_NAMESPACE

非本番環境

kubectl create secret generic apigee-non-prod-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-non-prod.json" \
  -n $APIGEE_NAMESPACE

省略可: Kubernetes Secret を作成したら、サービス アカウントの JSON ファイルを削除できます。

Apigee ハイブリッドで Kubernetes Secret を使用する方法については、Kubernetes Secret にサービス アカウント キーを保存するをご覧ください。

JSON ファイル

JSON ファイルで認証を設定するために追加の手順は必要ありません。ステップ 6: TLS 証明書を作成するに進みます。

Vault

Vault にサービス アカウントの Secret を保存するように設定する

CSI ドライバと Vault プロバイダをインストールする

Helm を使用してクラスタに CSI ドライバをまだインストールしていない場合は、Secrets Store CSI ドライバ: インストールの手順に沿って対応します。詳細については、Vault ドキュメントの Vault CSI プロバイダのインストールをご覧ください。

Apigee ハイブリッドでサポートされている CSI ドライバの最小バージョンについては、Apigee ハイブリッドでサポートされているプラットフォームとバージョンをご覧ください。

Vault の Secret、ポリシー、ロールを作成する

Vault UI または API を使用して Secret を作成し、Apigee ハイブリッドで使用される Kubernetes サービス アカウントに、それらの Secret を読み取る権限を付与します。

  1. 組織と環境固有の Secret を次の形式で作成します。
    秘密鍵Secret データ
    secret/data/apigee/orgsakeys
    {
        "cassandraBackup": "***",
        "cassandraRestore": "***",
        "connectAgent": "***",
        "logger": "***",
        "mart": "***",
        "metrics": "***",
        "mint": "***",
        "udca": "***",
        "watcher": "***"
    }
    secret/data/apigee/envsakeys-ENV_NAME
    {
        "runtime": "***",
        "synchronizer": "***",
        "udca": "***".
    }

    各ペアの "***" を、apigee コンポーネントに対応する Google サービス アカウントの .json ファイルの内容に置き換えます。apigee-cassandra-backupapigee-cassandra-restore はどちらも apigee-cassandra サービス アカウントを使用します。次に例を示します。

    {
        "cassandraBackup": "{
            "type": "service_account",
            "project_id": "myhybridorg",
            "private_key_id": "PRIVATE_KEY_ID",
            "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY_TEXT\n-----END PRIVATE KEY-----\n",
            "client_email": "apigee-cassandra@myhybridorg.iam.gserviceaccount.com",
            "client_id": "123456789012345678901",
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/apigee-cassandra%40myhybridorg.iam.gserviceaccount.com",
            "universe_domain": "googleapis.com"
        }",
        "cassandraRestore":...
    ...
    }
  2. 組織の Secret にアクセス権を付与します。次の内容を含むテキスト ファイルを、orgsakeys-auth-policy.txt という名前で作成します。
    path "secret/data/apigee/orgsakeys" {
        capabilities = ["read"]
    }
  3. Vault 内で、組織の Secret へのアクセス権を付与するポリシーを作成します。
    vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
  4. 環境ごとに、次の内容を含むテキスト ファイルを envsakeys-ENV_NAME-auth-policy.txt という名前で作成します。
    path "secret/data/apigee/envsakeys-ENV_NAME" {
        capabilities = ["read"]
    }

    この手順を環境ごとに繰り返します。

  5. Vault 内で、環境の Secret へのアクセス権を付与するポリシーを作成します。
    vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

    この手順を環境ごとに繰り返します。

  6. 次の内容のスクリプトを generate-encoded-sas.sh という名前で作成します。
    # generate-encoded-sas.sh
    
    ORG=$APIGEE_ORG            # Apigee organization name
    ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
    
    ORG_SHORT_NAME=$(echo $ORG | head -c 15)
    ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
    ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
    NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
    
    for ENV in ${ENVS//,/ }
    do
        ENV_SHORT_NAME=$(echo $ENV | head -c 15)
        ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
        ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
        NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
    done
    
    echo $NAMES
    
  7. スクリプトを実行して、ポリシーをバインドするサービス アカウント名のリストを生成します。
    ./generate-encoded-sas.sh

    出力は、次の例のように、カンマで区切られた Kubernetes サービス アカウント名のリストになります。

    ./generate-encoded-sas.sh
    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
    bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
    igee-runtime-myhybridorg-prod-2d0221c
  8. 出力テキストをコピーして複数のリストに分割します。一つのリストは org サービス アカウント名用で、別のリストは各環境の env サービス アカウント名用です。org サービス アカウントは、apigee-logger-apigee-telemetry までの出力リストの先頭にあります。

    前述の例の org サービス名のリスト:

    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try

    env サービス アカウント名にはパターン apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXTapigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT があります。これらを環境ごとに別個のリストに分割します。たとえば、前述の例の出力は次の 2 つのリストに分割できます。

    dev 環境:

    apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
    org-dev-ee52aca

    prod 環境:

    apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
    dorg-prod-2d0221c
  9. ポリシーを使用して、組織固有の Apigee サービス アカウントをバインドする Vault ロールを作成します。
    vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
    
  10. 環境ごとに、サービス アカウント キーの Vault ロールを作成します。
    vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
    

    すべての環境について、この手順を繰り返します。

SecretProviderClass オブジェクトの作成

SecretProviderClass リソースは、Secret をリクエストするときに通信するプロバイダを CSI ドライバに伝えます。サービス アカウント キーは、このオブジェクトを介して構成する必要があります。次の表に、Apigee Hybrid で想定されるファイル名(objectNames)を示します。

サービス アカウント想定される Secret ファイル名
Cassandra バックアップ cassandraBackup
Cassandra の復元 cassandraRestore
Connect Agent connectAgent
Logger logger
MART mart
指標 metrics
収益化
Apigee ハイブリッドの収益化を使用している場合)
mint
ランタイム runtime
Synchronizer synchronizer
UDCA udca
Watcher watcher
  1. 次の SecretProviderClass テンプレートを使用して、組織固有の Secret 用にこのリソースを構成します。
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
        name: apigee-orgsakeys-spc
    spec:
        provider: vault
        parameters:
            roleName: apigee-orgsakeys
            vaultAddress: VAULT_ADDRESS
            # "objectName" is an alias used within the SecretProviderClass to reference
            # that specific secret. This will also be the filename containing the secret.
            # Apigee Hybrid expects these exact values so they must not be changed.
            # "secretPath" is the path in Vault where the secret should be retrieved.
            # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
                - objectName: "cassandraBackup"
                    secretPath: ""
                    secretKey: ""
                - objectName: "cassandraRestore"
                    secretPath: ""
                    secretKey: ""
                - objectName: "connectAgent"
                    secretPath: ""
                    secretKey: ""
                - objectName: "logger"
                    secretPath: ""
                    secretKey: ""
                - objectName: "mart"
                    secretPath: ""
                    secretKey: ""
                - objectName: "metrics"
                    secretPath: ""
                    secretKey: ""
                - objectName: "mint"
                    secretPath: ""
                    secretKey: ""
                - objectName: "udca"
                    secretPath: ""
                    secretKey: ""
                - objectName: "watcher"
                    secretPath: ""
                    secretKey: ""
    

    VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタで実行されている場合、一般的な形式は http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

    テンプレートを spc-org.yaml という名前のファイルに保存します。

  2. 組織固有の SecretProviderClass を apigee Namespace に適用します。
    kubectl -n $APIGEE_NAMESPACE apply -f spc-org.yaml
  3. 環境ごとに、次の SecretProviderClass テンプレートを使用して、環境固有の Secret 用にこのリソースを構成します。すべての環境について、この手順を繰り返します。
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
        name: apigee-envsakeys-ENV_NAME-spc
    spec:
        provider: vault
        parameters:
            roleName: apigee-envsakeys-ENV_NAME
            vaultAddress: VAULT_ADDRESS
            # "objectName" is an alias used within the SecretProviderClass to reference
            # that specific secret. This will also be the filename containing the secret.
            # Apigee Hybrid expects these exact values so they must not be changed.
            # "secretPath" is the path in Vault where the secret should be retrieved.
            # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
                - objectName: "runtime"
                    secretPath: ""
                    secretKey: ""
                - objectName: "synchronizer"
                    secretPath: ""
                    secretKey: ""
                - objectName: "udca"
                    secretPath: ""
                    secretKey: ""
    

    VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタと名前空間で実行されている場合、一般的な形式は http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

    テンプレートを spc-env-ENV_NAME.yaml という名前のファイルに保存します。

  4. 環境ごとに、環境固有の SecretProviderClass を apigee Namespace に適用します。
    kubectl -n $APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml

    すべての環境について、この手順を繰り返します。

  5. 省略可: SecretProviderClass オブジェクトを作成したら、サービス アカウントの JSON ファイルを削除できます。

GKE 用 WIF

Workload Identity Federation for GKE の構成を準備する

  1. オーバーライド ファイルで Workload Identity Federation for GKE が有効になっていることを確認します。オーバーライド ファイルの次のプロパティで有効にする必要があります。
    • namespace は必須です。次に例を示します。
      instanceID: "hybrid-instance-1"
      namespace: "apigee"
      
    • すべてのコンポーネントに 1 つのサービス アカウント(非本番環境)を使用する場合は、gcp.workloadIdentity.gsa で指定します。次に例を示します。
        gcp:
          workloadIdentity:
            enabled: true
            gsa: "apigee-non-prod@my-hybrid-project.iam.gserviceaccount.com"
        
    • コンポーネント(本番環境)ごとに個別のサービス アカウントを使用する場合は、コンポーネントの gsa プロパティでサービス アカウントを指定します。次に例を示します。
        logger:
          gsa: "apigee-logger@my-hybrid-project.iam.gserviceaccount.com"
        

    参照: gcp.workloadIdentity.enabled

  2. 次のコマンドを使用して、Google Cloud プロジェクト ID に設定されている現在の gcloud 構成を確認します。
    gcloud config get project
  3. 必要に応じて、現在の gcloud 構成を設定します。

    gcloud config set project $PROJECT_ID
  4. GKE クラスタで Workload Identity Federation for GKE が有効になっていることを確認します。ステップ 1: クラスタを作成するでクラスタを作成したとき、ステップ 6 で GKE 用 Workload Identity 連携を有効にしました。次のコマンドを使用して、有効になっていることを確認します。

    リージョン クラスタ

    gcloud container clusters describe $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

    ゾーンクラスタ

    gcloud container clusters describe $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten 'workloadIdentityConfig'

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

      ---
      workloadPool: $PROJECT_ID.svc.id.goog

    結果に null が表示された場合は、次のコマンドを実行してクラスタで Workload Identity Federation for GKE を有効にします。

    リージョン クラスタ

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

    ゾーンクラスタ

    gcloud container clusters update  $CLUSTER_NAME \
      --workload-pool=$PROJECT_ID.svc.id.goog \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID
  5. 次のコマンドを使用して、各ノードプールで Workload Identity Federation for GKE を有効にします。このオペレーションは、ノードごとに最大 30 分かかることがあります。

    リージョン クラスタ

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    ゾーンクラスタ

    gcloud container node-pools update NODE_POOL_NAME \
      --cluster=$CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --workload-metadata=GKE_METADATA

    ここで、NODE_POOL_NAME は各ノードプールの名前です。ほとんどの Apigee ハイブリッド インストールでは、2 つのデフォルト ノードプールは apigee-dataapigee-runtime という名前になっています。

  6. 次のコマンドを使用して、ノードプールで Workload Identity Federation for GKE が有効になっていることを確認します。

    リージョン クラスタ

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --region $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

    ゾーンクラスタ

    gcloud container node-pools describe apigee-data \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"
    gcloud container node-pools describe apigee-runtime \
      --cluster $CLUSTER_NAME \
      --zone $CLUSTER_LOCATION \
      --project $PROJECT_ID \
      --flatten "config:"

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

    ---
    diskSizeGb: 100
    diskType: pd-standard
    ...
    workloadMetadataConfig:
      mode: GKE_METADATA
        

他のプラットフォームでの WIF

GKE 以外のプラットフォームで Workload Identity 連携を使用する場合は、次の方法で SA 認証を構成できます。

  • Kubernetes Secret
  • サービス アカウントの JSON ファイル
  • Vault

以降の手順では、使用している認証方法のタブを選択してください。

この手順では、ステップ 2: Apigee Helm チャートをダウンロードするで定義した次の 2 つの環境変数を使用します。これらの変数は省略可能です。これらを定義していない場合は、コードサンプルの各変数を適切なディレクトリ パスで置き換えてください。

AKS へのインストールの場合は、OpenID Connect(OIDC)発行元が有効になっていることを確認します。Workload Identity 連携が OpenID Connect メタデータとクラスタの JSON Web Key Set(JWKS)にアクセスできるように、この機能を有効にする必要があります。

Workload Identity 連携を使用するようにクラスタを構成します。

  1. 次のコマンドを使用して、Google Cloud プロジェクト ID に設定されている現在の gcloud 構成を確認します。
    gcloud config get project
  2. 必要に応じて、現在の gcloud 構成を設定します。

    gcloud config set project $PROJECT_ID
  3. Security Token Service API を有効にします。

    次のコマンドを使用して、Security Token Service API が有効になっていることを確認します。

    gcloud services list --enabled --project $PROJECT_ID | grep sts.googleapis.com

    API が有効になっていない場合:

    コンソール

    Enable the Security Token Service API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

    コマンドライン

    次のコマンドで API を有効にします。

    gcloud services enable sts.googleapis.com --project $PROJECT_ID
  4. Workload Identity のプールとプロバイダを作成します。

    必要なロール

    Workload Identity 連携の構成に必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

    ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

    必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

    また、IAM オーナー(roles/owner)の基本ロールには ID 連携を構成する権限も含まれています。本番環境では基本ロールを付与すべきではありません。基本ロールは、開発環境またはテスト環境で付与してください。

    Workload Identity のプールとプロバイダを作成する手順は次のとおりです。

    1. AKS クラスタの発行元 URL を確認します。

      AKS

      az aks show -n CLUSTER_NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

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

      • CLUSTER_NAME: クラスタの名前。
      • RESOURCE_GROUP: クラスタのリソース グループ。

      このコマンドによって発行元の URL が出力されます。次のいずれかの手順で発行元の URL が必要になります。

      コマンドで発行元の URL が返されない場合は、OIDC 発行者機能が有効になっていることを確認します。

      EKS

      aws eks describe-cluster --name CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text
      

      CLUSTER_NAME は、クラスタの名前に置き換えます。

      このコマンドによって発行元の URL が出力されます。次のいずれかの手順で発行元の URL が必要になります。

      その他の Kubernetes

      Kubernetes クラスタに接続し、kubectl を使用してクラスタの発行元 URL を確認します。

      kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
      

      次のいずれかの手順で発行元の URL が必要になります。

    2. 省略可: OIDC 発行元が一般公開されていない場合は、クラスタの JSON Web Key Set(JWKS)をダウンロードします。
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json

      OIDC プロバイダが一般公開されているかどうか確認するには、CURL コマンドでプロバイダの URL にアクセスします。200 レスポンスが返されれば、一般公開されています。

    3. Workload Identity プールを新規作成します。
      gcloud iam workload-identity-pools create POOL_ID \
          --location="global" \
          --description="DESCRIPTION" \
          --display-name="DISPLAY_NAME"
      

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

      • POOL_ID: プールの一意の ID。
      • DISPLAY_NAME: (省略可)プールの名前。
      • DESCRIPTION: (省略可)選択したプールの説明。この説明は、プール ID へのアクセス権を付与するときに表示されます。

      例:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. クラスタを Workload Identity プール プロバイダとして追加します。OIDC 発行者が一般公開されているいないかに応じて、プロバイダを作成するコマンドを選択します。

      一般公開されている

      OIDC 発行者が一般公開されている場合は、次のコマンドでプロバイダを作成します。

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
          --location="global" \
          --workload-identity-pool="POOL_ID" \
          --issuer-uri="ISSUER" \
          --attribute-mapping="google.subject=assertion.sub"

      一般公開されていない

      OIDC 発行者が一般公開されていない場合は、次のコマンドでプロバイダを作成します。

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
          --location="global" \
          --workload-identity-pool="POOL_ID" \
          --issuer-uri="ISSUER" \
          --jwks-file="cluster-jwks.json" \
          --attribute-mapping="google.subject=assertion.sub"

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

      • WORKLOAD_PROVIDER_ID: 一意の Workload Identity プール プロバイダ ID。
      • POOL_ID: 前に作成した Workload Identity プール ID。
      • ISSUER: 前に確認した発行元 URL を使用します。

      attribute-mapping="google.subject=assertion.sub" は、Kubernetes サブジェクトを IAM サブジェクトにマッピングします。

認証情報構成ファイルを作成する

Google Cloud リソースにアクセスできる Kubernetes ワークロードをデプロイするには、まず IAM サービス アカウントごとに認証情報構成ファイルを作成する必要があります。

  1. 次のコマンドを使用して、IAM サービス アカウント(Google サービス アカウント)のリストを取得します。
    gcloud iam service-accounts list --project $PROJECT_ID

    次の IAM サービス アカウントの認証情報構成ファイルを作成する必要があります。

    本番環境

    本番環境の場合:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@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
    

    v1.15.1 以降で Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler サービス アカウントの認証情報構成ファイルも作成する必要があります。

    DISPLAY NAME                 EMAIL                                                              DISABLED
    ...
    apigee-mint-task-scheduler   apigee-mint-task-scheduler@my_project_id.iam.gserviceaccount.com   False
    ...

    非本番環境

    非本番環境の場合:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. 前のリストの IAM サービス アカウントごとに認証情報構成ファイルを作成します。

    WIF: シークレット

    このアプローチでは、Kubernetes Secret に保存されている認証情報構成を使用します。ステップ 7: オーバーライドを作成するでオーバーライド ファイルを作成するときに、serviceAccountRef プロパティまたは envs.serviceAccountRefs プロパティを使用して、各サービス アカウントのシークレットの名前を指定します。

    認証情報構成ファイルを作成する

    本番環境

    次のサービス アカウントの認証情報構成ファイルを作成する必要があります。

    • apigee-cassandra
    • apigee-mart
    • apigee-metrics
    • apigee-mint-task-scheduler Apigee ハイブリッドの収益化を使用している場合。
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    1. 認証情報構成ファイルのディレクトリを作成します。ディレクトリには任意の名前を付けることができます。この手順では、ディレクトリの名前は credential-configurations です。
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. apigee-cassandra の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-cassandra-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID
    3. apigee-mart の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mart-credential-configuration.json
      
    4. apigee-metrics の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-metrics-credential-configuration.json
      
    5. apigee-runtime の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-runtime-credential-configuration.json
      
    6. apigee-synchronizer の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-synchronizer-credential-configuration.json
      
    7. apigee-udca の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-udca-credential-configuration.json
      
    8. apigee-watcher の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-watcher-credential-configuration.json
      
    9. Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler の認証情報構成ファイルも作成する必要があります。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mint-task-scheduler-credential-configuration.json
      

    非本番環境

    1. 認証情報構成ファイルのディレクトリを作成します。ディレクトリには任意の名前を付けることができます。この手順では、ディレクトリの名前は credential-configurations です。
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 次のコマンドを使用して、credential-configurations ディレクトリの apigee-non-prod サービス アカウントの認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-non-prod-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID

    Kubernetes Secret を作成する

    各サービス アカウントの認証情報構成ファイルを保存する Kubernetes Secret を作成します。

    次のコードサンプルの kubectl create secret コマンドの構造は次のとおりです。

    kubectl create secret generic SECRET_NAME \
            --from-file="client_secret.json=PATH_TO_CREDENTIAL_CONFIGURATION_FILE" \
            -n APIGEE_NAMESPACE

    本番環境

    1. apigee-cassandra のシークレット ファイルを作成します。
      kubectl create secret generic apigee-cassandra-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-cassandra.json" \
        -n APIGEE_NAMESPACE
      
    2. apigee-mart のシークレット ファイルを作成します。
      kubectl create secret generic apigee-mart-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-mart.json" \
        -n APIGEE_NAMESPACE
      
    3. apigee-metrics のシークレット ファイルを作成します。
      kubectl create secret generic apigee-metrics-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-metrics.json" \
        -n APIGEE_NAMESPACE
      
    4. apigee-runtime のシークレット ファイルを作成します。
      kubectl create secret generic apigee-runtime-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-runtime.json" \
        -n APIGEE_NAMESPACE
    5. apigee-synchronizer のシークレット ファイルを作成します。
      kubectl create secret generic apigee-synchronizer-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-synchronizer.json" \
        -n APIGEE_NAMESPACE
      
    6. apigee-udca のシークレット ファイルを作成します。
      kubectl create secret generic apigee-udca-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-udca.json" \
        -n APIGEE_NAMESPACE
      
    7. apigee-watcher のシークレット ファイルを作成します。
      kubectl create secret generic apigee-watcher-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-watcher.json" \
        -n APIGEE_NAMESPACE
      
    8. Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler のシークレット ファイルを作成します。
      kubectl create secret generic apigee-mint-task-scheduler-svc-account \
        --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-mint-task-scheduler.json" \
        -n APIGEE_NAMESPACE
      
    apigee-non-prod のシークレット ファイルを作成します。

    非本番環境

    kubectl create secret generic apigee-non-prod-svc-account \
            --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/credential-configurations/$PROJECT_ID-apigee-non-prod.json" \
            -n APIGEE_NAMESPACE

    WIF: files

    このアプローチでは、Google サービス アカウント キーファイルの代わりに認証情報の構成ファイルを使用します。ステップ 7: オーバーライドを作成するでオーバーライド ファイルを作成するときに、各 serviceAccountPath プロパティまたは envs.serviceAccountPaths プロパティの認証情報構成ファイルのパスを指定します。

    本番環境

    対応するチャート ディレクトリに認証情報構成ファイルを作成する必要があります。

    サービス アカウント Apigee Helm チャート ディレクトリ
    apigee-cassandra apigee-datastore/
    apigee-mart apigee-org/
    apigee-metrics apigee-telemetry/
    apigee-mint-task-scheduler
    Apigee ハイブリッドの収益化を使用している場合)
    apigee-org/
    apigee-runtime apigee-env/
    apigee-synchronizer apigee-env/
    apigee-udca apigee-org/
    apigee-env/
    apigee-watcher apigee-org/

    次のコマンドを使用して、認証情報構成ファイルを作成します。

    • apigee-cassandra:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-cassandra-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID
    • apigee-mart:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-mart-credential-configuration.json
      
    • apigee-metrics:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-telemetry/apigee-metrics-credential-configuration.json
      
    • apigee-runtime:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-runtime-credential-configuration.json
      
    • apigee-synchronizer:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-synchronizer-credential-configuration.json
      
    • apigee-udca:

      apigee-udca サービス アカウントは、apigee-orgapigee-env の両方のグラフで使用されます。

      1. apigee-org チャート ディレクトリに認証情報構成ファイルを作成します。
        gcloud iam workload-identity-pools create-cred-config \
          projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
          --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
          --credential-source-file=/var/run/service-account/token \
          --credential-source-type=text \
          --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-udca-credential-configuration.json
        
      2. 認証情報構成ファイルを apigee-env グラフ ディレクトリにコピーします。
        cp $APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-udca-credential-configuration.json \
          $APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-udca-credential-configuration.json
        
    • apigee-watcher:
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-watcher-credential-configuration.json
      
    • href="monetization-for-hybrid">Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler の認証情報構成ファイルも作成する必要があります。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-mint-task-scheduler-credential-configuration.json
      

    非本番環境

    認証情報構成ファイルを作成して、対応するチャート ディレクトリにコピーする必要があります。

    サービス アカウント Apigee Helm チャート
    apigee-non-prod apigee-datastore/
    apigee-telemetry/
    apigee-org/
    apigee-env/
    1. 次のコマンドを使用して、apigee-datastore チャート ディレクトリに認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
      --credential-source-file=/var/run/service-account/token \
      --credential-source-type=text \
      --output-file=$APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID
    2. 認証情報構成ファイルを apigee-envapigee-org/apigee-telemetry/ のチャート ディレクトリにコピーします。
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-env/apigee-non-prod-credential-configuration.json
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-org/apigee-non-prod-credential-configuration.json
      cp $APIGEE_HELM_CHARTS_HOME/apigee-datastore/apigee-non-prod-credential-configuration.json \
        $APIGEE_HELM_CHARTS_HOME/apigee-telemetry/apigee-non-prod-credential-configuration.json
      

    WIF: Vault

    このアプローチでは、外部シークレット マネージャーである Hashicorp Vault に保存されている認証情報の構成を使用します。ステップ 7: オーバーライドを作成するでオーバーライド ファイルをビルドするときに、serviceAccountSecretProviderClass プロパティまたは envs.serviceAccountSecretProviderClass プロパティを使用して、組織レベルと環境レベルの Vault シークレットを指定します。

    認証情報構成ファイルを作成する

    本番環境

    次のサービス アカウントの認証情報構成ファイルを作成する必要があります。

    • apigee-cassandra
    • apigee-mart
    • apigee-metrics
    • apigee-mint-task-schedulerApigee ハイブリッドの収益化を使用している場合)
    • apigee-runtime
    • apigee-synchronizer
    • apigee-udca
    1. 認証情報構成ファイルのディレクトリを作成します。ディレクトリには任意の名前を付けることができます。この手順では、ディレクトリの名前は credential-configurations です。
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. apigee-cassandra の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-cassandra@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-cassandra-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID
    3. apigee-mart の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mart@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mart-credential-configuration.json
      
    4. apigee-metrics の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-metrics@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-metrics-credential-configuration.json
      
    5. apigee-runtime の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-runtime@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-runtime-credential-configuration.json
      
    6. apigee-synchronizer の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-synchronizer@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-synchronizer-credential-configuration.json
      
    7. apigee-udca の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-udca@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-udca-credential-configuration.json
      
    8. apigee-watcher の認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-watcher@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-watcher-credential-configuration.json
      
    9. Apigee ハイブリッドの収益化を使用している場合は、apigee-mint-task-scheduler の認証情報構成ファイルも作成する必要があります。
      gcloud iam workload-identity-pools create-cred-config \
        projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-mint-task-scheduler@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-mint-task-scheduler-credential-configuration.json
      

    非本番環境

    1. 認証情報構成ファイルのディレクトリを作成します。ディレクトリには任意の名前を付けることができます。この手順では、ディレクトリの名前は credential-configurations です。
      mkdir $APIGEE_HELM_CHARTS_HOME/credential-configurations
    2. 次のコマンドを使用して、credential-configurations ディレクトリの apigee-non-prod サービス アカウントの認証情報構成ファイルを作成します。
      gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
        --service-account=apigee-non-prod@$PROJECT_ID.iam.gserviceaccount.com \
        --credential-source-file=/var/run/service-account/token \
        --credential-source-type=text \
        --output-file=$APIGEE_HELM_CHARTS_HOME/credential-configurations/apigee-non-prod-credential-configuration.json
      

      ここで

      • PROJECT_NUMBER: Workload Identity プールを含むプロジェクトのプロジェクト番号。これはプロジェクト ID ではなく、プロジェクト番号にする必要があります。
      • POOL_ID: Workload Identity プールの ID
      • WORKLOAD_PROVIDER_ID: Workload Identity プール プロバイダの ID

    CSI ドライバと Vault プロバイダをインストールする

    Helm を使用してクラスタに CSI ドライバをまだインストールしていない場合は、Secrets Store CSI ドライバ: インストールの手順に沿って対応します。詳細については、Vault ドキュメントの Vault CSI プロバイダのインストールをご覧ください。

    Apigee ハイブリッドでサポートされている CSI ドライバの最小バージョンについては、Apigee ハイブリッドでサポートされているプラットフォームとバージョンをご覧ください。

    Vault の Secret、ポリシー、ロールを作成する

    Vault UI または API を使用して Secret を作成し、Apigee ハイブリッドで使用される Kubernetes サービス アカウントに、それらの Secret を読み取る権限を付与します。

    1. 組織と環境固有の Secret を次の形式で作成します。
      秘密鍵Secret データ
      secret/data/apigee/orgsakeys
      {
        "cassandraBackup": "***",
        "cassandraRestore": "***",
        "connectAgent": "***",
        "logger": "***",
        "mart": "***",
        "metrics": "***",
        "mint": "***",
        "udca": "***",
        "watcher": "***"
      }
      secret/data/apigee/envsakeys-ENV_NAME
      {
        "runtime": "***",
        "synchronizer": "***",
        "udca": "***".
          }

      本番環境

      各ペアの "***" を、apigee コンポーネントに対応する Google サービス アカウントの認証情報構成ファイルの内容に置き換えます。apigee-cassandra-backupapigee-cassandra-restore はどちらも apigee-cassandra サービス アカウントを使用します。次に例を示します。

      {
        "cassandraBackup": "{
          "universe_domain": "googleapis.com",
          "type": "external_account:,"
          "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
          "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "service
          "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-cassandra@my-project.iam.gserviceaccount.com:generateAccessToken",
          "credential_source": {
            "file": "/var/run/service-account/token",
            "format": {
              "type": "text"
            }
          }
        }",
        "cassandraRestore":...
      ...
      }

      非本番環境

      各ペアの "***" を、apigee-non-prod サービス アカウントの認証情報構成ファイルの内容に置き換えます。apigee-cassandra-backupapigee-cassandra-restore はどちらも apigee-cassandra サービス アカウントを使用します。次に例を示します。

      {
        "cassandraBackup": "{
          "universe_domain": "googleapis.com",
          "type": "external_account:,"
          "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
          "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "service
          "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-non-prod@my-project.iam.gserviceaccount.com:generateAccessToken",
          "credential_source": {
            "file": "/var/run/service-account/token",
            "format": {
              "type": "text"
            }
          }
        }",
        "cassandraRestore":...
      ...
      }
    2. 組織の Secret にアクセス権を付与します。次の内容を含むテキスト ファイルを、orgsakeys-auth-policy.txt という名前で作成します。
      path "secret/data/apigee/orgsakeys" {
        capabilities = ["read"]
      }
    3. Vault 内で、組織の Secret へのアクセス権を付与するポリシーを作成します。
      vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
    4. 環境ごとに、次の内容を含むテキスト ファイルを envsakeys-ENV_NAME-auth-policy.txt という名前で作成します。
      path "secret/data/apigee/envsakeys-ENV_NAME" {
        capabilities = ["read"]
      }

      この手順を環境ごとに繰り返します。

    5. Vault 内で、環境の Secret へのアクセス権を付与するポリシーを作成します。
      vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

      この手順を環境ごとに繰り返します。

    6. 次の内容のスクリプトを generate-encoded-sas.sh という名前で作成します。
      # generate-encoded-sas.sh
      
      ORG=$APIGEE_ORG            # Apigee organization name
      ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
      
      ORG_SHORT_NAME=$(echo $ORG | head -c 15)
      ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
      ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
      NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
      
      for ENV in ${ENVS//,/ }
        do
          ENV_SHORT_NAME=$(echo $ENV | head -c 15)
          ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
          ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
          NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
        done
      
      echo $NAMES
      
    7. スクリプトを実行して、ポリシーをバインドするサービス アカウント名のリストを生成します。
      ./generate-encoded-sas.sh

      出力は、次の例のように、カンマで区切られた Kubernetes サービス アカウント名のリストになります。

      ./generate-encoded-sas.sh
      apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
      apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
      rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
      assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
      44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
      agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
      -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
      en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
      try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
      bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
      igee-runtime-myhybridorg-prod-2d0221c
    8. 出力テキストをコピーして複数のリストに分割します。一つのリストは org サービス アカウント名用で、別のリストは各環境の env サービス アカウント名用です。org サービス アカウントは、apigee-logger-apigee-telemetry までの出力リストの先頭にあります。

      前述の例の org サービス名のリスト:

      apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
      apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
      rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
      assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
      44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
      agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
      -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
      en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
      try

      env サービス アカウント名にはパターン apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXTapigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT があります。これらを環境ごとに別個のリストに分割します。たとえば、前述の例の出力は次の 2 つのリストに分割できます。

      dev 環境:

      apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
      org-dev-ee52aca

      prod 環境:

      apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
      dorg-prod-2d0221c
    9. ポリシーを使用して、組織固有の Apigee サービス アカウントをバインドする Vault ロールを作成します。
      vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
          
    10. 環境ごとに、サービス アカウント キーの Vault ロールを作成します。
      vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
      

      すべての環境について、この手順を繰り返します。

    SecretProviderClass オブジェクトの作成

    SecretProviderClass リソースは、Secret をリクエストするときに通信するプロバイダを CSI ドライバに伝えます。サービス アカウント キーは、このオブジェクトを介して構成する必要があります。次の表に、Apigee Hybrid で想定されるファイル名(objectNames)を示します。

    サービス アカウント想定される Secret ファイル名
    Cassandra バックアップ cassandraBackup
    Cassandra の復元 cassandraRestore
    Connect Agent connectAgent
    MART mart
    指標 metrics
    収益化
    Apigee ハイブリッドの収益化を使用している場合)
    mint
    ランタイム runtime
    Synchronizer synchronizer
    UDCA udca
    Watcher watcher
    1. 次の SecretProviderClass テンプレートを使用して、組織固有の Secret 用にこのリソースを構成します。
      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: apigee-orgsakeys-spc
      spec:
        provider: vault
        parameters:
          roleName: apigee-orgsakeys
          vaultAddress: VAULT_ADDRESS
          # "objectName" is an alias used within the SecretProviderClass to reference
          # that specific secret. This will also be the filename containing the secret.
          # Apigee Hybrid expects these exact values so they must not be changed.
          # "secretPath" is the path in Vault where the secret should be retrieved.
          # "secretKey" is the key within the Vault secret response to extract a value from.
            objects: |
            - objectName: "cassandraBackup"
              secretPath: ""
              secretKey: ""
            - objectName: "cassandraRestore"
              secretPath: ""
              secretKey: ""
            - objectName: "connectAgent"
              secretPath: ""
              secretKey: ""
            - objectName: "logger"
              secretPath: ""
              secretKey: ""
            - objectName: "mart"
              secretPath: ""
              secretKey: ""
            - objectName: "metrics"
              secretPath: ""
              secretKey: ""
            - objectName: "mint"
              secretPath: ""
              secretKey: ""
            - objectName: "udca"
              secretPath: ""
              secretKey: ""
            - objectName: "watcher"
              secretPath: ""
              secretKey: ""
      

      VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタで実行されている場合、一般的な形式は http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

      テンプレートを spc-org.yaml という名前のファイルに保存します。

    2. 組織固有の SecretProviderClass を apigee Namespace に適用します。
      kubectl -n $APIGEE_NAMESPACE apply -f spc-org.yaml
    3. 環境ごとに、次の SecretProviderClass テンプレートを使用して、環境固有の Secret 用にこのリソースを構成します。すべての環境について、この手順を繰り返します。
      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: apigee-envsakeys-ENV_NAME-spc
      spec:
        provider: vault
        parameters:
          roleName: apigee-envsakeys-ENV_NAME
          vaultAddress: VAULT_ADDRESS
          # "objectName" is an alias used within the SecretProviderClass to reference
          # that specific secret. This will also be the filename containing the secret.
          # Apigee Hybrid expects these exact values so they must not be changed.
          # "secretPath" is the path in Vault where the secret should be retrieved.
          # "secretKey" is the key within the Vault secret response to extract a value from.
          objects: |
            - objectName: "runtime"
              secretPath: ""
              secretKey: ""
            - objectName: "synchronizer"
              secretPath: ""
              secretKey: ""
            - objectName: "udca"
              secretPath: ""
              secretKey: ""
          

      VAULT_ADDRESS は、Vault サーバーが実行されているエンドポイントです。Vault が Apigee と同じクラスタと名前空間で実行されている場合、一般的な形式は http://vault.$APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT です。

      テンプレートを spc-env-ENV_NAME.yaml という名前のファイルに保存します。

    4. 環境ごとに、環境固有の SecretProviderClass を apigee Namespace に適用します。
      kubectl -n $APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml

      すべての環境について、この手順を繰り返します。

次のステップ

1 2 3 4 5 (次へ)ステップ 6: TLS 証明書を作成する 7 8 9 10 11