외부 Hive 메타스토어에 대한 Lambda 함수 액세스 허용 - Amazon Athena

외부 Hive 메타스토어에 대한 Lambda 함수 액세스 허용

사용자 계정에서 Lambda 함수를 호출하려면 다음 권한을 가진 역할을 만들어야 합니다.

  • AWSLambdaVPCAccessExecutionRole – 함수를 VPC에 연결하는 탄력적 네트워크 인터페이스를 관리하기 위한 AWS Lambda 실행 역할 권한입니다. 충분한 수의 네트워크 인터페이스 및 IP 주소를 사용할 수 있는지 확인합니다.

  • AmazonAthenaFullAccessAmazonAthenaFullAccess 관리형 정책은 Athena에 대한 모든 액세스 권한을 부여합니다.

  • Lambda 함수가 S3에 쓸 수 있도록 허용하고 Athena가 S3에서 읽을 수 있도록 허용하는 Amazon S3 정책입니다.

예를 들어 다음 정책은 유출 위치 s3:\\mybucket\spill에 대한 권한을 정의합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/spill" ] } ] }

IAM 정책을 사용할 때는 항상 IAM 모범 사례를 따라야 합니다. 자세한 내용은 IAM 사용 설명서IAM 보안 모범 사례를 참조하세요.

Lambda 함수 생성

사용자 계정에서 Lambda 함수를 만들려면 함수 개발 권한 또는 AWSLambdaFullAccess 역할이 필요합니다. 자세한 내용은 AWS Lambda에 대한 자격 증명 기반 IAM 정책을 참조하세요.

Athena는 AWS Serverless Application Repository를 사용해 Lambda 함수를 생성하기 때문에 Lambda 함수를 생성하는 슈퍼 사용자 또는 관리자는 Athena 연합 쿼리를 허용할 IAM 정책도 보유해야 합니다.

카탈로그 등록 및 메타데이터 API 작업

카탈로그 등록 API 및 메타데이터 API 작업에 액세스하려면 AmazonAthenaFullAccess 관리형 정책을 사용합니다. 이 정책을 사용하지 않는 경우에는 다음 API 작업을 Athena 정책에 추가하세요.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "athena:ListDataCatalogs", "athena:GetDataCatalog", "athena:CreateDataCatalog", "athena:UpdateDataCatalog", "athena:DeleteDataCatalog", "athena:GetDatabase", "athena:ListDatabases", "athena:GetTableMetadata", "athena:ListTableMetadata" ], "Resource": [ "*" ] } ] }

리전 간 Lambda 호출

Athena 쿼리를 실행 중인 리전 이외의 리전에서 Lambda 함수를 호출하려면 Lambda 함수의 전체 ARN을 사용합니다. 기본적으로 Athena는 동일한 리전에 정의된 Lambda 함수를 호출합니다. Athena 쿼리를 실행하는 리전이 아닌 다른 리전의 Hive 메타스토어에 액세스하기 위해 Lambda 함수를 호출해야 하는 경우 Lambda 함수의 전체 ARN을 제공해야 합니다.

예를 들어 미국 동부(버지니아 북부) 리전에서 다음 Lambda 함수를 사용하도록 유럽(프랑크푸르트) 리전 eu-central-1에 카탈로그 ehms를 정의한다고 가정합니다.

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

이러한 방식으로 전체 ARN을 지정하면 Athena는 us-east-1external-hms-service-new Lambda 함수를 호출하여 eu-central-1에서 Hive 메타스토어 데이터를 가져올 수 있습니다.

참고

카탈로그 ehms는 Athena 쿼리를 실행하는 동일한 리전에 등록되어야 합니다.

계정 간 Lambda 호출

경우에 따라 다른 계정에서 Hive 메타스토어에 액세스해야 할 수도 있습니다. 예를 들어 Hive 메타스토어를 실행하려면 Athena 쿼리에 사용하는 계정과 다른 계정에서 EMR 클러스터를 시작할 수도 있습니다. 여러 그룹 또는 팀이 VPC 내에서 여러 계정으로 Hive 메타스토어를 실행할 수도 있습니다. 또는 여러 그룹 또는 팀에서 여러 Hive 메타스토어의 메타데이터에 액세스해야 할 수도 있습니다.

Athena는 계정 간 액세스에 대한 AWS Lambda 지원을 사용하여 Hive 메타스토어에 대한 계정 간 액세스를 활성화합니다.

참고

Athena에 대한 계정 간 액세스는 일반적으로 Amazon S3의 메타데이터 및 데이터 모두에 대한 계정 간 액세스를 의미합니다.

다음 시나리오를 예로 들겠습니다.

  • 계정 111122223333은 EMR 클러스터에서 실행 중인 Hive 메타스토어에 액세스하기 위해 Athena의 us-east-1에 Lambda 함수 external-hms-service-new를 설정합니다.

  • 계정 111122223333에서 계정 444455556666이 Hive 메타스토어 데이터에 액세스하도록 허용할 수 있습니다.

Lambda 함수 external-hms-service-new에 대한 액세스 권한을 계정 444455556666에 부여하기 위해 계정 111122223333은 다음 AWS CLI add-permission 명령을 사용합니다. 명령은 가독성을 위해 형식이 지정되었습니다.

$ aws --profile perf-test lambda add-permission --function-name external-hms-service-new --region us-east-1 --statement-id Id-ehms-invocation2 --action "lambda:InvokeFunction" --principal arn:aws:iam::444455556666:user/perf1-test { "Statement": "{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}" }

Lambda 권한을 확인하려면 다음 예제와 같이 get-policy 명령을 사용합니다. 명령은 가독성을 위해 형식이 지정되었습니다.

$ aws --profile perf-test lambda get-policy --function-name arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new --region us-east-1 { "RevisionId": "711e93ea-9851-44c8-a09f-5f2a2829d40f", "Policy": "{\"Version\":\"2012-10-17\", \"Id\":\"default\", \"Statement\":[{\"Sid\":\"Id-ehms-invocation2\", \"Effect\":\"Allow\", \"Principal\":{\"AWS\":\"arn:aws:iam::444455556666:user/perf1-test\"}, \"Action\":\"lambda:InvokeFunction\", \"Resource\":\"arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new\"}]}" }

권한을 추가한 후, 카탈로그 ehms를 정의할 때 다음과 같이 us-east-1에서 Lambda 함수의 전체 ARN을 사용할 수 있습니다.

arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new

교차 리전 호출에 대한 자세한 내용은 이 주제의 앞부분에 있는 리전 간 Lambda 호출을 참조하세요.

데이터에 대한 교차 계정 액세스 권한 부여

Athena 쿼리를 실행하려면 먼저 Amazon S3의 데이터에 대한 계정 간 액세스 권한을 부여해야 합니다. 이 작업을 다음 중 한 가지 방법으로 수행할 수 있습니다.

  • Amazon S3 버킷의 액세스 제어 목록 정책을 정식 사용자 ID로 업데이트합니다.

  • 계정 간 액세스를 Amazon S3 버킷 정책에 추가합니다.

예를 들어 다음 정책을 계정 111122223333의 Amazon S3 버킷 정책에 추가하여 계정 444455556666이 지정된 Amazon S3 위치에서 데이터를 읽을 수 있도록 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234567890123", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444455556666:user/perf1-test" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::athena-test/lambda/dataset/*" } ] }
참고

데이터뿐만 아니라 Amazon S3 유출 위치에도 Amazon S3에 대한 계정 간 액세스 권한을 부여해야 할 수도 있습니다. 응답 객체의 크기가 지정된 임계값을 초과하면 Lambda 함수는 여분의 데이터를 유출 위치로 분산합니다. 샘플 정책에 대한 이 주제의 시작 부분을 참조하세요.

현재 예제에서, 교차 계정 액세스가 444455556666,에 부여된 후 444455556666은 자체 account의 카탈로그 ehms를 사용하여 계정 111122223333에 정의된 테이블을 쿼리할 수 있습니다.

다음 예제에서 SQL Workbench 프로필 perf-test-1은 계정 444455556666에 대한 것입니다. 쿼리는 카탈로그 ehms를 사용하여 계정 111122223333의 Amazon S3 데이터 및 Hive 메타스토어에 액세스합니다.

SQL Workbench의 여러 계정에서 Hive 메타스토어 및 Amazon S3 데이터에 액세스.