Amazon EMR 애플리케이션이 HTTP 403 "Access Denied" AmazonS3Exception과 함께 실패함

최종 업데이트 날짜: 2019년 11월 21일

Amazon EMR 클러스터에 애플리케이션을 제출하면 HTTP 403 "Access Denied" AmazonS3Exception과 함께 애플리케이션이 실패합니다.

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

간략한 설명

이 오류는 애플리케이션이 다음 중 하나의 문제로 인해 실패한 Amazon Simple Storage Service(Amazon S3) 작업을 수행하려고 시도했음을 나타냅니다.

  • 애플리케이션 코드에 지정된 자격 증명 또는 역할
  • Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 프로파일 역할에 연결된 정책
  • Amazon S3 VPC 엔드포인트 정책
  • Amazon S3 원본 및 대상 버킷 정책

해결 방법

EMR 클러스터의 마스터 노드에서 다음 명령을 실행합니다. s3://awsexamplebucket/abc/를 Amazon S3 경로로 바꿉니다.

aws s3 ls s3://awsexamplebucket/abc/

이 명령이 성공하면 애플리케이션 코드에 지정된 자격 증명 또는 역할로 인해 "액세스 거부" 오류가 발생한 것입니다. 자격 증명 또는 역할에는 Amazon S3 경로에 대한 액세스 권한이 있어야 합니다.

이 명령이 실패하면 다음을 확인하여 "액세스 거부" 오류를 해결하십시오.

Amazon EC2 인스턴스 프로파일 역할에 대한 정책 확인

기본적으로 애플리케이션은 Amazon EC2 인스턴스 프로파일에 대한 AWS Identity and Access Management(IAM) 역할에서 Amazon S3 액세스를 상속합니다. 이 역할에 연결된 IAM 정책은 원본 및 대상 버킷에 필요한 Amazon S3 작업을 허용해야 합니다.

EMRFS 역할 매핑을 사용하는 경우 애플리케이션은 애플리케이션을 제출한 사용자의 IAM 역할에서 Amazon S3 권한을 상속합니다. 이 IAM 사용자에게는 원본 및 대상 버킷에 필요한 Amazon S3 작업을 허용하는 IAM 정책이 있어야 합니다.

Amazon S3 VPC 엔드포인트 정책 확인

EMR 클러스터의 서브넷 라우팅 테이블에 Amazon S3 VPC 엔드포인트의 경로가 있는 경우 엔드포인트 정책이 필요한 Amazon S3 작업을 허용하는지 확인합니다. AWS 명령줄 인터페이스(AWS CLI) 또는 Amazon VPC 콘솔을 사용하여 엔드포인트 정책을 확인하고 수정할 수 있습니다.

AWS CLI:

다음 명령을 실행하여 엔드포인트 정책을 검토합니다. vpce-9f28e4f6을 해당 VPC ID로 바꿉니다.

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-9f28e4f6"

필요한 경우 다음 명령을 실행하여 수정된 엔드포인트 정책을 업로드합니다. 예에서 VPC ID와 JSON 파일 경로를 바꿉니다.

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-9f28e4f6" --policy-document file://policy.json

Amazon VPC 콘솔:

1.    [Amazon VPC 콘솔]을 엽니다.

2.    탐색 창에서 [Endpoints]를 선택합니다.

3.    Amazon S3 엔드포인트(EMR 클러스터의 서브넷 라우팅 테이블에 있는 엔드포인트)를 선택한 다음 [Policy] 탭을 선택하여 엔드포인트 정책을 검토합니다.

4.    필요한 Amazon S3 작업을 추가하려면 [Edit Policy]를 선택합니다.

S3 버킷 정책 확인

버킷 정책은 어떤 보안 주체에 대해 허용되거나 거부될 작업을 지정합니다. 원본 및 대상 버킷에 대한 버킷 정책은 EC2 인스턴스 프로파일 역할 또는 매핑된 IAM 역할이 필요한 Amazon S3 작업을 수행할 수 있도록 허용해야 합니다. AWS CLI 또는 Amazon S3 콘솔을 사용하여 버킷 정책을 확인하고 수정할 수 있습니다.

AWS CLI:

다음 명령을 실행하여 버킷 정책을 검토합니다. awsexamplebucket을 원본 또는 대상 버킷 이름으로 바꿉니다.

aws s3api get-bucket-policy --bucket awsexamplebucket

필요한 경우 다음 명령을 실행하여 수정된 버킷 정책을 업로드합니다. 예에서는 버킷 이름과 JSON 파일 경로를 바꿉니다.

aws s3api put-bucket-policy --bucket awsexamplebucket --policy file://policy.json

Amazon S3 콘솔:

1.    Amazon S3 콘솔을 엽니다.

2.    버킷을 선택합니다.

3.    [권한] 탭을 선택합니다.

4.    버킷 정책을 검토하고 수정하려면 [Bucket Policy]를 선택합니다.

다른 계정의 S3 버킷 액세스

애플리케이션이 다른 AWS 계정에 속한 S3 버킷에 액세스하는 경우 계정 소유자가 버킷 정책에 IAM 역할을 허용해야 합니다. 예를 들어 다음 버킷 정책은 emr-account의 모든 IAM 역할 및 사용자에게 s3://awsexamplebucket/myfolder/에 대한 모든 액세스 권한을 부여합니다.

{
    "Id": "MyCustomPolicy",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::emr-account:root"
                ]
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::awsexamplebucket"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "myfolder/"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::emr-account:root"
                ]
            },
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::awsexamplebucket"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "myfolder/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::emr-account:root"
                ]
            },
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::awsexamplebucket/myfolder/*",
                "arn:aws:s3:::awsexamplebucket/myfolder*"
            ]
        }
    ]
}