Amazon EKS에서 IRSA를 사용하여 Amazon S3 버킷에 대한 액세스를 제한하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)의 포드 수준에서 Amazon Simple Storage Service(Amazon S3) 버킷 액세스를 제한하려고 합니다. 또한 서비스 계정용 AWS Identity and Access Management(IAM)(IRSA) 역할을 사용하여 애플리케이션에 대한 최소 권한을 유지하려고 합니다.

해결 방법

참고: AWS Command Line Interface(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 버킷 이름으로 바꾸십시오. 위의 정책 예시는 IAM 사용자가 S3 버킷에서만 객체를 나열하고 검색할 수 있도록 Amazon S3 권한을 제한합니다.
  2. IAM 정책을 생성하려면 create-policy AWS CLI 명령을 실행합니다.
    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"

이 문제를 해결하려면 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 WAF 서비스의 작업, 리소스 및 조건 키

AWS 공식
AWS 공식업데이트됨 한 달 전