Athena를 사용한 Amazon DynamoDB 테이블 액세스, 쿼리 및 조인 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Athena를 사용한 Amazon DynamoDB 테이블 액세스, 쿼리 및 조인

작성자: Moinul Al-Mamun(AWS)

환경: 프로덕션

기술: 분석, 데이터베이스, 서버리스

AWS 서비스: Amazon Athena , Amazon DynamoDB , AWS Lambda, Amazon S3

요약

이 패턴은 Amazon Athena DynamoDB 커넥터를 사용하여 Amazon Athena와 Amazon DynamoDB 간의 연결을 설정하는 방법을 보여줍니다. 커넥터는 AWS Lambda 함수를 사용하여 DynamoDB 의 데이터를 쿼리합니다. 연결을 설정하기 위해 코드를 작성할 필요가 없습니다. 연결이 설정되면 Athena Federated Query를 사용하여 Athena에서 SQL 명령을 실행하여 DynamoDB 테이블에 빠르게 액세스하고 분석할 수 있습니다. 또한 하나 이상의 DynamoDB 테이블을 서로 조인하거나 Amazon Redshift 또는 Amazon Aurora와 같은 다른 데이터 소스에 조인할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • DynamoDB 테이블, Athena 데이터 소스, Lambda 및 AWS Identity and Access Management(IAM) 역할을 관리할 수 있는 권한이 있는 활성 AWS 계정

  • Athena가 쿼리 결과를 저장할 수 있는 Amazon Simple Storage Service(S3) 버킷

  • Athena DynamoDB 커넥터가 데이터를 단기간에 저장할 수 있는 S3 버킷

  • Athena 엔진 버전 2를 지원하는 AWS 리전

  • IAM Athena 및 필요한 S3 버킷에 액세스할 수 있는 권한

  • Amazon Athena DynamoDB 커넥터, 설치됨

제한 사항

DynamoDB 테이블을 쿼리하는 데는 비용이 듭니다. 몇 기가바이트(GBs)를 초과하는 테이블 크기는 비용이 많이 들 수 있습니다. 전체 테이블 SCAN 작업을 수행하기 전에 비용을 고려하는 것이 좋습니다. 자세한 내용은 Amazon DynamoDB 요금을 참조하세요. 비용을 절감하고 높은 성능을 달성하려면 항상 쿼리LIMIT에 를 사용하는 것이 좋습니다(예: SELECT * FROM table1 LIMIT 10). 또한 프로덕션 환경에서 JOIN 또는 GROUP BY 쿼리를 수행하기 전에 테이블 크기를 고려하세요. 테이블이 너무 크면 테이블을 Amazon S3로 마이그레이션하는 등의 대체 옵션을 고려해 보세요.

아키텍처

다음 다이어그램은 사용자가 Athena에서 DynamoDB 테이블에서 SQL 쿼리를 실행하는 방법을 보여줍니다.

Athena와 DynamoDB를 연결하여 SQL 쿼리를 실행하기 위한 워크플로입니다.

이 다이어그램은 다음 워크플로를 보여줍니다.

  1. DynamoDB 테이블을 쿼리하려면 사용자가 Athena에서 SQL 쿼리를 실행합니다.

  2. Athena는 Lambda 함수를 시작합니다.

  3. Lambda 함수는 DynamoDB 테이블의 요청된 데이터를 쿼리합니다.

  4. DynamoDB는 요청된 데이터를 Lambda 함수에 반환합니다. 그런 다음 함수는 Athena를 통해 쿼리 결과를 사용자에게 전송합니다.

  5. Lambda 함수는 S3 버킷에 데이터를 저장합니다.

기술 스택

  • Amazon Athena

  • Amazon DynamoDB

  • Amazon S3

  • AWS Lambda

도구

  • Amazon Athena는 표준 를 사용하여 Amazon S3에서 직접 데이터를 분석하는 데 도움이 되는 대화형 쿼리 서비스입니다SQL.

  • Amazon Athena DynamoDB 커넥터는 Athena가 DynamoDB에 연결하고 SQL 쿼리를 사용하여 테이블에 액세스할 수 있도록 하는 AWS 도구입니다.

  • Amazon DynamoDB는 빠르고 예측 가능하며 확장 가능한 성능을 제공하는 완전 관리형 데이터베이스 없음SQL 서비스입니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

에픽

작업설명필요한 기술

첫 번째 샘플 테이블을 생성합니다.

  1. AWS 관리 콘솔에 로그인하고 DynamoDB 콘솔 을 엽니다.

  2. 테이블 생성을 선택합니다.

  3. 테이블 이름dydbtable1을 입력합니다.

  4. 파티션 키 에 를 입력합니다PK1.

  5. 정렬 키에는 SK1을 입력합니다.

  6. 테이블 설정 섹션에서 사용자 지정 설정을 선택합니다.

  7. 테이블 클래스 섹션에서 DynamoDB 표준을 선택합니다.

  8. 읽기/쓰기 용량 설정 섹션의 용량 모드에서 온디맨드를 선택합니다.

  9. 저장된 암호화 섹션에서 Amazon DynamoDB 소유를 선택합니다.

  10. 테이블 생성을 선택합니다.

개발자

첫 번째 테이블에 샘플 데이터를 삽입합니다.

  1. DynamoDB 콘솔을 엽니다.

  2. 탐색 창에서 테이블을 선택한 다음 이름 열에서 테이블을 선택합니다.

  3. 작업을 선택한 다음 아이템 생성을 선택합니다.

  4. JSON 보기 를 선택합니다.

  5. 속성 편집기의 제목 표시줄에서 View DynamoDB JSON를 끕니다.

  6. 속성 편집기에서 다음 샘플 데이터를 하나씩 입력합니다.

{ "PK1": "1234", "SK1": "info", "Salary": "5000" }
{ "PK1": "1235", "SK1": "info", "Salary": "5200" }
개발자

두 번째 샘플 테이블을 생성합니다.

  1. DynamoDB 콘솔을 엽니다.

  2. 테이블 생성을 선택합니다.

  3. 테이블 이름dydbtable2을 입력합니다.

  4. 파티션 키(Partition key)PK2를 입력합니다.

  5. 정렬 키에는 SK2을 입력합니다.

  6. 테이블 설정 섹션에서 사용자 지정 설정을 선택합니다.

  7. 테이블 클래스 섹션에서 DynamoDB 표준을 선택합니다.

  8. 읽기/쓰기 용량 설정 섹션의 용량 모드에서 온디맨드를 선택합니다.

  9. 저장된 암호화 섹션에서 Amazon DynamoDB 소유를 선택합니다.

  10. 테이블 생성을 선택합니다.

개발자

두 번째 테이블에 샘플 데이터를 삽입합니다.

  1. DynamoDB 콘솔을 엽니다.

  2. 탐색 창에서 테이블을 선택한 다음 이름 열에서 테이블을 선택합니다.

  3. 작업을 선택한 다음 아이템 생성을 선택합니다.

  4. 속성 편집기의 제목 표시줄에서 View DynamoDB JSON를 끕니다.

  5. 속성 편집기에서 다음 샘플 데이터를 하나씩 입력합니다.

{ "PK2": "1234", "SK2": "bonus", "Bonus": "500" }
{ "PK2": "1235", "SK2": "bonus", "Bonus": "1000" }
개발자
작업설명필요한 기술

데이터 소스 커넥터를 설정합니다.

DynamoDB용 데이터 소스를 생성한 다음 Lambda 함수를 생성하여 해당 데이터 소스에 연결합니다.

  1. AWS 관리 콘솔에 로그인하고 Athena 콘솔 을 엽니다.

  2. 탐색 창에서 데이터 소스를 선택한 다음 데이터 소스 생성을 선택합니다.

  3. Amazon DynamoDB 데이터 소스를 선택한 후 다음을 선택합니다.

  4. 데이터 소스 세부 정보 섹션의 데이터 소스 이름 testDynamoDB 를 입력합니다.

  5. 연결 세부 정보 섹션에서 이미 배포된 Lambda 함수를 선택하거나, 이 패턴에 사용할 Lambda 함수가 없는 경우 Lambda 함수 생성을 선택합니다. 참고: Lambda 함수 생성에 대한 자세한 내용은 Lambda 개발자 안내서의 Lambda 시작하기를 참조하세요.

  6. (선택 사항) Lambda 함수 생성을 선택한 경우 해당 스택을 배포하기 전에 Java 애플리케이션에 포함된 AWS CloudFormation 템플릿을 구성해야 합니다. 템플릿에는 ApplicationName, SpillBucket AthenaCatalogName, 및 기타 애플리케이션 설정이 포함됩니다. 참고: 이 Java 기반 애플리케이션을 배포한 후 스택은 Athena가 DynamoDB와 통신할 수 있도록 Lambda 함수를 생성합니다. 이렇게 하면 SQL 명령을 통해 테이블에 액세스할 수 있습니다.

  7. Lambda 함수를 배포합니다.

  8. 다음을 선택합니다.

개발자

Lambda 함수가 S3 유출 버킷에 액세스할 수 있는지 확인합니다.

  1. Lambda 콘솔을 엽니다.

  2. 탐색 창에서 함수를 선택한 후, 앞서 생성한 함수를 선택합니다.

  3. 구성 탭을 선택합니다.

  4. 왼쪽 창에서 환경 변수를 선택한 다음 키 값이 spill_bucket인지 확인합니다.

  5. 왼쪽 창에서 권한 을 선택한 다음 실행 역할 섹션에서 연결된 IAM 역할을 선택합니다. 참고: IAM 콘솔에서 Lambda 함수에 연결된 IAM 역할로 이동합니다.

  6. spill_bucket 버킷에 대한 쓰기 권한이 있는지 확인하세요.

오류가 발생하는 경우 이 패턴의 추가 정보 섹션에서 지침을 참조하세요.

개발자
작업설명필요한 기술

DynamoDB 테이블을 쿼리합니다.

  1. AWS 관리 콘솔에 로그인하고 Athena 콘솔 을 엽니다.

  2. 탐색 창에서 데이터 소스를 선택한 다음 데이터 소스 생성을 선택합니다.

  3. 탐색 창에서 쿼리 편집기를 선택합니다.

  4. 편집기 탭의 데이터 섹션에서 데이터 소스데이터 소스의 데이터 소스를 선택합니다.

  5. 데이터베이스에서 데이터베이스를 선택합니다.

  6. 쿼리 1에 SELECT * FROM dydbtable1 t1; 다음 쿼리를 입력합니다.

  7. 실행을 선택한 다음 테이블에서 출력을 확인합니다.

  8. 쿼리 2에 SELECT * FROM dydbtable2 t2; 다음 쿼리를 입력합니다.

  9. 실행을 선택한 다음 테이블에서 출력을 확인합니다.

개발자

두 DynamoDB 테이블을 조인합니다.

DynamoDB는 데이터 스토어 없음SQL이며 SQL 조인 작업을 지원하지 않습니다. 따라서 두 DynamoDB 테이블에서 조인 작업을 수행해야 합니다.

  1. 더하기 아이콘을 선택하여 새 쿼리를 생성합니다.

  2. 쿼리 3에는 다음 쿼리를 입력합니다.

SELECT pk1, salary, bonus FROM dydbtable1 t1 JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;
개발자

관련 리소스

추가 정보

Athena에서 {bucket_name}/folder_name/ 형식의 spill_bucket을(를) 사용하여 쿼리를 실행하면 다음과 같은 오류 메시지가 나타날 수 있습니다.

"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://amzn-s3-demo-bucket/athena_dynamodb_spill_data/] This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: [query-id]"

이 오류를 해결하려면 Lambda 함수의 환경 변수를 spill_bucket로 업데이트{bucket_name_only}한 다음 버킷 쓰기 액세스에 대한 다음 Lambda IAM 정책을 업데이트합니다.

{ "Action": [ "s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation", "s3:GetObjectVersion", "s3:PutObject", "s3:PutObjectAcl", "s3:GetLifecycleConfiguration", "s3:PutLifecycleConfiguration", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::spill_bucket", "arn:aws:s3:::spill_bucket/*" ], "Effect": "Allow" }

또는 이전에 만든 Athena 데이터 소스 커넥터를 제거하고 spill_bucket{bucket_name}만 사용하여 새로 생성하세요.