내용으로 건너뛰기

AWS Glue 작업에서 ‘403 Access Denied’ 오류가 반환되는 이유는 무엇입니까?

5분 분량
0

AWS Glue 작업에서 Amazon Simple Storage Service(Amazon S3) 버킷에 읽기 또는 쓰기를 시도하면 ‘403 Access Denied’ 오류가 반환됩니다.

간략한 설명

다음 예는 ‘Access Denied’ 오류가 발생할 수 있는 일반적인 원인입니다.

  • AWS Identity and Access Management(IAM) 역할에는 버킷에 액세스하는 데 필요한 권한이 없습니다.
  • Amazon S3 버킷 정책은 IAM 역할에 필요한 권한을 허용하지 않습니다.
  • S3 버킷 소유자는 객체 소유자와 다릅니다.
  • Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트 정책에는 S3 버킷에 액세스하는 데 필요한 권한이 포함되어 있지 않습니다.
  • 객체는 AWS Key Management Service(AWS KMS)로 암호화되어 있습니다. AWS KMS 정책은 키를 사용하는 데 필요한 최소 권한을 IAM 역할에 부여하지 않습니다.
  • S3 버킷에는 요청자 지불 옵션이 활성화되어 있습니다.
  • AWS Organizations 서비스 제어 정책은 S3 버킷에 대한 액세스를 제한합니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

S3 버킷에 액세스할 수 있도록 IAM 역할 권한 업데이트

AWS Glue 작업을 실행하는 IAM 역할에는 S3 버킷에 대한 액세스 권한이 필요합니다. IAM 역할에 필요한 권한을 부여하려면 IAM 정책을 IAM 역할에 연결합니다. AWSGlueServiceRole 관리형 정책을 IAM 역할에 연결하여 기본 AWS Glue 작업 권한이 제공되었는지 확인하는 것도 모범 사례입니다. 또한 작성 중에 S3 객체를 넣을 수 있는 권한에 대한 고객 관리형 정책을 생성하여 연결하십시오.

버킷에 액세스할 수 있도록 IAM 역할의 권한을 업데이트하려면 다음 단계를 완료하십시오.

  1. IAM 콘솔을 엽니다.
  2. AWS Glue 작업과 연결되어 있고 버킷에 대한 액세스 권한이 필요한 IAM 역할을 엽니다.
  3. IAM 사용자/역할의 권한 탭에서 각 정책을 확장하여 해당 JSON 정책 문서를 확인합니다.
  4. JSON 정책 문서에서 버킷 이름이 있는 정책을 찾습니다. 그런 다음, 해당 정책이 버킷에서 올바른 S3 작업을 허용하는지 확인합니다. IAM 역할이 버킷에 대한 액세스 권한을 부여하지 않는 경우 올바른 권한을 부여하는 정책을 추가합니다. 예를 들어, 다음 IAM 정책은 IAM 역할에 객체(s3:PutObject)를 S3 버킷 DOC-EXAMPLE-BUCKET에 넣을 수 있는 액세스 권한을 부여합니다.
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ExampleStmt",
          "Action": "s3:PutObject",
          "Effect": "Allow",
          "Resource": [
            "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
          ]
        }
      ]
    }

참고: 정책의 DOC-EXAMPLE-BUCKET을 S3 버킷의 이름으로 바꾸십시오.

IAM 역할에 필요한 권한을 부여하도록 버킷 정책 업데이트

다음 구성에 대한 버킷 정책을 검토하십시오.

  • 버킷에 대한 IAM 역할의 액세스를 명시적으로 거부하는 명령문
  • IAM 역할의 액세스를 제한할 수 있는 누락된 권한 및 조건

IAM 역할에 필요한 액세스 권한을 부여하도록 버킷 정책을 검토 및 수정하려면 다음 단계를 완료하십시오.

  1. Amazon S3 콘솔을 엽니다.
  2. 탐색 창에서 버킷을 선택합니다.
  3. S3 버킷을 선택합니다.
  4. 권한 페이지의 버킷 정책에서 버킷에 대한 역할 액세스를 거부하는 명령문이 있는지 버킷 정책을 검토합니다.
  5. 버킷 정책을 수정하여 버킷에 대한 IAM 역할의 액세스를 거부하는 명령문을 편집하거나 제거합니다.

샘플 버킷 정책은 Amazon S3 버킷 정책의 예를 참조하십시오.

객체 소유자 업데이트

기본적으로 객체를 업로드하는 AWS 계정이 S3 객체를 소유합니다. 이 설정은 다른 계정이 버킷을 소유한 경우에도 적용됩니다. 다른 계정이 버킷에 객체를 업로드할 수 있는 경우, IAM ID로 액세스할 수 없는 객체를 소유한 계정을 확인하십시오. 객체를 소유한 계정을 확인하려면 GetObjectAcl 명령을 실행합니다.

다른 계정의 IAM ID로 S3 버킷에 객체를 업로드하는 경우 S3 객체 소유권을 구성하십시오. 그런 다음, 버킷 소유자 전체 제어 ACL(액세스 제어 목록)을 사용하여 객체를 업로드하도록 요구하는 버킷 정책을 추가합니다. 버킷 정책을 추가하면 버킷 소유자 전체 제어 ACL을 사용하여 객체를 업로드할 때 정책에서 자동으로 객체 소유자를 버킷 소유자로 변경합니다. 자세한 내용은 다른 AWS 계정이 내 Amazon S3 버킷에 객체를 업로드할 때 객체에 대한 전체 제어 권한을 내게 부여하도록 요구하려면 어떻게 해야 합니까?를 참조하십시오.

Amazon VPC 엔드포인트 정책 검토

다음 두 조건에 모두 해당하는 경우 S3 버킷 및 객체에 액세스하는 데 필요한 권한을 포함하도록 VPC 엔드포인트 정책을 업데이트하십시오.

  • AWS Glue 작업이 Amazon S3에 객체를 읽거나 씁니다.
  • 연결이 VPC 엔드포인트를 사용하여 Amazon S3로 라우팅합니다.

예를 들어, 다음 VPC 엔드포인트 정책은 DOC-EXAMPLE-BUCKET 버킷에 대한 액세스만 허용합니다. 버킷이 정책에 허용된 리소스로 나열되지 않은 경우 사용자 또는 역할은 VPC 엔드포인트를 사용하여 버킷에 액세스할 수 없습니다.

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

참고: 정책의 DOC-EXAMPLE-BUCKET을 S3 버킷의 이름으로 바꾸십시오.

사용자 또는 역할이 ACL을 사용하여 객체를 업로드하는 경우 PutObjectAcl 작업에 대한 액세스 권한을 부여하도록 VPC 엔드포인트 정책을 업데이트해야 합니다. 예를 들면 다음과 같습니다.

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

IAM 역할에 대한 액세스를 허용하도록 AWS KMS 키 정책 업데이트

추출, 전환, 적재(ETL) 작업에서 암호화된 데이터를 Amazon S3에 읽거나 쓰는 경우 작업은 다음과 같이 구성되어야 합니다.

  • IAM 역할 정책은 AWS KMS 작업에 필요한 권한을 포함합니다.
  • AWS KMS 키 정책은 IAM 역할에 필요한 권한을 포함합니다.

필요한 AWS KMS 작업을 허용하려면 IAM 역할 정책에 다음 권한을 포함하십시오.

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }
}

참고: 정책의 Amazon 리소스 이름(ARN)을 선택한 ARN으로 바꾸십시오.

자세한 내용은 AWS Glue에서 암호화 설정을 참조하십시오.

KMS 키 정책을 검토하여 정책이 AWS Glue 작업 역할에 대한 액세스를 허용하는지 확인하십시오. 키 정책에 대한 자세한 내용은 AWS KMS의 키 정책을 참조하십시오.

S3 버킷의 요청자 지불 옵션 검토

S3 버킷에 요청자 지불 옵션이 활성화되어 있는 경우 AWS Glue 작업의 버킷에 대한 모든 요청에는 요청자 지불 헤더를 포함해야 합니다. 기본적으로 Amazon S3에 대한 AWS Glue 요청에는 요청자 지불 헤더를 포함하지 않습니다. 이 헤더가 없으면 요청자 지불 버킷에 대한 API 직접 호출이 'Access Denied' 예외와 함께 실패합니다. ETL 스크립트에 요청자 지불 헤더를 추가하려면 **hadoopConfiguration().set()**을 사용하여 fs.s3.useRequesterPaysHeader를 GlueContext 변수 또는 Apache Spark 세션 변수에 포함하십시오. 자세한 내용은 AWS Glue, Amazon EMR 또는 Athena에서 Amazon S3 요청자 지불 버킷에 액세스하려면 어떻게 해야 합니까?를 참조하십시오.

AWS Organizations 서비스 제어 정책 검토

AWS Organizations를 사용하는 경우 서비스 제어 정책을 검토하여 정책이 Amazon S3에 대한 액세스를 허용하는지 확인하십시오. 예를 들어, 다음 정책은 Amazon S3에 대한 액세스를 명시적으로 거부하여 ‘Access Denied’ 오류가 발생합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

자세한 내용은 AWS Organizations를 통해 조직의 모든 기능 활성화를 참조하십시오.

관련 정보

Amazon S3의 403 액세스 거부 오류 문제를 해결하려면 어떻게 해야 합니까?

AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠