Amazon Athena에서 쿼리를 실행할 때 ‘Access Denied’ 오류가 발생하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 8월 29일

Amazon Athena 쿼리를 실행할 때, ‘Access Denied’ 오류가 표시됩니다.

간략한 설명

다음과 같은 이유로 ‘Access Denied’ 오류가 발생합니다.

  • AWS Identity and Access Management(IAM) 사용자에게 다음 권한 중 하나 이상이 없습니다.
    • 원본 데이터 버킷을 읽습니다.
    • 결과를 쿼리 결과 버킷에 기록합니다.
  • Amazon Simple Storage Service(Amazon S3) 버킷 정책은 IAM 사용자에게 필요한 권한을 허용하지 않습니다.
  • 객체 소유자가 Amazon S3 버킷 소유자와 다릅니다.
  • 암호화된 데이터를 읽거나 쓰는 데 사용되는 AWS Key Management Service(AWS KMS) 키에 액세스할 수 없습니다.
  • AWS Glue 데이터 카탈로그 정책은 IAM 사용자에 대한 액세스를 허용하지 않습니다.

해결 방법

‘Access Denied’ 오류를 해결하려면 다음을 확인합니다. 자세한 내용은 인스턴스 문제 해결을 참조합니다.

IAM 사용자에게 원본 데이터 버킷과 쿼리 결과 버킷에 액세스하는 데 필요한 권한이 있는지 확인합니다.

원본 데이터 버킷에 대한 액세스 권한이 없는 경우 다음과 유사한 오류가 발생합니다.

Your query has the following errors:com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 72VA5FB0ASWCQFPD; S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx=; Proxy: null), S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx= (Path: s3://my-athena-source-bucket/athena_data.csv)

쿼리 결과 버킷에 대한 액세스 권한이 없는 경우 다음과 유사한 오류가 발생합니다.

Your query has the following errors:Access denied when writing output to url: s3://my-athena-result-bucket/Unsaved/2021/05/07/example_query_ID.csv . Please ensure you are allowed to access the S3 bucket. If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key

쿼리를 실행하는 IAM 사용자는 원본 데이터 버킷과 쿼리 결과 버킷에 액세스해야 합니다. IAM 정책을 IAM 사용자/역할에 연결하여 IAM 사용자에게 필요한 권한을 부여할 수 있습니다. 다음 IAM 정책은 원본 데이터 버킷과 쿼리 결과 버킷에 대한 최소 권한을 허용합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket/data/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:AbortMultipartUpload",
        "s3:PutObject",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-result-bucket",
        "arn:aws:s3:::my-athena-result-bucket/*"
      ]
    }
  ]
}

이 예제 정책에서 다음을 대체해야 합니다.

  • my-athena-source-bucket을 원본 데이터 버킷 이름으로 대체
  • my-athena-source-bucket/data/를 원본 데이터 위치로 대체
  • my-athena-result-bucket을 쿼리 결과 버킷 이름으로 대체

전체 정책 목록은 Amazon Athena에 대한 AWS 관리형 정책을 참조하세요.

교차 계정 쿼리에 필요한 권한을 가진 Amazon S3 버킷 정책 연결

Athena 테이블과 S3 버킷이 동일한 계정에 있는 경우 S3 버킷 정책을 연결할 필요가 없습니다. 그러나 S3 버킷 정책이 있는 경우 IAM 사용자/역할에 필요한 S3 작업을 부여해야 합니다. Athena 테이블과 S3 버킷이 서로 다른 계정에 있는 경우 IAM 사용자에게 필요한 액세스 권한을 부여하는 S3 버킷 정책을 연결해야 합니다.

계정 B에서 다음과 유사한 S3 버킷 정책을 연결하여 계정 A에서 IAM 사용자 athena_user에게 액세스 권한을 부여할 수 있습니다. 이 예제 정책은 IAM 사용자가 계정 B의 S3 버킷 my-athena-source-bucket에 액세스할 수 있도록 명시적으로 허용합니다.

{
  "Version": "2012-10-17",
  "Id": "Policy1620692934647",
  "Statement": [
    {
      "Sid": "Stmt1620692932186",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:user/athena_user"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket",
        "arn:aws:s3:::my-athena-source-bucket/data/*"
      ]
    }
  ]
}

이 예제 정책에서 다음을 대체해야 합니다.

  • my-athena-source-bucket을 원본 데이터 버킷 이름으로 대체
  • my-athena-source-bucket/data/를 원본 데이터 위치로 대체
  • 1111222233334444를 계정 A의 AWS 계정 ID로 대체
  • athena_user를 계정 A의 IAM 사용자 이름으로 대체

계정 A의 모든 사용자에게 버킷에 액세스할 수 있는 권한을 부여하려면 보안 주체 키를 루트가 지정된 키로 바꿉니다. 예를 들어, "arn:aws:iam::1111222233334444:root"입니다.

참고: 이 정책은 my-athena-source-bucket에 대한 모든 S3 작업을 허용합니다. S3 버킷이 원본 버킷인지 또는 쿼리 결과 버킷인지에 따라 S3 작업을 업데이트할 수 있습니다. 자세한 내용은 Amazon S3 버킷에 대한 Athena의 교차 계정 액세스에서 버킷 정책 또는 IAM 사용자 정책 섹션을 참조하세요.

S3 버킷 정책에 계정 A 또는 IAM 사용자에 대한 액세스를 명시적으로 거부하는 문이 포함되어 있지 않은지 확인합니다. 또한 정책에 요청을 거부할 수 있는 조건이 포함되어 있지 않은지 확인합니다. 자세한 내용은 Amazon S3에서 403 Access Denied 오류 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요. S3 버킷에 대한 최소 권한을 정의하려면 AWS 서비스에서 호출한 작업에 최소 권한을 정의하는 방법을 참조하세요.

AWS KMS 키 정책 업데이트

원본 데이터가 암호화되거나 Athena 쿼리에서 AWS KMS 키를 사용하여 암호화된 결과를 기록하는 경우 다음 사항을 확인합니다.

  • IAM 사용자 정책은 필요한 AWS KMS 작업을 허용합니다.
  • AWS KMS 키의 정책은 사용자에 대한 액세스를 허용합니다.

계정 ID 1111222233334444의 모든 사용자에게 모든 AWS KMS 작업을 허용하는 AWS KMS 키 정책의 예입니다.

{
  "Sid": "Enable IAM policies",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::1111222233334444:root"
   },
  "Action": "kms:*",
  "Resource": "*"
}

사용 사례에 따라 이 정책을 업데이트해야 합니다. 자세한 내용은 AWS KMS에서 키 정책 사용Amazon S3에서 암호화된 데이터에 대한 권한을 참조하세요.

S3 버킷 소유자가 객체에 액세스할 수 있는지 확인

기본적으로 S3 객체는 해당 객체를 업로드한 AWS 계정의 소유입니다. 이는 버킷을 다른 계정에서 소유하는 경우에도 마찬가지입니다. 다른 계정에서 버킷에 객체를 업로드할 수 있는 경우 사용자가 액세스할 수 없는 객체를 소유한 계정을 확인합니다. GetObjectAcl 명령을 실행하여 객체 소유자를 확인할 수 있습니다.

S3 버킷 소유자와 객체 소유자가 다르면 객체 소유자가 사용자에게 객체에 대한 모든 권한을 부여할 수 있습니다. 객체 소유자는 bucket-owner-full-control 파라미터를 사용하여 PutObjectAcl 명령을 실행함으로써 이를 수행할 수 있습니다. 객체 소유권을 S3 버킷을 소유한 계정으로 변경하려면 버킷 계정에서 AWS 명령줄 인터페이스(AWS CLI) 명령 cp를 실행하여 객체를 자체적으로 복사합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

자세한 내용은 다른 AWS 계정에서 제 Amazon S3 버킷에 업로드한 객체에 액세스할 수 없는 이유는 무엇입니까?를 참조하세요.

AWS Glue 데이터 카탈로그 정책이 IAM 사용자/역할에 대한 액세스를 허용하는지 확인합니다.

기존 AWS Glue 데이터 카탈로그 정책이 있는 경우 정책에서 IAM 사용자/역할에 대한 액세스를 허용해야 합니다. 예를 들어 데이터 카탈로그에 다음 정책이 있는 경우 IAM 사용자 athena_user는 데이터 카탈로그에 대한 액세스가 거부됩니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:user/athena_user"
        ]
      },
      "Effect": "Deny",
      "Action": [
        "glue:*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:*"
      ]
    }
  ]
}

정책 예는 AWS Glue 리소스 기반 액세스 제어 정책 예제를 참조하세요.

데이터 카탈로그에 정책을 사용하면 사용자가 실행하는 Athena 쿼리가 다음 오류와 함께 실패할 수 있습니다.

Insufficient permissions to execute the query. User: arn:aws:iam:: 1111222233334444:user/athena_user is not authorized to perform: glue:GetTable on resource: arn:aws:glue:us-east-1:1111222233334444:database/doc_example_database with an explicit deny Query Id: example_query_ID

또한 쿼리를 실행하는 IAM 사용자/역할에 AWS Glue 리소스에 액세스하는 데 필요한 권한이 있어야 합니다. 필요한 AWS Glue 권한의 전체 목록은 AmazonAthenaFullAccess 관리형 정책을 참조하세요. 필요한 AWS Glue 작업이 데이터 카탈로그 리소스 정책에서 거부되지 않도록 해야 합니다. 자세한 내용은 AWS Glue 데이터 카탈로그의 데이터베이스 및 테이블에 대한 세분화된 액세스를 참조하세요.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?