CDK로 생성된 Quicksight(S3 소스)로 DynamoDB 항목 변경 사항을 시각화하는 방법의 예

이 게시물은 Quicksight를 사용하여 DynamoDb 데이터 변경 사항을 시각화하는 방법에 대한 것입니다. Athena로 데이터를 분석하는 방법을 설명하는 게시물의 확장입니다. DynamoDb 테이블을 생성하고 데이터 변경 사항을 S3 버킷에 저장하는 설정은 동일합니다. S3 버킷에 있는 데이터의 Athena 테이블을 생성하는 대신 이 데이터가 Quicksight의 데이터 원본에 연결됩니다.

Quicksight 활성화 및 비용



사용하기 전에 Quicksight를 활성화해야 합니다. 이 시나리오에서는 표준판을 사용하는 것으로 충분합니다. 처음 30일은 free입니다. 비용이 나열됩니다here.







이름과 이메일 주소를 입력하세요



퀵사이트 역할



standard edition 에서 Quicksight는 Quicksight 콘솔을 통해 구성할 수 있는 표준 역할을 사용합니다.



안타깝게도 특정 KMS 키를 허용하는 것은 불가능합니다. 이를 위해 aws-quicksight-service-role-v0 역할에 정책을 추가해야 합니다.

This 해당 역할에 필요한 권한을 광고합니다.

import { Construct } from 'constructs'
import { aws_iam as iam, aws_s3 as s3 } from 'aws-cdk-lib'

export interface QuicksightRoleProps {
  name: string
  bucket: s3.IBucket
}

export class QuicksightRole extends Construct {
  constructor(scope: Construct, id: string, props: QuicksightRoleProps) {
    super(scope, id)

    const quicksightRoleName = 'aws-quicksight-service-role-v0'

    const quicksightRole = iam.Role.fromRoleName(this, 'quicksight-role', quicksightRoleName)

    quicksightRole.attachInlinePolicy(
      new iam.Policy(this, `${props.name}-policy`, {
        statements: [
          new iam.PolicyStatement({
            actions: ['kms:Decrypt', 's3:GetObject', 's3:List*'],
            resources: [props.bucket.bucketArn, `${props.bucket.bucketArn}/*`, props.bucket.encryptionKey!.keyArn],
          }),
        ],
      })
    )
  }
}


이제 S3 버킷에서 데이터 소스를 생성할 수 있습니다.

데이터 소스 및 데이터 세트 만들기



Quicksight에서 데이터 소스는 데이터에 대한 연결이며 데이터 세트는 이 데이터 소스를 사용하고 데이터 사용 방법을 정의합니다.

Quicksight에는 다양한 데이터 소스가 있습니다. S3의 데이터를 사용하려고 합니다.



현재 데이터 소스에 대한 L2 CDK 구성이 없으므로 L1 클라우드 형성을 사용해야 합니다.

S3 데이터 소스의 경우 매니페스트 파일에 대한 링크입니다.

const datasource = new quicksightCfn.CfnDataSource(this, 'datasource', {
      name: datasourceName,
      type: 'S3',
      awsAccountId: Stack.of(this).account,
      dataSourceId: datasourceName,
      dataSourceParameters: {
        s3Parameters: {
          manifestFileLocation: {
            bucket: props.bucket.bucketName,
            key: manifestKey,
          },
        },
      },
      permissions: permissionsDatasource,
    })


이것이 매니페스트 파일의 정의입니다. 매니페스트 파일에 대한 추가 정보here

const manifest = {
      fileLocations: [
        {
          URIPrefixes: [`s3://${props.bucket.bucketName}/${props.prefix}/`],
        },
      ],
      globalUploadSettings: {
        format: 'JSON',
      },
    }


그런 다음 데이터 세트는 사용할 필드를 정의하고 이러한 필드를 형식화할 가능성이 있습니다.

const dataset = new quicksightCfn.CfnDataSet(this, 'dataset', {
      name: datasetName,
      awsAccountId: Stack.of(this).account,
      dataSetId: datasetName,
      importMode: 'SPICE',
      physicalTableMap: {
        itemChanges: {
          s3Source: {
            dataSourceArn: datasource.attrArn,
            uploadSettings: {
              format: 'JSON',
            },
            inputColumns: [
              {
                name: 'awsRegion',
                type: 'STRING',
              },
              {
                name: 'eventID',
                type: 'STRING',
              },
              {
                name: 'eventName',
                type: 'STRING',
              },
              {
                name: 'userIdentity',
                type: 'STRING',
              },
              {
                name: 'recordFormat',
                type: 'STRING',
              },
              {
                name: 'tableName',
                type: 'STRING',
              },
              {
                name: 'dynamodb.ApproximateCreationDateTime',
                type: 'STRING',
              },
              {
                name: 'dynamodb.Keys.pk.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.pk.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.jobArea.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.firstname.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.gender.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.jobType.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.jobDescriptor.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.NewImage.person.M.lastname.S',
                type: 'STRING',
              },
              {
                name: 'dynamodb.SizeBytes',
                type: 'STRING',
              },
              {
                name: 'eventSource',
                type: 'STRING',
              },
            ],
          },
        },
      },
      logicalTableMap: {
        logicalTableProperty: {
          alias: `${datasetName}-alias`,
          source: { physicalTableId: 'itemChanges' },
        },
      },
      permissions: permissionsDataset,
    });


전체 정의는 here입니다.

Here는 Python CDK로 설명하는 게시물입니다.

데이터 소스 및 데이터 세트를 볼 수 있는 권한



데이터 소스 및 데이터 세트는 사용자에게 권한이 있는 경우에만 표시됩니다. CDK를 사용하여 배포하는 경우에는 자동으로 발생하지 않습니다. 따라서 사용자 ARN을 권한에 넣어야 합니다. 이를 수행하는 한 가지 방법은 환경 변수를 사용하는 것입니다.
QUICKSIGHT_USERNAME=<<Quicksight user name>> npx cdk deploy
const quicksightUsername = process.env.QUICKSIGHT_USERNAME
    const principalArn = `arn:aws:quicksight:${Stack.of(this).region}:${Stack.of(this).account}:user/default/${quicksightUsername}`

    const permissionsDatasource = [
      {
        principal: principalArn,
        actions: [
          'quicksight:DescribeDataSource',
          'quicksight:DescribeDataSourcePermissions',
          'quicksight:PassDataSource',
          'quicksight:UpdateDataSource',
          'quicksight:DeleteDataSource',
          'quicksight:UpdateDataSourcePermissions',
        ],
      },
    ]

    const permissionsDataset = [
      {
        principal: principalArn,
        actions: [
          'quicksight:DescribeDataSet',
          'quicksight:DescribeDataSetPermissions',
          'quicksight:PassDataSet',
          'quicksight:DescribeIngestion',
          'quicksight:ListIngestions',
          'quicksight:UpdateDataSet',
          'quicksight:DeleteDataSet',
          'quicksight:CreateIngestion',
          'quicksight:CancelIngestion',
          'quicksight:UpdateDataSetPermissions',
        ],
      },
    ]


여기에서 Quicksight 사용자 이름을 찾을 수 있습니다.


데이터 세트의 배포 및 새로 고침



이 설정을 처음으로 배포하는 경우 데이터는 존재하지 않지만 데이터 원본은 이미 데이터에 연결되어 있습니다. 배포 오류가 발생합니다. 이를 방지하기 위해 CDK 사용자 지정 리소스의 SDK 호출과 함께 작은 더미 데이터 파일이 배포됩니다.

const dummyJsonString = JSON.stringify({ dummy: 'dummy'}); // Delete after deplyoment
    const customResourcePutObject = new custom_resources.AwsCustomResource(this, 'prefix-creation', { // add -put
      onCreate: {
        service: 'S3',
        action: 'putObject',
        parameters: {
          Bucket: props.bucket.bucketName,
          Key: `${props.prefix}/dummy.json`,
          Body: dummyJsonString,
        },
        physicalResourceId: custom_resources.PhysicalResourceId.of('prefix-creation'),
      },
      policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({ resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE }),
    });
    props.


데이터 소스가 배포된 후 제거됩니다.

const customResourceDeleteObject = new custom_resources.AwsCustomResource(this, 'prefix-creation-delete', {
      onCreate: {
        service: 'S3',
        action: 'deleteObject',
        parameters: {
          Bucket: props.bucket.bucketName,
          Key: `${props.prefix}/dummy.json`,
        },
        physicalResourceId: custom_resources.PhysicalResourceId.of('prefix-creation'),
      },
      policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({ resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE }),
    });
    props.bucket.grantReadWrite(customResourceDeleteObject);
    customResourceDeleteObject.node.addDependency(dataset);


dynamodb에 일부 데이터가 있으면 데이터 세트를 새로 고쳐야 합니다. 5개의 새 항목을 생성한 다음 1개를 수정하고 다시 새로 고치고 이 데이터를 분석에 사용하는 경우의 모습입니다.










비용 경고 💰



⚠️ 테스트 후 Quicksight 계정을 삭제하는 것을 잊지 마십시오.


암호




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

    좋은 웹페이지 즐겨찾기