CDK로 Athena 저장된 쿼리를 생성하는 방법의 예

6345 단어 awsathenaawscdkaws
In Post는 DynamoDb 테이블의 현재 데이터를 가져오는 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


overview

전개하다

cd cdkQUICKSIGHT_USERNAME=<<Quicksight user name>> npx cdk deploy

설명


자세한 내용은 여기를 참조하십시오.

경고


⚠️ 테스트 후 파기하는 것을 잊지 마세요.
  • Kinesis Data Streams는 시간당 costs
  • Quicksight는 무료 평가판
  • 이후에 costs


    View on GitHub

    좋은 웹페이지 즐겨찾기