IRSAからEKS Pod Identityへの移行:OIDCなしでAWS Load Balancer Controllerをインストールする
背景
AWS EKSのPodがAWSリソースにアクセスする認可方式は主に3つあります。
- ノードIAMロールの継承(全Pod共通、セキュリティリスク大)
- IRSA + OIDC(標準的だがガバナンス要件が重い)
- EKS Pod Identity Agent(推奨される代替手段)
当プロジェクトではAWS Load Balancer Controller(LBC)の導入時にブロックが発生しました。AWS公式ドキュメントはEKS OIDCの利用を前提としていますが、社内セキュリティポリシーによる厳格な制限のため、OIDCの承認に1ヶ月以上を要しています。この停滞を解消するため、EKS Pod Identity Agent を採用しました。
Pod Identityはノードロール継承よりも安全であり、かつOIDCプロバイダーを必要としないため、運用負荷も軽減されます。本記事ではManifest方式を用い、OIDCに依存しないLBCの導入手順を解説します。
注意: HelmチャートはOIDC固有の設定と強く結合している場合があるため、本構成では制御性の高いManifest方式を推奨します。
前提条件
- 既存のEKSクラスター
-
kubectlがクラスターに接続済みであること - IAMロール作成およびEKS Pod Identity関連付けの権限
実装手順
1. EKS Pod Identity Agentアドオンのインストール
LBCの設定前に、Pod Identity Agentをクラスターに導入します。
aws eks create-addon \
--cluster-name <your-cluster-name> \
--addon-name eks-pod-identity-agent \
--region <your-region>
Podが正常に起動していることを確認します。
kubectl get pods -n kube-system | grep pod-identity
2. LBC用IAMロールの作成(信頼ポリシーの変更)
IRSAとは異なり、Pod IdentityではOIDCの信頼関係を使用しません。LBC用のIAMロールを作成し、信頼ポリシーを以下に置き換えてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
また、通常のドキュメントに従い、必要なLBC権限ポリシー(AWSLoadBalancerControllerIAMPolicy)をアタッチしてください。
3. LBCマニフェストの編集と適用
公式ドキュメント「Install AWS Load Balancer Controller (Manifest)」の手順に従いますが、以下の重要な変更を加えます。
Step 3: Install AWS Load Balancer Controller の "Make the following edits to the file" セクションにおいて:
手順 (d) Required only for Fargate or Restricted IMDS を必ず適用してください。
Fargate未使用の場合でも、Pod Identity利用時はこの設定が必要です。これにより、コントローラーがノードメタデータサービスではなくPod Identityエンドポイント経由で認証情報を取得できます。
編集後、マニフェストを適用します。
kubectl apply -f v2_8_2_full.yaml
4. Pod Identity Associationの作成
この手順がIRSAにおけるService Accountアノテーションの代わりとなります。AWSマネジメントコンソールで以下を実行します。
1.EKSクラスター → Access タブ → Pod Identity associations に移動
2.Create association をクリック
3.以下のマッピングを設定:
- Namespace: kube-system
- Service account: aws-load-balancer-controller
- IAM role: 手順2で作成したロールのARN
4.その他のオプションはデフォルトのまま作成
CLIでの実行例:
aws eks create-pod-identity-association \
--cluster-name <your-cluster-name> \
--namespace kube-system \
--service-account aws-load-balancer-controller \
--role-arn arn:aws:iam::<account-id>:role/<lbc-role-name>
5. 動作確認とトラブルシューティング
LBCデプロイメントの状態を確認します。
kubectl get deployment -n kube-system aws-load-balancer-controller
⚠️ 重要: Association作成直後にPodが Pending や CrashLoopBackOff になる、またはロールを引き受けられない場合は、Podを削除して再作成してください。認証情報の注入はPod起動時に行われるため、既存のPodは新しいAssociationを自動的には反映しません。
kubectl delete pods -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller
参考リンク
EKS Pod Identities Overview
Install LBC via Manifest
IRSA Documentation(比較用)