EKS Auto mode環境でEKS Pod Identityを使ってKinesisにアクセスしてみた

## ブログ記事: EKS Pod IdentityでKinesisにアクセスする方法

### はじめに
Amazon EKS（Elastic Kubernetes Service）でPod Identityを使用すると、KubernetesポッドからAWSサービスに簡単にアクセスできます。この記事では、EKS Pod Identityを使ってKinesisにアクセスする方法を、実際の成功事例を基に詳細に説明します。初心者でも理解できるように、手順とテスト方法をまとめました。

EKS Pod Identityは、ポッドにIAM権限を付与するプロセスを簡素化する機能で、特にEKS auto modeでは設定が簡単です。今回は、Kinesisストリームへのデータの書き込みと読み込みをテストしながら、その手順を紹介します。

### 背景
Kinesisはリアルタイムで大量のデータを処理できるAWSのデータストリーミングサービスです。EKS Pod Identityを使うことで、ポッドからKinesisに安全にアクセスでき、従来のIAM Roles for Service Accounts（IRSA）よりも手軽に設定できます。この記事では、実際のログを参考にしながら、設定とテストの流れを解説します。

### 手順

#### 1. サービスアカウントの作成
まず、Kubernetesのサービスアカウントを作成します。以下のYAMLファイル（`kinesis-sa.yaml`）を使います：

```yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kinesis-sa
  namespace: default
```

適用します：

```bash
kubectl apply -f kinesis-sa.yaml
```

**出力例**:
```
serviceaccount/kinesis-sa created
```

これで、`kinesis-sa`というサービスアカウントが作成されました。

---

#### 2. IAMポリシーの作成
KinesisにアクセスするためのIAMポリシーを作成します。以下のJSONファイル（`kinesis-policy.json`）を用意します：

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kinesis:PutRecord",
        "kinesis:GetRecords",
        "kinesis:GetShardIterator",
        "kinesis:DescribeStream"
      ],
      "Resource": "arn:aws:kinesis:ap-northeast-1:111122223333:stream/your-stream-name"
    }
  ]
}
```

ポリシーを作成します：

```bash
aws iam create-policy --policy-name KinesisAccessPolicy --policy-document file://kinesis-policy.json
```

**出力例**:
```json
{
    "Policy": {
        "PolicyName": "KinesisAccessPolicy",
        "PolicyId": "XXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::111122223333:policy/KinesisAccessPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2025-04-02T17:53:56+00:00",
        "UpdateDate": "2025-04-02T17:53:56+00:00"
    }
}
```

ここでは、`KinesisAccessPolicy`というポリシーが作成され、Kinesisへの書き込みや読み込みの権限が設定されました。

---

#### 3. IAMロールの作成
EKS Pod Identity用のIAMロールを作成します。信頼ポリシー（`trust-policy.json`）を以下のように定義します：

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
      "Effect": "Allow",
      "Principal": {
        "Service": "pods.eks.amazonaws.com"
      },
      "Action": ["sts:AssumeRole", "sts:TagSession"]
    }
  ]
}
```

ロールを作成します：

```bash
aws iam create-role --role-name KinesisRole --assume-role-policy-document file://trust-policy.json --description "Role for Kinesis access via EKS Pod Identity"
```

**出力例**:
```json
{
    "Role": {
        "Path": "/",
        "RoleName": "KinesisRole",
        "RoleId": "XXXXXXXXXXXXXXXXXXXXXX",
        "Arn": "arn:aws:iam::111122223333:role/KinesisRole",
        "CreateDate": "2025-04-02T17:55:46+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "pods.eks.amazonaws.com"
                    },
                    "Action": ["sts:AssumeRole", "sts:TagSession"]
                }
            ]
        }
    }
}
```

`KinesisRole`というロールが作成され、EKS Pod Identityがこのロールを引き受ける準備が整いました。

---

#### 4. ポリシーのアタッチ
作成したIAMポリシーをIAMロールにアタッチします：

```bash
aws iam attach-role-policy --role-name KinesisRole --policy-arn arn:aws:iam::111122223333:policy/KinesisAccessPolicy
```

これで、`KinesisRole`にKinesisへのアクセス権限が付与されました。

---

#### 5. Pod Identityの関連付け
IAMロールをサービスアカウントに関連付けます：

```bash
aws eks create-pod-identity-association --cluster-name your-cluster-name --role-arn arn:aws:iam::111122223333:role/KinesisRole --namespace default --service-account kinesis-sa
```

**出力例**:
```json
{
    "association": {
        "clusterName": "your-cluster-name",
        "namespace": "default",
        "serviceAccount": "kinesis-sa",
        "roleArn": "arn:aws:iam::111122223333:role/KinesisRole",
        "associationArn": "arn:aws:eks:ap-northeast-1:111122223333:podidentityassociation/your-cluster-name/a-xxxxxxxxxxxxxxxxxx",
        "associationId": "a-xxxxxxxxxxxxxxxxxx",
        "tags": {},
        "createdAt": "2025-04-03T02:57:19.218000+09:00",
        "modifiedAt": "2025-04-03T02:57:19.218000+09:00"
    }
}
```

これで、`kinesis-sa`が`KinesisRole`を使用できるようになりました。

---

#### 6. テストポッドの作成
サービスアカウントを使用するテストポッドを作成します。以下のYAMLファイル（`pod.yaml`）を使います：

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: kinesis-test-pod
  namespace: default
spec:
  serviceAccountName: kinesis-sa
  containers:
  - name: test
    image: amazon/aws-cli
    command: ["sleep", "infinity"]
```

適用します：

```bash
kubectl apply -f pod.yaml
```

**出力例**:
```
pod/kinesis-test-pod created
```

これで、テスト用のポッドが起動しました。

---

### テスト方法

#### 1. アイデンティティの確認
ポッドに入り、IAMロールが正しく関連付けられているか確認します：

```bash
kubectl exec -it kinesis-test-pod -- bash
aws sts get-caller-identity
```

**出力例**:
```json
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXXX:eks-your-cluster-name-kinesis-te-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyyy",
    "Account": "111122223333",
    "Arn": "arn:aws:sts::111122223333:assumed-role/KinesisRole/eks-your-cluster-name-kinesis-te-yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyyy"
}
```

`KinesisRole`のARNが表示されれば、Pod Identityが正しく機能しています。

---

#### 2. Kinesisへの書き込みテスト
Kinesisストリームにデータを書き込みます：

```bash
aws kinesis put-record --stream-name your-stream-name --partition-key test-key --data test-data
```

**出力例**:
```json
{
    "ShardId": "shardId-000000000001",
    "SequenceNumber": "99999999999999999999999999999999999999999999999999999999"
}
```

書き込みが成功し、シャードIDとシーケンス番号が返ってきました。

---

#### 3. Kinesisからの読み込みテスト
まず、シャードイテレータを取得します：

```bash
aws kinesis get-shard-iterator --stream-name your-stream-name --shard-id shardId-000000000001 --shard-iterator-type TRIM_HORIZON
```

**出力例**:
```json
{
    "ShardIterator": "AAAAAAAAAA..."
}
```

次に、レコードを読み込みます：

```bash
aws kinesis get-records --shard-iterator <your-shard-iterator>
```

**出力例**:
```json
{
    "Records": [
        {
            "SequenceNumber": "99999999999999999999999999999999999999999999999999999999",
            "ApproximateArrivalTimestamp": "2025-04-02T18:16:26.769000+00:00",
            "Data": "test-data",
            "PartitionKey": "test-key"
        }
    ],
    "NextShardIterator": "AAAAAAAAAA....",
    "MillisBehindLatest": 0
}
```

書き込んだデータ（`test-data`）が正しく読み込まれました。

---

### 結論
この記事では、EKS Pod Identityを使ってKinesisにアクセスする方法を、実際の成功事例を基にステップバイステップで解説しました。サービスアカウントの作成からIAMロールの設定、テストポッドでのKinesis操作まで、すべてがスムーズに進みましたね。EKS Pod Identityは、AWSリソースへのアクセスを安全かつ簡単に管理できる強力なツールです。ぜひ参考にしてみてください。