Amazon EKS on IAM ロールを Kubenetes サービスアカウントに容易に紐付ける（Amazon EKS Pod Identity エージェントアドオン）

# 概要

以前、IAM ロールを Kubenetes サービスアカウントに紐付ける方法について紹介しました。

https://qiita.com/leomaro7/items/416f6dee4ab3b0b31550

先日のこの紐付けについて容易になったということについてアップデートがありましたので紹介します。

- IAM ロールを Kubenetes サービスアカウントに紐付けることがより容易になった。
- EKS クラスターに EKS Pod identity Agent add-on をインストールすることで設定可能。
- ロールセッションタグをサポート

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/amazon-eks-pod-identity/

※ 2023/12/11 現在 Fargate に未対応


# その他参考

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/pod-identities.html

https://aws.amazon.com/jp/blogs/news/amazon-eks-pod-identity-simplifies-iam-permissions-for-applications-on-amazon-eks-clusters/

https://dev.classmethod.jp/articles/eks-pod-identity-terraform-blue-green-upgrade/


# やってみる

## ステップ 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::１２３４５６７８９０１２: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
```