New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
Amazon Athena에서 쿼리를 실행할 때 “액세스 거부됨” 권한 오류를 해결하려면 어떻게 해야 합니까?
Amazon Athena 쿼리를 실행할 때 “액세스 거부됨” 오류가 발생합니다.
간략한 설명
액세스 거부됨 쿼리 오류는 일반적으로 Athena가 상호 작용하는 다른 AWS 서비스 또는 AWS 계정의 권한 문제와 관련이 있습니다. Athena가 일반적으로 사용하는 서비스의 예로는 AWS Identity and Access Management(IAM), Amazon Simple Storage Service(Amazon S3), AWS Key Management Service(AWS KMS)가 있습니다.
다음과 같은 이유로 인해 액세스 거부됨 오류가 발생할 수 있습니다.
- AWS Glue 데이터 카탈로그 정책은 IAM 개체(사용자 또는 역할) 에 대한 액세스를 허용하지 않습니다.
- IAM 개체에는 S3 원본 데이터 버킷을 읽거나 쿼리 결과 버킷에 결과를 쓸 권한이 없습니다.
- S3 버킷 정책은 Athena 테이블과 버킷이 서로 다른 계정에 있는 경우 IAM 개체에 필요한 권한을 허용하지 않습니다.
- 객체 소유자가 Amazon S3 버킷 소유자와 다릅니다.
- 암호화된 데이터를 읽거나 쓰는 데 사용되는 AWS KMS 키에 액세스할 수 없습니다.
해결 방법
액세스 거부됨 오류를 해결하려면 사용 사례에 맞는 다음 권한을 확인하세요. 자세한 내용을 보려면 Athena에서 문제 해결을 참조하세요.
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
Glue 데이터 카탈로그 정책이 IAM 개체에 대한 액세스를 허용하는지 확인합니다.
Glue 데이터 카탈로그 정책을 사용하는 경우 정책이 IAM 개체에 대한 액세스를 허용하는지 확인하세요. 예를 들어, 데이터 카탈로그에 다음과 같은 정책이 있는 경우 athena_user IAM 개체는 데이터 카탈로그에 대한 액세스가 거부됩니다.
{ "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 권한의 전체 목록은 AWS 관리형 정책: AmazonAthenaFullAccess를 참고하세요.
데이터 카탈로그 리소스 정책이 필수 AWS Glue 작업을 거부하지 않는지 확인하세요. 자세한 내용을 보려면 AWS Glue 데이터 카탈로그의 데이터베이스 및 테이블에 대한 세분화된 액세스를 참조하세요.
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 버킷 정책을 연결할 필요가 없습니다. 하지만 버킷 정책을 이미 연결했다면 데이터를 쿼리하는 IAM 개체에 S3 권한을 부여하는지 확인하세요.
Athena 테이블과 S3 버킷이 다른 계정에 있는 경우 IAM 개체에 액세스 권한을 부여하는 S3 버킷 정책을 연결하세요.
S3 버킷이 있는 계정에서 다른 계정의 athena_user에게 액세스 권한을 부여하는 S3 버킷 정책을 연결합니다. 다음 예제 정책은 계정 A의 IAM 사용자가 계정 B의 my-athena-source-bucket S3 버킷에 액세스할 수 있도록 명시적으로 허용합니다.
{ "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를 IAM 사용자 계정(계정 A)의 ID로 대체
- athena_user를 IAM 사용자(계정 A)이름으로 대체
다른 계정의 모든 사용자에게 버킷에 대한 액세스 권한을 부여하려면 주요 키를 루트("arn:aws:iam::1111222233334444:root")를 지정하는 키로 바꾸세요.
참고: 위 정책은 my-athena-source 버킷에 대한 모든 S3 작업을 허용합니다. S3 버킷이 원본 버킷인지 또는 쿼리 결과 버킷인지에 따라 S3 작업을 업데이트합니다. 자세한 내용을 보려면 버킷 객체에 대한 크로스 계정 액세스를 참조하세요.
S3 버킷 정책에 계정 A 또는 해당 IAM 사용자에 대한 액세스를 명시적으로 거부하는 명령문이 포함되어 있지 않은지 확인합니다. 또한 정책에 요청을 거부할 수 있는 조건이 포함되어 있지 않은지 확인하세요. 자세한 내용을 보려면 Amazon S3의 403 액세스 거부 오류 문제를 해결하려면 어떻게 해야 합니까?를 참조하세요.
AWS KMS 키 정책 업데이트
원본 데이터가 암호화되어 있거나 Athena 쿼리가 AWS KMS 키를 사용하여 암호화된 결과를 작성하는 경우, 다음 권한을 확인하세요.
- IAM 사용자 정책은 필요한 AWS KMS 작업을 허용합니다.
- AWS KMS 키 정책은 사용자에게 액세스를 허용합니다.
다음 예제 AWS KMS 키 정책은 계정 1111222233334444 계정의 모든 사용자에게 모든 AWS KMS 작업을 허용합니다.
{ "Sid": "Enable IAM policies", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1111222233334444:root" }, "Action": "kms:*", "Resource": "*" }
참고: 위 정책에서 예제 변수를 변수로 바꾸세요.
자세한 내용은 AWS KMS의 키 정책 및 Amazon S3의 암호화된 데이터에 대한 권한을 참조하세요.
S3 버킷 소유자가 객체에 액세스할 수 있는지 확인하세요.
기본적으로 버킷에 S3 객체를 업로드하는 계정이 객체를 소유합니다. 이는 다른 계정이 해당 버킷을 소유한 경우에도 마찬가지입니다. 다른 계정에서 버킷에 객체를 업로드할 수 있는 경우 사용자가 액세스할 수 없는 객체를 소유한 계정을 확인하세요. GetObjectAcl 명령을 실행하여 객체 소유자를 확인합니다.
S3 버킷 소유자와 객체 소유자가 다른 경우 객체 소유자가 객체에 대한 전체 제어 권한을 부여할 수 있습니다. 이를 위해 오브젝트 소유자는 bucket-owner-full-control 파라미터로 PutObjectAcl 명령을 실행합니다.
S3 버킷을 소유한 계정으로 객체 소유권을 변경하려면 AWS CLI cp 명령을 실행합니다. 버킷 계정에서 cp 명령을 실행하여 객체 자체를 복사해야 합니다.
자세한 내용을 보려면 다른 AWS 계정에서 Amazon S3 버킷에 업로드한 객체에 액세스할 수 없는 이유는 무엇인가요? 를 참조하세요.
관련 정보
관련 콘텐츠
- 질문됨 한 달 전lg...
- 질문됨 2년 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 3달 전