Workload Identityを用いてEKSクラスタからGoogle Cloudへアクセスする

2022年6月24日掲載

キービジュアル

こんにちは!クラウドエンジニアリング本部の三改木 裕矢(@_uya116)です。

先日、Workload Identityを用いてAKSクラスタからGoogle Cloudへアクセスするという記事で、AKS (Azure Kubernetes Service) クラスタ内の Pod から Google Cloud (旧GCP) へのアクセスを行うための設定について紹介しました。

今回は、業務で Google Workload Identity 連携を用いて Amazon EKS (Elastic Kubernetes Service) クラスタ内の Pod から Google Cloud へのアクセスを検証しました。こちらも AKS 同様にハマりどころが多く苦戦したので、その設定方法についてこの記事にまとめておきます。

目次

  • 本記事では Amazon EKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) へアクセスする方法を説明します。
  • Google Workload Identity 連携の前提知識があると読みやすい内容になっています。

Amazon EKS Pod から Google Cloud へのアクセスフロー

Amazon EKS クラスタ内の Pod から Google Cloud API へのアクセスは以下の 2 つのパターンがあります。

  1. EKS の ノードロールを使用する方法
  2. EKS の OIDC プロバイダを用いて特定の IAM ロールを使用する方法

今回は 2 つ目の EKS の OIDC プロバイダを用いて特定の IAM ロールを使用する方法をメインに紹介します。

なお、1 つ目の EKS クラスタのノードに割り当てるロールを用いて Google Cloud にアクセスする設定については、Workload Identity 連携の構成に従い、Google Cloud コンソールから AWS 専用の Workload Identity プロバイダを設定するのみで実現できるのでぜひお試しください。

2 つ目の EKS の OIDC プロバイダを用いて特定の IAM ロールを使用する方法について、アクセスフローは以下のようになります。

  1. EKS Pod → EKS の OIDC プロバイダへアクセスし指定した IAM ロールの権限が反映されたトークンを取得する(IRSA: IAM Roles for Service Accounts)
  2. EKS の OIDC プロバイダから取得したトークンを用いて Google Cloud の Workload Identity プールにアクセスしトークンを交換する
  3. 上記で取得したトークンを用いて Google Cloud API へアクセスする

実現方法

さて、それでは AWS、Google Cloud それぞれの設定方法を説明していきます。
前節で述べた 3 段階のアクセスフローは、Workload Identity プロバイダ用に生成した認証情報の構成ファイルを用いた以下の設定で実現することが可能です。

AWS 側

  1. IRSAの設定を行う
  2. 構成ファイルを準備する
  3. 構成ファイルのパスを Amazon EKS Pod に設定する

Google Cloud 側

  1. Workload Identity プールおよびプロバイダを作成する
  2. Service Account の権限を設定する

それでは順に上記の設定について詳細を説明していきます。

[AWS] IRSA の設定を行う

まず、AWS 側では EKS クラスタの サービスアカウントへ IAM ロール権限の付与を行う IRSA の設定を行います。基本的には AWS ドキュメント の通りですが、以下の 3 手順で IRSA を設定します。

  1. クラスタの IAM OIDC プロバイダーを作成する
  2. IAM ロールを作成して Kubernetes サービスアカウントに必要な IAM ポリシーをアタッチする
  3. IAM ロールを Kubernetes サービスアカウントに関連付ける

IRAS が正常に設定できているか確認したい場合は、IAM ロール権限を付与したサービスアカウントを Pod に付与し、その Pod から AWS CLI を実行することで確認できます。以下の例では S3 のバケットリストを出力するコマンドを実行しています。権限が正常に付与できていれば S3 バケットの一覧が表示されます。

aws s3 ls
aws s3 ls

[AWS] 構成ファイルを準備する

次に Workload Identity プロバイダ用に認証情報の構成ファイルを作成します。

以下が構成ファイルの例となります。

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/projects/{gc project number}/locations/global/workloadIdentityPools/aws-test/providers/test-oidc",
  "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
  "token_url": "https://sts.googleapis.com/v1/token",
  "credential_source": {
    "file": "/var/run/secrets/eks.amazonaws.com/serviceaccount/token",
    "format": {
      "type": "text"
    }
  },
  "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{gc service account name}@{gc project id}.iam.gserviceaccount.com:generateAccessToken"
}

構成ファイルの雛形は Google Cloud コンソール の Workload Identity ページもしくは、gcloud iam workload-identity-pools create-cred-config コマンドで取得できます。

IRSA を適用することで EKS クラスタ内の Pod の以下パスに IAM ロール権限を反映したトークンが格納されます。

/var/run/secrets/eks.amazonaws.com/serviceaccount/token

本構成ファイルではそのトークンを Workload Identity プロバイダへトークン交換に使用し、IRSA で付与された IAM ロールを用いて Google Cloud へアクセスします。

なお、作成した構成ファイルは EKS クラスタ上に格納し、Pod からアクセスできるようにしておく必要があります。我々のチームでは Kubernetes の Secret を用いています。

[AWS] 構成ファイルのパスを Amazon EKS Pod に設定する

まず、EKS クラスタ上に準備した構成ファイルを Google Cloud API を使用する Pod にマウントします。その後、マウントした構成ファイルのパスを Pod の GOOGLE_APPLICATION_CREDENTIALS 変数に設定します。これにより Pod から Google Cloud API にアクセスする際に、自動的に指定された構成ファイルの情報に従ってトークンを取得することができます。

[Google Cloud] Workload Identity プールおよびプロバイダを作成する

さて、続いては Google Cloud 側の設定です。

まず、Google Cloud のドキュメントに従って Workload Identity プールおよびプロバイダを作成します。

workload identity

発行元には AWS の IRSA 設定で作成した OIDC プロバイダの URL を設定します。オーディエンスは sts.amazonaws.com です。

また我々のチームでは属性のマッピングにて EKS Pod で使用している Kubernetes Service Account の値をマップすることで Pod が使用する Kubernetes Service Account に応じた権限制限を可能にしています。

[Google Cloud] Service Account の設定

次は Workload Identity と連携する Google Service Account の設定です。

こちらもGoogle Cloud のドキュメントに従って 連携用の Google Service Account に Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を付与します。

service account

上記画像の設定では Workload Identity プロバイダで設定した  Kubernetes Service Account のマッピングを用いて特定の Kubernetes Service Account からのアクセスの場合のみ、連携する Google Service Account の権限を借用できるようにしています。

実際に試してみる

以上の設定により Amazon EKS 内の Pod から Google Cloud API へのアクセスが可能になります。

今回は試しに以下のサンプルコードを Amazon EKS の Pod から実行し、特定の Google Cloud Storage 内のファイルリストを取得してみました。

from google.cloud import storage

storage_client = storage.Client()
for blob in storage_client.list_blobs('your-gcs-name'):
    print(blob.name)
terminal

このようにファイルリストが取得できたのでアクセス成功です。(毎回ぼかしが多くてすみませんmm)

まとめ

本記事では Amazon EKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) API へアクセスする方法を説明しました。

再掲すると、以下の設定を行うことで Amazon EKS Pod から Google Cloud API へのアクセスが可能になります。

AWS 側

  1. IRSAの設定を行う
  2. 構成ファイルを準備する
  3. 構成ファイルのパスを Amazon EKS Pod に設定する

Google Cloud 側

  1. Workload Identity プールおよびプロバイダを作成する
  2. Service Account の権限を設定する

この記事が理解の一助になれば幸いです。

関連サービス

クラウドネイティブ・アプリケーションプラットフォーム(CNAP)

クラウドネイティブ・アプリケーションプラットフォーム(CNAP)とは標準化されたアプリケーション実行環境を手軽に利用できるサービスです。リリースプロセスを自動化し、開発者自身がセルフサービスで実行環境を準備できるようになります。

おすすめの記事

条件に該当するページがございません