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) 버킷 액세스를 제한하려고 합니다. 또한 서비스 계정용 AWS Identity and Access Management(IAM)(IRSA) 역할을 사용하여 애플리케이션에 대한 최소 권한을 유지하려고 합니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
전제 조건: 클러스터용 IAM OpenID Connect(OIDC) 공급자를 만듭니다.
IAM 정책 및 역할 생성
다음 단계를 완료합니다.
- iam-policy.json이라는 JSON 파일을 생성합니다. 정책 예시:
참고: YOUR_BUCKET을 S3 버킷 이름으로 바꾸십시오. 위의 정책 예시는 IAM 사용자가 S3 버킷에서만 객체를 나열하고 검색할 수 있도록 Amazon 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 정책을 생성하려면 create-policy AWS CLI 명령을 실행합니다.
참고: 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"
이 문제를 해결하려면 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에 있는지 확인하십시오.
관련 정보

관련 콘텐츠
- 질문됨 한 달 전lg...
- 질문됨 2년 전lg...
- 질문됨 7달 전lg...
- 질문됨 2년 전lg...