기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 버킷에 액세스할 수 있는 권한
제한 사항
DynamoDB 테이블을 쿼리하는 데는 비용이 듭니다. 몇 기가바이트(GBs)를 초과하는 테이블 크기는 비용이 많이 들 수 있습니다. 전체 테이블 SCAN 작업을 수행하기 전에 비용을 고려하는 것이 좋습니다. 자세한 내용은 Amazon DynamoDB 요금SELECT * FROM table1 LIMIT 10
). 또한 프로덕션 환경에서 JOIN 또는 GROUP BY 쿼리를 수행하기 전에 테이블 크기를 고려하세요. 테이블이 너무 크면 테이블을 Amazon S3로 마이그레이션
아키텍처
다음 다이어그램은 사용자가 Athena에서 DynamoDB 테이블에서 SQL 쿼리를 실행하는 방법을 보여줍니다.
이 다이어그램은 다음 워크플로를 보여줍니다.
DynamoDB 테이블을 쿼리하려면 사용자가 Athena에서 SQL 쿼리를 실행합니다.
Athena는 Lambda 함수를 시작합니다.
Lambda 함수는 DynamoDB 테이블의 요청된 데이터를 쿼리합니다.
DynamoDB는 요청된 데이터를 Lambda 함수에 반환합니다. 그런 다음 함수는 Athena를 통해 쿼리 결과를 사용자에게 전송합니다.
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는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.
에픽
작업 | 설명 | 필요한 기술 |
---|---|---|
첫 번째 샘플 테이블을 생성합니다. |
| 개발자 |
첫 번째 테이블에 샘플 데이터를 삽입합니다. |
| 개발자 |
두 번째 샘플 테이블을 생성합니다. |
| 개발자 |
두 번째 테이블에 샘플 데이터를 삽입합니다. |
| 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
데이터 소스 커넥터를 설정합니다. | DynamoDB용 데이터 소스를 생성한 다음 Lambda 함수를 생성하여 해당 데이터 소스에 연결합니다.
| 개발자 |
Lambda 함수가 S3 유출 버킷에 액세스할 수 있는지 확인합니다. |
오류가 발생하는 경우 이 패턴의 추가 정보 섹션에서 지침을 참조하세요. | 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
DynamoDB 테이블을 쿼리합니다. |
| 개발자 |
두 DynamoDB 테이블을 조인합니다. | DynamoDB는 데이터 스토어 없음SQL이며 SQL 조인 작업을 지원하지 않습니다. 따라서 두 DynamoDB 테이블에서 조인 작업을 수행해야 합니다.
| 개발자 |
관련 리소스
추가 정보
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}
만 사용하여 새로 생성하세요.