Amazon Redshift Serverless を AWS CDK で構築してみる - 2022.08.31 nakanoshima.dev #29 LED-2!! (Let’s enjoy データ分析!!) -
nakanoshima.dev #29 LED-2!! (Letʼs enjoy データ分析!!)2022.08.31Amazon Redshift Serverlessを AWS CDK で構築してみる
View Slide
藤原 吉規Amazon Web Services Japan, ⼤阪Snr. Solutions Architect好きな AWS サービス:- AWS CDK- AWS Support
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Amazon Redshift Serverless
© 2022, Amazon Web Services, Inc. or its affiliates.処理能⼒は動的に⾃動で管理AmazonRedshiftServerlessJDBC/ODBCDatasharingclustersData APIComputeStorage AccelerationOperationalDatabasesQuery LiveDataIncremental MVsIntelligent anddynamic compute managementAmazonSagemakerRedshiftMLRedshiftManagedStorageAmazon S3ML-basedworkload monitoringAutomatic tuningAutomatic scalingAutomaticworkload managementPay for usePerformance at scaleAutomatic maintenance4
© 2022, Amazon Web Services, Inc. or its affiliates.エンドポイントへ接続すれば、これまで通りに利⽤可能アプリケーションをシンプルにAmazon Redshift Serverless endpoint へ接続すれば、すぐに実⾏可能Amazon Redshift SQL のすべての機能が利⽤可能Security and user managementComplex joinsSemi-structured dataData sharingMachine learning functionsAmazon Redshift Data APIJDBC/ODBCTools YourapplicationsAmazon S3data lakeAmazon Redshift ServerlessIntelligent and dynamiccompute managementML-basedworkload monitoringAutomatic tuningAutomatic scalingAutomaticworkload managementPay for usePerformance at scaleAutomatic maintenanceAWS Lambda, AWS Cloud9, Java, Go,PowerShell, Node.js, C#, Python, and RubyAmazon Redshiftmanaged storageAmazon Aurora/RDS databasesData lake queriesFederated queryDurability andtransactional guaranteesJDBC/ODBC and Data APIAnd more5
© 2022, Amazon Web Services, Inc. or its affiliates.Serverless は簡単に始められるAWS アカウントで、AmazonRedshift Serverless 使⽤開始画⾯へ1デフォルト設定を確認して保存数分で利⽤可能に26お好みのツール、または Amazon RedshiftQuery Editor で接続3
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift Serverless を AWS CDKで構築してみる
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATEDCDK で Redshift Serverless を構築: 全体像Virtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceENI: RedshiftNetworkInterface・・・S3 VPC GatewayEndpointRedshift VPC Endpoint InterfaceAmazon Redshift ServerlessNamespace WorkgroupAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
AWS Cloud Development Kit (CDK)Your languageJust classes and methodsAutoCompleteInline documentationSane defaultsReusable classes
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet A事前構築済みの VPCVirtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceS3 VPC GatewayEndpointAmazon S3BucketsBastionSecurity group
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATEDRedshift Serverless に必要なリソースを事前作成Virtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceS3 VPC GatewayEndpointAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.AWS Secrets Manager SecretNamespace AdminUserName, AdminPassword// Secrets Manager Secret for Redshift Serverless Namespaceconst redshiftserverlessAdminSecret = new secretmanager.Secret(this, 'RedshiftserverlessAdminSecret', {generateSecretString: {secretStringTemplate: JSON.stringify({ username: 'admin'}),generateStringKey: 'password’,excludeCharacters: '/@" \\\’’,passwordLength: 32,}});
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.IAM RoleNamespace// IAM Role/Policy for Redshift Serverless Namesapceconst redshiftserverlessNamesapceRole = new iam.Role(this, 'RedshiftServerlessNamesapceRole', {assumedBy: new iam.CompositePrincipal(new iam.ServicePrincipal('sagemaker.amazonaws.com'),new iam.ServicePrincipal('redshift.amazonaws.com’),new iam.ServicePrincipal('redshift-serverless.amazonaws.com’),),managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonRedshiftAllCommandsFullAccess’),],});https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/default-iam-role.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.IAM RoleNamespaceredshiftserverlessNamesapceRole.addToPolicy(new iam.PolicyStatement({actions: ["s3:GetObject","s3:GetBucketAcl","s3:GetBucketCors","s3:GetEncryptionConfiguration","s3:GetBucketLocation","s3:ListBucket","s3:ListAllMyBuckets","s3:ListMultipartUploadParts","s3:ListBucketMultipartUploads","s3:PutObject","s3:PutBucketAcl",……"s3:PutBucketCors","s3:DeleteObject","s3:AbortMultipartUpload","s3:CreateBucket"],effect: iam.Effect.ALLOW,resources: ["arn:aws:s3:::redshift/*","arn:aws:s3:::redshift"]}));
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.AWS KMS keyNamespace// Redshift Serverless KMS Keyconst redshiftserverlessKmsKey = new kms.Key(this, 'RedshiftserverlessKmsKey', {enabled: true,enableKeyRotation: true,});
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATEDNameSpace, Workgroup を作成Virtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceS3 VPC GatewayEndpointAmazon Redshift ServerlessNamespaceAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439Workgroup
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift Serverless Namespace と WorkgroupNamespace: 名前空間名前空間は、データベースオブジェクトとユーザーのコレクションです。ストレージ関連の名前空間は、スキーマ、テーブル、ユーザー、またはデータを暗号化するための AWS Key Management Serviceキーをグループ化します。ストレージプロパティには、管理者ユーザーのデータベース名とパスワード、権限、暗号化およびセキュリティが含まれます。名前空間の下にグループ化されたリソースには、データ共有、復旧ポイント、使⽤制限などもありますhttps://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-workgroup-namespace.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift Serverless Namespace と WorkgroupWorkgroup: ワークグループワークグループは、コンピューティングリソースの集合です。コンピューティング関連のワークグループは、RPU、VPC サブネットグループ、セキュリティグループなどのコンピューティングリソースをグループ化します。ワークグループのプロパティには、ネットワークとセキュリティ設定が含まれます。ワークグループの下にグループ化されたリソースには、アクセス制限と使⽤制限もあります。https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-workgroup-namespace.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift ServerlessNamespace// Redshift Serverless Namespaceconst cfnNamespace = new redshiftserverless.CfnNamespace(this, 'RedshiftServerlessNamespace', {namespaceName: 'default’,adminUsername: redshiftserverlessAdminSecret.secretValueFromJson('username').unsafeUnwrap(),adminUserPassword: redshiftserverlessAdminSecret.secretValueFromJson('password').unsafeUnwrap(),dbName: 'dev’,defaultIamRoleArn: redshiftserverlessNamesapceRole.roleArn,iamRoles: [redshiftserverlessNamesapceRole.roleArn],kmsKeyId: redshiftserverlessKmsKey.keyId,logExports: ['userlog','connectionlog','useractivitylog'],});https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_redshiftserverless.CfnNamespace.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift ServerlessWorkgroup// Redshift Serverless Workgroupconst cfnWorkgroup = new redshiftserverless.CfnWorkgroup(this, 'RedshiftServerlessWorkgroup', {workgroupName: 'default’,baseCapacity: 32,configParameters: […],enhancedVpcRouting: true,namespaceName: cfnNamespace.namespaceName,publiclyAccessible: false,securityGroupIds: [redshiftserverlessSecurityGroup.securityGroupId],subnetIds: vpc.selectSubnets({subnetGroupName: 'Database'}).subnetIds,});cfnWorkgroup.addDependsOn(cfnNamespace);https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_redshiftserverless.CfnWorkgroup.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.ベースRPU容量の設定• クラスターの性能管理はRPUのBasecapacity(ベース RPU 容量の編集)で⾏う• RPUのBase capacityはデフォルトではAutoとなっており、これは128と同等。Base capacityは32〜512まで8刻みで変更が可能• Base capacityを変更すると、⼀時的に(数分)Serverlessは利⽤不可となる
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Redshift ServerlessConfigParameterPropertyconfigParameters: [{parameterKey: 'search_path’,parameterValue: '$user’,},{parameterKey: 'enable_user_activity_logging’,parameterValue: 'true’,},{parameterKey: 'datestyle’,parameterValue: 'ISO,MDY’,},……{parameterKey: 'query_group’,parameterValue: 'adhoc’,},{parameterKey: 'max_query_execution_time’,parameterValue: '3600’,},],…https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_redshiftserverless.CfnWorkgroup.ConfigParameterProperty.html
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.使用制限・クエリの制限の管理• RPUの利⽤上限を設けることができる• ただしこれはどちらかというとコストコントロールのための機能で、例えば利⽤するRPUのレンジを決める(32~64の間で使ってほしいなど)機能ではない• ⽇次/週次/⽉次で、最⼤何RPU-時まで使うかの上限を決め、超えた場合はアラートを上げる、システムテーブルへログ記録、クエリを⽌める、のいずれかを選択する• 同様に、クロスリージョンデータ共有のデータ転送量も使⽤制限の設定が可能になっている• それぞれ最⼤4つの制限を設定可能• 使⽤制限とは別に、クエリの実⾏制限として、実⾏時間(秒)でのタイムアウト設定を1つだけ設けることができる
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATEDRedshift Serverless 起動後Virtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceENI: RedshiftNetworkInterfaceS3 VPC GatewayEndpointRedshift VPC Endpoint InterfaceAmazon Redshift ServerlessNamespace WorkgroupAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.ネットワークインターフェイスアイドル時クエリ実⾏時: BaseCapacity 32
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : CIDR /24ネットワークインターフェイスVirtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceENI: RedshiftNetworkInterface・・・S3 VPC GatewayEndpointRedshift VPC Endpoint InterfaceAmazon Redshift ServerlessNamespace WorkgroupAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATED拡張 VPC ルーティング: COPY, UNLOADVirtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceENI: RedshiftNetworkInterface・・・S3 VPC GatewayEndpointRedshift VPC Endpoint InterfaceAmazon Redshift ServerlessNamespace WorkgroupAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.Availability Zone CAvailability Zone BAvailability Zone AIngress subnet A Application subnet ADatabase subnet A : ISOLATEDまとめVirtual Private Cloud (VPC)AWS CloudNAT gateway Bastion EC2 InstanceENI: RedshiftNetworkInterface・・・S3 VPC GatewayEndpointRedshift VPC Endpoint InterfaceAmazon Redshift ServerlessNamespace WorkgroupAmazon S3BucketsAWS KMS keyNamespaceAWS Secrets Manager SecretNamespaceAdminUsername, PasswordIAM RoleNamespaceBastionSecurity groupRedshift ServerlessSecurity groupTCP: 5439
© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.© 2022, Amazon Web Services, Inc. or its Affiliates. All rights reserved.THANK YOU!