ブログ記事: 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
)を使います:
apiVersion: v1
kind: ServiceAccount
metadata:
name: kinesis-sa
namespace: default
適用します:
kubectl apply -f kinesis-sa.yaml
出力例:
serviceaccount/kinesis-sa created
これで、kinesis-sa
というサービスアカウントが作成されました。
2. IAMポリシーの作成
KinesisにアクセスするためのIAMポリシーを作成します。以下のJSONファイル(kinesis-policy.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"
}
]
}
ポリシーを作成します:
aws iam create-policy --policy-name KinesisAccessPolicy --policy-document file://kinesis-policy.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
)を以下のように定義します:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
"Effect": "Allow",
"Principal": {
"Service": "pods.eks.amazonaws.com"
},
"Action": ["sts:AssumeRole", "sts:TagSession"]
}
]
}
ロールを作成します:
aws iam create-role --role-name KinesisRole --assume-role-policy-document file://trust-policy.json --description "Role for Kinesis access via EKS Pod Identity"
出力例:
{
"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ロールにアタッチします:
aws iam attach-role-policy --role-name KinesisRole --policy-arn arn:aws:iam::111122223333:policy/KinesisAccessPolicy
これで、KinesisRole
にKinesisへのアクセス権限が付与されました。
5. Pod Identityの関連付け
IAMロールをサービスアカウントに関連付けます:
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
出力例:
{
"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
)を使います:
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"]
適用します:
kubectl apply -f pod.yaml
出力例:
pod/kinesis-test-pod created
これで、テスト用のポッドが起動しました。
テスト方法
1. アイデンティティの確認
ポッドに入り、IAMロールが正しく関連付けられているか確認します:
kubectl exec -it kinesis-test-pod -- bash
aws sts get-caller-identity
出力例:
{
"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ストリームにデータを書き込みます:
aws kinesis put-record --stream-name your-stream-name --partition-key test-key --data test-data
出力例:
{
"ShardId": "shardId-000000000001",
"SequenceNumber": "99999999999999999999999999999999999999999999999999999999"
}
書き込みが成功し、シャードIDとシーケンス番号が返ってきました。
3. Kinesisからの読み込みテスト
まず、シャードイテレータを取得します:
aws kinesis get-shard-iterator --stream-name your-stream-name --shard-id shardId-000000000001 --shard-iterator-type TRIM_HORIZON
出力例:
{
"ShardIterator": "AAAAAAAAAA..."
}
次に、レコードを読み込みます:
aws kinesis get-records --shard-iterator <your-shard-iterator>
出力例:
{
"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リソースへのアクセスを安全かつ簡単に管理できる強力なツールです。ぜひ参考にしてみてください。