CDK로 Athena 저장된 쿼리를 생성하는 방법의 예
이 게시물에서는 이 쿼리를 Athena에 저장된 쿼리로 CDK와 함께 제공하여 쿼리가 편집기 "근처"에 저장되도록 하고 쿼리가 DB 및 테이블의 이름 지정과 관련하여 현재 배포에 적합하도록 하는 방법을 설명합니다. 또 다른 이점은 쿼리를 소스 제어하에 두는 것입니다.
포스팅의 연장입니다.
저장된 쿼리는 여기 콘솔에 저장됩니다.
SQL 명령
이 SQL 명령은 Athena에 저장된 쿼리로 제공됩니다. 더 쉬운 유지 관리를 위해 명령이 extra SQL file 에 있습니다. DB 및 테이블 이름은 파일의 자리 표시자이며 배포 프로세스 중에 대체됩니다. 이렇게 하면 이 SQL 명령이 역시 배포되는 올바른 리소스를 참조하는지 확인할 수 있습니다.
SELECT dynamodb.newimage.pk.s AS pk,
dynamodb.newimage.person.M.firstname.s AS firstname,
dynamodb.newimage.person.M.lastname.s AS lastname,
dynamodb.approximatecreationdatetime AS ts,
dynamodb.newimage,
*
FROM "athenaDbName"."athenaTableName" AS persons1
WHERE (eventname = 'INSERT'
OR eventname = 'MODIFY')
AND dynamodb.approximatecreationdatetime =
(SELECT MAX(dynamodb.approximatecreationdatetime)
FROM "athenaDbName"."athenaTableName" AS persons2
WHERE persons2.dynamodb.newimage.pk.s = persons1.dynamodb.newimage.pk.s);
저장된 쿼리 구성
SQL 파일과 마찬가지로 저장된 쿼리의 CDK 정의는 CDK 구문으로 extra file에 있습니다.
import { Construct } from 'constructs'
import {
aws_athena as athenaCfn
} from 'aws-cdk-lib'
import * as glue from '@aws-cdk/aws-glue-alpha'
import { readFileSync } from 'fs';
import { join } from 'path';
export interface SavedQueriesProps {
glueDb: glue.IDatabase;
athenaTableName: string;
athenaWorkgroupName: string;
}
export class SavedQueries extends Construct {
constructor(scope: Construct, id: string, props: SavedQueriesProps) {
super(scope, id)
const getSqlString = (file: string): string => {
let personsDdbStateSqlCommand = readFileSync(join(__dirname, `${file}`), 'utf-8').toString()
const athenaDbName = props.glueDb.databaseName
let athenaTableName = props.athenaTableName;
athenaTableName = athenaTableName.replace(/-/g, '_')
personsDdbStateSqlCommand = personsDdbStateSqlCommand.replace(/athenaDbName/g, athenaDbName)
personsDdbStateSqlCommand = personsDdbStateSqlCommand.replace(/athenaTableName/g, athenaTableName)
return personsDdbStateSqlCommand
}
let queryString = getSqlString('ddb-state.sql')
// eslint-disable-next-line no-new
new athenaCfn.CfnNamedQuery(this, 'query-current-ddb-state', {
database: props.glueDb.databaseName,
queryString: queryString,
description: 'query the current state from the ddb table',
name: 'current-ddb-state',
workGroup: props.athenaWorkgroupName
})
}
}
현재 CDK에는 명명된 쿼리에 대한 L2 Construct가 없으므로 L1 CFN 리소스(
CfnNamedQuery
)로 정의됩니다.여기에는 쿼리가 문자열로 필요합니다. 함수
getSqlString
는 SQL 파일 내용을 필요한 문자열로 변환합니다.따라서 자리 표시자가 배포된 리소스로 대체됩니다.
Athena 테이블 이름은 글루 크롤러 프로세스 중에 생성됩니다. 규칙은 대시("-") 대신 밑줄("_")로 S3 버킷의 접두사를 구성한 테이블 이름입니다.
데이터베이스 이름과 작업 그룹 이름은 스택에서 구문으로 전달됩니다.
저장된 쿼리 구조를 스택에 삽입
배포를 위해 저장된 쿼리 구성이 stack에 삽입됩니다.
필요한 정보는 구성에 소품으로 전달됩니다.
저장된 쿼리는 작업 그룹에 따라 다릅니다. 이는 CDK에서 정의되어야 합니다. 그렇지 않으면 배포가 실패합니다.
const savedQueries = new SavedQueries(this, 'saved-queries', {
glueDb: glueDb,
athenaTableName: firehoseBucketName,
athenaWorkgroupName: athenaWorkgroup.name,
})
savedQueries.node.addDependency(athenaWorkgroup);
결과
배포 후 새 쿼리가 여기에 나열되며 편집기에서 쿼리에 대해 선택할 수 있습니다.
암호
JohannesKonings / 테스트-aws-dynamodb-athena-cdk
AWS CDK로 생성된 Kinesis를 통해 Athena로 DynamoDB 데이터를 분석하는 방법의 예
테스트-aws-dynamodb-athena-cdk
전개하다
cd cdk
QUICKSIGHT_USERNAME=<<Quicksight user name>> npx cdk deploy
설명
자세한 내용은 여기를 참조하십시오.
경고
⚠️ 테스트 후 파기하는 것을 잊지 마세요.
View on GitHub
Reference
이 문제에 관하여(CDK로 Athena 저장된 쿼리를 생성하는 방법의 예), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/example-how-to-create-athena-saved-queries-with-cdk-3gp0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)