Google Cloud で Workload Identity を使用する

Workload Identity を使用すると、クラスタ内のアプリケーションごとにきめ細かい ID と認可を割り当てることができます。Workload Identity は、GKE on AWS 内で実行されているアプリケーションで Google Cloud サービスにアクセスする場合に推奨される方法です。詳細については、Workload Identity をご覧ください。

このトピックでは、Workload Identity を使用してワークロードから Google Cloud サービスに接続する方法について説明します。

Google Cloud サービス アカウントを構成する

このセクションでは、Google Cloud サービスにアクセスするための制限付きの権限を持つ Google Cloud サービス アカウント(GSA)を作成します。

Workload Identity プールとプロバイダを取得する

Workload Identity を構成するには、クラスタの ID プロバイダ URI と Workload Identity プールの値が必要です。

  1. クラスタの Workload Identity プールを確認します。

    すべての GKE クラスタでは、Workload Identity プール PROJECT_ID.svc.id.goog に ID プロバイダが作成されます。クラスタの ID プール名を取得するには、Google Cloud CLI を使用します。

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.workloadPool)'
    

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

    • CLUSTER_NAME: 使用するクラスタの名前。
    • GOOGLE_CLOUD_LOCATION: クラスタを管理する Google Cloud ロケーションの名前。

    出力には、クラスタの ID プールの名前があります。この値を保存してください。後で必要になります。

  2. クラスタの ID プロバイダを確認します。

    クラスタの ID プロバイダ名を確認するには、Google Cloud CLI を使用します。

    gcloud container aws clusters describe CLUSTER_NAME \
        --location=GOOGLE_CLOUD_LOCATION \
        --format='value(workloadIdentityConfig.identityProvider)'
    

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

    • CLUSTER_NAME
    • GOOGLE_CLOUD_LOCATION

    出力には、クラスタの ID プロバイダの名前があります。この値を保存してください。後で必要になります。

Google Cloud サービス アカウントを作成する

Google Cloud サービス アカウント(GSA)を作成して権限を付与し、GSA に IAM ポリシー バインディングを追加するには、次の操作を行います。

  1. Google Cloud CLI を使用して GSA を作成します。

    gcloud iam service-accounts create GSA_NAME --project=PROJECT_ID
    

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

    • GSA_NAME: アプリケーションの GSA の名前。
    • PROJECT_ID: GSA の Google Cloud プロジェクト。
  2. GSA でサービスにアクセスできるように IAM バインディングを追加します。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role IAM_ROLE
    

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

    • GSA_NAME: アプリケーションの GSA の名前
    • PROJECT_ID: GSA のプロジェクト ID
    • IAM_ROLE: GSA に付与する IAM ロール

    この例では、ロール roles/compute.viewer を使用します。これにより、コンピューティング サービスへの読み取り専用アクセスが可能になります。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    
  3. GSA が権限を借用できるように、Kubernetes サービス アカウント(KSA)の権限を付与します。これを行うには、roles/iam.workloadIdentityUser ロールを持つ IAM ポリシー バインディングを追加します。

    gcloud iam service-accounts add-iam-policy-binding GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        --role roles/iam.workloadIdentityUser
    

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

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE: アプリケーションの Kubernetes Namespace。
    • KSA_NAME: アプリケーションに使用する KSA

サンプル アプリケーションをデプロイする

このセクションでは、Compute Engine API にアクセスするサンプル アプリケーションをデプロイします。このサンプルを使用するには、サービス アカウントに roles/compute.viewer IAM ロールを付与する必要があります。サンプル アプリケーションにデプロイするには:

  1. 次のマニフェストを workload-identity-sample.yaml という名前のファイルにコピーします。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: KSA_NAME
      namespace: NAMESPACE
    automountServiceAccountToken: false
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cloud-sdk-config
      namespace: NAMESPACE
    data:
      config: |
        {
          "type": "external_account",
          "audience": "identitynamespace:PROJECT_ID.svc.id.goog:IDENTITY_PROVIDER",
          "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/GSA_NAME@PROJECT_ID.iam.gserviceaccount.com:generateAccessToken",
          "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
          "token_url": "https://sts.googleapis.com/v1/token",
          "credential_source": {
            "file": "/var/run/secrets/tokens/gcp-ksa/token"
          }
        }
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: cloud-sdk-example
      namespace: NAMESPACE
    spec:
      serviceAccount: KSA_NAME
      containers:
      - name: cloud-sdk
        image: gcr.io/google.com/cloudsdktool/cloud-sdk:latest
        command:
        - /bin/bash
        - -c
        - 'set -eu -o pipefail; while true; do gcloud compute zones list --filter="name ~ us-central1-*"; sleep 5; done'
        env:
        - name: CLOUDSDK_AUTH_CREDENTIAL_FILE_OVERRIDE
          value: /var/run/secrets/tokens/gcp-ksa/google-application-credentials.json
        - name: CLOUDSDK_CORE_PROJECT
          value: PROJECT_ID
        volumeMounts:
        - name: gcp-ksa
          mountPath: /var/run/secrets/tokens/gcp-ksa
          readOnly: true
      volumes:
      - name: gcp-ksa
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: PROJECT_ID.svc.id.goog
              expirationSeconds: 86400
              path: token
          - configMap:
              name: cloud-sdk-config
              optional: false
              items:
              - key: config
                path: google-application-credentials.json
    

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

    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
    • GSA_NAME
    • IDENTITY_PROVIDER: クラスタの ID プロバイダの名前。
  2. マニフェストをクラスタに適用します。

    kubectl apply -f workload-identity-sample.yaml
    
  3. Pod のログで、サンプル アプリケーションが動作していることを確認します。

    kubectl logs -f cloud-sdk-example -n NAMESPACE
    

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

    • NAMESPACE

    Pod が Google Cloud Compute API へのアクセスに成功すると、出力は次のようになります。

    NAME           REGION       STATUS  NEXT_MAINTENANCE  TURNDOWN_DATE
    us-central1-c  us-central1  UP
    us-central1-a  us-central1  UP
    us-central1-f  us-central1  UP
    us-central1-b  us-central1  UP
    

クリーンアップ

  1. サンプル アプリケーションを削除します。

    kubectl delete -f manifest.yaml
    
  2. Google Cloud サービス アカウントから IAM ポリシー バインディングを削除します。

    gcloud iam service-accounts remove-iam-policy-binding \
        GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE//KSA_NAME] \
        roles/iam.workloadIdentityUser
    

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

    • GSA_NAME
    • PROJECT_ID
    • NAMESPACE
    • KSA_NAME
  3. プロジェクトから IAM ポリシー バインディングを削除します。

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/compute.viewer
    

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

    • GSA_NAME
    • PROJECT_ID
  4. Google Cloud サービス アカウントを削除します。

    gcloud iam service-accounts delete \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
    

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

    • GSA_NAME
    • PROJECT_ID

次のステップ