Amazon EMR 애플리케이션이 실패하고 HTTP 403 ‘액세스 거부’ AmazonS3Exception 오류가 발생하는 이유가 무엇인가요?

최종 업데이트 날짜: 2022년 5월 3일

Amazon EMR 클러스터에 애플리케이션을 제출하면 HTTP 403 ‘액세스 거부’ 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 EMR 또는 Amazon Simple Storage Service(Amazon S3)에서 ‘액세스 거부’ 오류가 발생할 수 있습니다.

우선 애플리케이션 코드에 지정된 자격 증명 또는 역할 확인

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

aws s3 ls s3://doc-example-bucket/abc/

이 명령이 성공하면 애플리케이션 코드에 지정된 자격 증명 또는 역할로 인해 ‘액세스 거부’ 오류가 발생합니다. 애플리케이션이 예상 자격 증명을 사용 중인지 또는 예상 역할을 수임 중인지, 그리고 Amazon S3 경로에 액세스할 수 있는지 확인합니다. AWS CLI로 AWS Identity and Access Management(IAM) 역할을 수임하여 역할에 Amazon S3 경로에 대한 권한이 있는지 확인합니다. 그런 다음 S3 경로에 대한 샘플 요청을 수행합니다.

이 명령이 실패하면 AWS Command Line Interface(AWS CLI)의 최신 버전을 사용하고 있는지 확인하세요. 그러고 나서, 다음을 확인하여 “액세스 거부” 오류를 해결합니다.

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

    Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 프로파일에 S3 버킷에 대해 필요한 읽기 및 쓰기 권한이 없는 경우 ‘액세스 거부’ 오류가 발생할 수 있습니다.

    참고: 기본적으로 애플리케이션은 Amazon EC2 인스턴스 프로파일에 대한 IAM 역할에서 Amazon S3 액세스를 상속합니다. 이 역할에 연결된 IAM 정책이 원본 및 대상 버킷에 필요한 S3 작업을 허용했는지 확인합니다.

    이 문제를 해결하려면 다음 명령을 실행하여 필요한 읽기 권한이 있는지 확인하세요.

    $ aws s3 ls s3://doc-example-bucket/myfolder/

    출력은 다음과 유사합니다.

    An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

    -또는-

    다음 명령을 실행합니다.

    $ hdfs dfs -ls s3://doc-example-bucket/myfolder

    출력은 다음과 유사합니다.

    ls: 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: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

    인스턴스 프로파일 역할에 S3 버킷에 필요한 읽기 및 쓰기 권한이 있는지 확인합니다. 예를 들어, 다음 IAM 정책의 S3 작업은 S3 버킷 doc-example-bucket에 대한 필수 읽기 및 쓰기 액세스를 제공합니다.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ListObjectsInBucket",
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::doc-example-bucket"
          ]
        },
        {
          "Sid": "AllObjectActions",
          "Effect": "Allow",
          "Action": "s3:*Object*",
          "Resource": [
            "arn:aws:s3:::doc-example-bucket/*"
          ]
        }
      ]
    }

    IAM 역할에서 EMRFS 역할 매핑 확인

    보안 구성을 사용하여 EMRFS에 대한 IAM 역할을 지정하는 경우에는 역할 매핑을 사용하는 것입니다. 애플리케이션은 role-mapping 구성을 기반으로 IAM 역할에서 S3 권한을 상속합니다.

    이러한 역할에 연결된 IAM 정책에는 원본 및 대상 버킷에 대한 필수 S3 권한이 있어야 합니다. Amazon S3에 대한 EMRFS 요청을 위한 IAM 역할을 지정하려면 EMRFS용 IAM 역할로 보안 구성 설정을 참조하세요.

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

    EMR 클러스터의 서브넷 라우팅 테이블에 Amazon S3 VPC 엔드포인트의 경로가 있는 경우 엔드포인트 정책이 필요한 Amazon S3 작업을 허용하는지 확인합니다.

    CLI를 사용하여 엔드포인트 정책을 확인하고 수정하려면 다음을 수행합니다.

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

    aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-xxxxxxxx"

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

    aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-xxxxxxxx" --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 작업을 수행할 수 있도록 허용해야 합니다.

    CLI를 사용하여 버킷 정책을 확인하고 수정하려면 다음을 수행합니다.

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

    aws s3api get-bucket-policy --bucket doc-example-bucket

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

    aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

    Amazon S3 콘솔을 사용하여 버킷 정책을 확인하고 수정하려면 다음을 수행합니다.

    1. Amazon S3 콘솔을 엽니다.
    2. 해당 버킷을 선택합니다.
    3. [권한(Permissions)] 탭을 선택합니다.
    4. 버킷 정책을 검토하고 수정하려면 버킷 정책(Bucket Policy)을 선택합니다.

    다른 계정의 S3 버킷 액세스

    중요: 애플리케이션이 다른 AWS 계정에 속한 S3 버킷에 액세스하는 경우 계정 소유자가 버킷 정책에 IAM 역할을 허용해야 합니다.

    예를 들어 다음 버킷 정책은 emr-account의 모든 IAM 역할 및 사용자에게 s3://doc-example-bucket/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:::doc-example-bucket"
          ],
          "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:::doc-example-bucket"
          ],
          "Condition": {
            "StringLike": {
              "s3:prefix": [
                "myfolder/*"
              ]
            }
          }
        },
        {
          "Sid": "AllowAllS3ActionsInUserFolder",
          "Principal": {
            "AWS": [
              "arn:aws:iam::emr-account:root"
            ]
          },
          "Effect": "Allow",
          "Action": [
            "s3:*"
          ],
          "Resource": [
            "arn:aws:s3:::doc-example-bucket/myfolder/*",
            "arn:aws:s3:::doc-example-bucket/myfolder*"
          ]
        }
      ]
    }