概要
以前、IAM ロールを Kubenetes サービスアカウントに紐付ける方法について紹介しました。
先日のこの紐付けについて容易になったということについてアップデートがありましたので紹介します。
- IAM ロールを Kubenetes サービスアカウントに紐付けることがより容易になった。
- EKS クラスターに EKS Pod identity Agent add-on をインストールすることで設定可能。
- ロールセッションタグをサポート
※ 2023/12/11 現在 Fargate に未対応
その他参考
やってみる
ステップ 1
アプリケーションに必要な許可を持つ IAM ロールを作成し、その信頼ポリシーでサービスプリンシパルとして pods.eks.amazonaws.com を指定する
eks-pod-identity-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::XXX"
}
]
}
eks-pod-identity-role.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": [
"sts:AssumeRole",
"sts:TagSession"
]
}
]
}
ステップ 2
EKS コンソールまたは AWS CLI を使用して EKS Pod identity エージェントアドオンをインストールする
aws eks create-addon \
--cluster-name cluster-test \
--addon-name eks-pod-identity-agent \
--addon-version v1.0.0-eksbuild.1
EKS Pod identity エージェントアドオンがインストールされたことを確認する
kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
eks-pod-identity-agent-mn9z8 1/1 Running 0 57s
ステップ 3
EKS コンソール、API、または CLI でロールをサービスアカウントに直接マッピングする
サービスアカウントを作成
service-account-test.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: service-account-test
namespace: default
kubectl apply -f service-account-test.yaml
サービスアカウントが作成されたことを確認
kubectl get sa
NAME SECRETS AGE
service-account-test 0 13s
ロールをサービスアカウントに紐付け
aws eks create-pod-identity-association \
--cluster-name cluster-test \
--namespace default \
--role-arn arn:aws:iam::123456789012:role/eks-pod-Identity-role \
--service-account service-account-test
サービスアカウントを使用するよう設定する
deployment-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-test
spec:
selector:
matchLabels:
app: app-test
template:
metadata:
labels:
app: app-test
spec:
serviceAccountName: service-account-test
containers:
- name: app-test
image: public.ecr.aws/nginx/nginx:mainline-alpine
kubectl apply -f deployment-test.yaml
Pod にサービス アカウント トークン ファイル マウントがあることを確認
kubectl describe pod app-test-749c55fbb4-pwzc4 | grep
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE:
AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE: /var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token