Amazon EKS で IRSA を使用して Amazon S3 バケットへのアクセスを制限する方法を教えてください。

所要時間4分
0

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 ポリシーとロールを作成する

次の手順を実行します。

  1. iam-policy.json という名前の JSON ファイルを作成します。ポリシーの例
    {    
        "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/*"
            }
        ]
    }
    注: YOUR_BUCKET は、実際の S3 バケット名に置き換えます。上記のサンプルポリシーは、Amazon S3 のアクセス許可を制限し、IAM ユーザーが S3 バケットからオブジェクトを一覧表示および取得のみ行えるようにしています。
  2. IAM ポリシーを作成するには、次の AWS CLI コマンド create-policy を実行します。
    aws iam create-policy \
        --policy-name YOUR_IAM_POLICY_NAME \
        --policy-document file://iam-policy.json
    注: YOUR_IAM_POLICY_NAME は、実際のポリシー名に置き換えます。
  3. IAM ロールを作成し、クラスターサービスの AWS アカウントに関連付けます
  4. IAM ポリシーとロールが正しく設定されていることを確認します
  5. (オプション) ロール名を取得するには、次のコマンドを実行します。
    kubectl get sa SERVICE_ACCOUNT_NAME -n NAMESPACE_NAME -o yaml | grep eks.amazonaws.com/role-arn | cut -d '/' -f 3
    注: 実際のものでそれぞれ、SERVICE_ACCOUNT_NAME をサービスアカウント名に、NAMESPACE_NAME を名前空間名に置き換えます。
    出力例
    eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE

Amazon EKS ポッドを作成する

ポッドが正しいアクセス許可を持つ IAM ロールを引き受けられることを確認します。次の手順を実行し、アプリケーションを AWS CLI で公式イメージに置き換えます。

  1. aws-cli-pod.yaml という名前の YAML ファイルを作成します。ファイル例
    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
    注: 実際のものでそれぞれ、NAMESPACE_NAME を名前空間に、SERVICE_ACCOUNT_NAME を Kubernetes サービスアカウント名に置き換えます。
  2. Amazon EKS ポッドを作成するには、次のコマンドを実行します。
    kubectl apply -f ./aws-cli-pod.yaml

Amazon EKS ポッドをテストする

注: 次の例では、ポッドは YOUR_BUCKET という S3 バケットのオブジェクトを一覧表示、取得できます。

ポッドが Amazon S3 用の正しい IAM ロールとアクションを使用していることを確認するには、次の手順を実行します。

  1. 認証情報を使用する 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"
    }
  2. ポッドに 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": {}
    }
  3. ポッドに 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 に存在することを確認してください。

関連情報

IAM ポリシーシミュレーターを使用して IAM ポリシーをテストする

AWS サービス用のアクション、リソース、条件キー

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ