Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
Amazon EKS で IRSA を使用して Amazon S3 バケットへのアクセスを制限する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) において、Amazon Simple Storage Service (Amazon S3) バケットへのアクセスをポッドレベルで制限したいです。さらに、サービスアカウント (IRSA) の AWS Identity and Access Management (IAM) ロールを使用して、アクセス許可をアプリケーションに必要な最小限のものに限定したいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
前提条件 クラスター用の IAM OpenID Connect (OIDC) プロバイダーを作成します。
IAM ポリシーとロールを作成する
次の手順を実行します。
- iam-policy.json という名前の JSON ファイルを作成します。ポリシーの例
注: YOUR_BUCKET は、実際の S3 バケット名に置き換えます。上記のサンプルポリシーは、Amazon S3 のアクセス許可を制限し、IAM ユーザーが S3 バケットからオブジェクトを一覧表示および取得のみ行えるようにしています。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::YOUR_BUCKET" }, { "Sid": "List", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::YOUR_BUCKET/*" } ] }
- IAM ポリシーを作成するには、次の AWS CLI コマンド create-policy を実行します。
注: YOUR_IAM_POLICY_NAME は、実際のポリシー名に置き換えます。aws iam create-policy \ --policy-name YOUR_IAM_POLICY_NAME \ --policy-document file://iam-policy.json
- IAM ロールを作成し、クラスターサービスの AWS アカウントに関連付けます。
- IAM ポリシーとロールが正しく設定されていることを確認します。
- (オプション) ロール名を取得するには、次のコマンドを実行します。
注: 実際のものでそれぞれ、SERVICE_ACCOUNT_NAME をサービスアカウント名に、NAMESPACE_NAME を名前空間名に置き換えます。kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
出力例eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE
Amazon EKS ポッドを作成する
ポッドが正しいアクセス許可を持つ IAM ロールを引き受けられることを確認します。次の手順を実行し、アプリケーションを AWS CLI で公式イメージに置き換えます。
- aws-cli-pod.yaml という名前の YAML ファイルを作成します。ファイル例
注: 実際のものでそれぞれ、NAMESPACE_NAME を名前空間に、SERVICE_ACCOUNT_NAME を Kubernetes サービスアカウント名に置き換えます。apiVersion: v1 kind: Pod metadata: name: aws-cli namespace: NAMESPACE_NAME spec: serviceAccountName: SERVICE_ACCOUNT_NAME containers: - name: aws-cli image: amazon/aws-cli:latest command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
- Amazon EKS ポッドを作成するには、次のコマンドを実行します。
kubectl apply -f ./aws-cli-pod.yaml
Amazon EKS ポッドをテストする
注: 次の例では、ポッドは YOUR_BUCKET という S3 バケットのオブジェクトを一覧表示、取得できます。
ポッドが Amazon S3 用の正しい IAM ロールとアクションを使用していることを確認するには、次の手順を実行します。
-
認証情報を使用する IAM ロールを見つけるには、次のコマンドを実行します。
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws sts get-caller-identity
注: NAMESPACE_NAME を実際の名前空間名に置き換えます。
出力例{ "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-123456789012", "Account": "123456789012", "Arn": "arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012" }
-
ポッドに S3 バケットに対する正しいアクセス許可があることを確認します。
ポッドに s3:ListBuckets アクセス許可があることを確認するには、次のコマンドを実行します。kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET
注: 実際のものでそれぞれ、NAMESPACE_NAME を名前空間名に、YOUR_BUCKET をバケットに置き換えます。
出力例2025-03-25 22:28:06 14 hello_s3.txt
ポッドに s3:GetObject アクセス許可があることを確認するには、次のコマンドを実行します。
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3api get-object --bucket YOUR_BUCKET --key DIR/S3_OBJECT_FILE S3_FILE_NAME_LOCAL
注: 実際のものでそれぞれ、NAMESPACE_NAME を名前空間名に、YOUR_BUCKET をバケットに置き換えます。さらに、DIR/S3_OBJECT_FILE をディレクトリとオブジェクトファイル名に、S3_FILE_NAME_LOCAL を新しいローカル Amazon S3 オブジェクトに置き換えます。
出力例{ "AcceptRanges": "bytes", "LastModified": "2025-03-14T01:49:38+00:00", "ContentLength": 19, "ETag": "\"678b33365329cce6cd2bb1882e62fe3a\"", "ContentType": "text/plain", "ServerSideEncryption": "AES256", "Metadata": {} }
-
ポッドに s3:DeleteObject アクセス許可が欠けているかどうかを確認するには、次のコマンドを実行します。
kubectl -n NAMESPACE_NAME exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/DEMO_TEST_FILE
注: 実際のものでそれぞれ、NAMESPACE_NAME を名前空間名に、YOUR_BUCKET をバケットに置き換えます。さらに、DEMO_TEST_FILE を実際の Amazon S3 オブジェクトファイルに置き換えます。
ポッドに s3:DeleteObject アクセス許可がない場合、出力に次の Access Denied エラーが表示されます。delete failed: s3://YOUR_BUCKET/DEMO_TEST_FILE An error occurred (AccessDenied) when calling the DeleteObject operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:DeleteObject on resource: "arn:aws:s3:::YOUR_BUCKET/DEMO_TEST_FILE" because no identity-based policy allows the s3:DeleteObject action command terminated with exit code 1
問題のトラブルシューティング
重要: 変更を加えた後は、必ず新しいポッドを作成してください。Amazon EKS は新しく作成されたポッドにのみ更新を反映し、既存のポッドには反映しません。
NoSuchBucket エラー
S3 バケットが存在しないため、見つからない場合は次のエラーが発生します。
「An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation: The specified bucket does not exist command terminated with exit code 254」 (指定したバケットが存在しません)
この問題をトラブルシューティングするには、コマンドで正しい S3 バケット名を使用していることを確認してください。
NoSuchKey エラー
特定の S3 バケットパスからダウンロードできない場合は、次のエラーが発生します。
「An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist」 (指定したキーは存在しません)
この問題をトラブルシューティングするには、問題の Amazon S3 パスとファイル名が AWS アカウント内に存在することを確認してください。
AccessDenied エラー
S3 バケットでアクションを実行するためのアクセス許可がない場合は、エラーが発生します。たとえば、ListObjectsV2 アクションを実行できない場合は次のエラーが発生します。
「An error occurred (AccessDenied) when calling the ListObjectsV2 operation: User: arn:aws:sts::123456789012:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-123456789012 is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::YOUR_BUCKET" because no identity-based policy allows the s3:ListBucket action command terminated with exit code 254」 (s3:ListBucket アクションを許可する ID ベースのポリシーがありません)
この問題をトラブルシューティングするには、IAM ロールポリシーにアクセス許可が追加されていることを確認してください。
IAM ID プロバイダーにエラーがある場合、次のエラーが発生します。
「An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity command terminated with exit code 254」
この問題をトラブルシューティングするには、次の設定を確認してください。
- クラスターの IAM OIDC プロバイダーが正しく設定されている。
- IAM ロールの信頼関係が正しく設定されている。
- サービスアカウントが正しい IAM ロールを使用している。
InvalidIdentityToken エラー
Amazon EKS がアカウントの OIDC プロバイダーを見つけられない場合、次のエラーが発生します。
「An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: No OpenIDConnect provider found in your account for https://oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE command terminated with exit code 254」
この問題をトラブルシューティングするには、OIDC 用の ID プロバイダーが IAM に存在することを確認してください。
関連情報

関連するコンテンツ
- 質問済み 9ヶ月前lg...