フォーム読み込み中
こんにちは!クラウドエンジニアリング本部の三改木 裕矢(@_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 API へのアクセスは以下の 2 つのパターンがあります。
今回は 2 つ目の EKS の OIDC プロバイダを用いて特定の IAM ロールを使用する方法をメインに紹介します。
なお、1 つ目の EKS クラスタのノードに割り当てるロールを用いて Google Cloud にアクセスする設定については、Workload Identity 連携の構成に従い、Google Cloud コンソールから AWS 専用の Workload Identity プロバイダを設定するのみで実現できるのでぜひお試しください。
2 つ目の EKS の OIDC プロバイダを用いて特定の IAM ロールを使用する方法について、アクセスフローは以下のようになります。
さて、それでは AWS、Google Cloud それぞれの設定方法を説明していきます。
前節で述べた 3 段階のアクセスフローは、Workload Identity プロバイダ用に生成した認証情報の構成ファイルを用いた以下の設定で実現することが可能です。
AWS 側
Google Cloud 側
それでは順に上記の設定について詳細を説明していきます。
まず、AWS 側では EKS クラスタの サービスアカウントへ IAM ロール権限の付与を行う IRSA の設定を行います。基本的には AWS ドキュメント の通りですが、以下の 3 手順で IRSA を設定します。
IRAS が正常に設定できているか確認したい場合は、IAM ロール権限を付与したサービスアカウントを Pod に付与し、その Pod から AWS CLI を実行することで確認できます。以下の例では S3 のバケットリストを出力するコマンドを実行しています。権限が正常に付与できていれば S3 バケットの一覧が表示されます。
aws s3 ls
次に 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 を用いています。
まず、EKS クラスタ上に準備した構成ファイルを Google Cloud API を使用する Pod にマウントします。その後、マウントした構成ファイルのパスを Pod の GOOGLE_APPLICATION_CREDENTIALS 変数に設定します。これにより Pod から Google Cloud API にアクセスする際に、自動的に指定された構成ファイルの情報に従ってトークンを取得することができます。
さて、続いては Google Cloud 側の設定です。
まず、Google Cloud のドキュメントに従って Workload Identity プールおよびプロバイダを作成します。
発行元には AWS の IRSA 設定で作成した OIDC プロバイダの URL を設定します。オーディエンスは sts.amazonaws.com です。
また我々のチームでは属性のマッピングにて EKS Pod で使用している Kubernetes Service Account の値をマップすることで Pod が使用する Kubernetes Service Account に応じた権限制限を可能にしています。
次は Workload Identity と連携する Google Service Account の設定です。
こちらもGoogle Cloud のドキュメントに従って 連携用の Google Service Account に Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を付与します。
上記画像の設定では 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)
このようにファイルリストが取得できたのでアクセス成功です。(毎回ぼかしが多くてすみませんmm)
本記事では Amazon EKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) API へアクセスする方法を説明しました。
再掲すると、以下の設定を行うことで Amazon EKS Pod から Google Cloud API へのアクセスが可能になります。
AWS 側
Google Cloud 側
この記事が理解の一助になれば幸いです。
クラウドネイティブ・アプリケーションプラットフォーム(CNAP)とは標準化されたアプリケーション実行環境を手軽に利用できるサービスです。リリースプロセスを自動化し、開発者自身がセルフサービスで実行環境を準備できるようになります。
条件に該当するページがございません