亚马逊红移构造库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
启动红移集群数据库
建立Redshift集群,定义 Cluster将在VPC中推出.
您可以指定一个 VPC, 否则将会创建 。 节点总是由私人子网启动,并默认加密.
import * as ec2 from '@aws-cdk/aws-ec2';
const vpc = new ec2.Vpc(this, 'Vpc');
const cluster = new Cluster(this, 'Redshift', {
masterUser: {
masterUsername: 'admin',
},
vpc
});
默认情况下,主密码将生成并存储在 AWS 保密管理器中.
名为默认的数据库 default_db 将在组中创建。 要更改数据库的名称,请设置 defaultDatabaseName 属性.
默认情况下,集群将无法公开访问.
视使用情况而定,您可使用 publiclyAccessible 属性.
连接中
要控制谁可以访问集群,请使用 .connections 属性。 红移集群有
默认端口,所以不需要指定端口 :
cluster.connections.allowDefaultPortFromAnyIpv4('Open to the world');
访问您数据库集群的终点将作为 .clusterEndpoint 属性 :
cluster.clusterEndpoint.socketAddress; // "HOSTNAME:PORT"
数据库资源
此模块允许创建用户等非 CloudFormation 数据库资源 还有桌子 这样您就可以管理身份、权限和状态资源 从您的 CDK 应用程序中跳出.
因为CloudFormation没有这些资源,所以这个库的杠杆作用 自定义 资源 管理他们。 除了提供Redshift服务所需的IAM许可外 调用,自定义资源处理器的执行角色需要数据库证书 在集群内创建资源.
这些数据库证书可通过下列方式明确提供: adminUser 属性
用于构建各种数据库资源。 或者,全权证书可以是:
自动从 Redshift 集群的默认管理员中拉出
证书。 但是,只有在证书的密码允许的情况下,才能使用这个选项
由 CDK 应用程序生成( 即没有设定值 vas) 页:1 masterPassword
属性
联 合 国
Cluster.masterUser) (中文(简体) ).
创建用户
在 Redshift 集群数据库中通过即时编辑创建用户 User 构造。 这个
将生成用户名和密码,将证书保存在 AWS 保密管理器
Secret, (中文(简体) ),
并查询 Redshift 集群,以创建新的数据库用户
证书.
new User(this, 'User', {
cluster: cluster,
databaseName: 'databaseName',
});
默认情况下, 用户证书会用您的 AWS 账户默认密钥加密
管理器加密密钥 。 您可以指定用于此目的的加密密钥
提供 encryptionKey 属性.
import * as kms from '@aws-cdk/aws-kms';
const encryptionKey = new kms.Key(this, 'Key');
new User(this, 'User', {
encryptionKey: encryptionKey,
cluster: cluster,
databaseName: 'databaseName',
});
默认情况下,用户名会自动从用户构造ID及其路径生成
在构造树上。 您可以通过提供该定义的值来指定特定的用户名
username 属性。 用户名必须是有效的标识符;参见: 名称和编号
标识符 输入 亚马逊
红移数据库开发者指南。 。 。 .
new User(this, 'User', {
username: 'myuser',
cluster: cluster,
databaseName: 'databaseName',
});
用户密码由 AWS 保密管理器使用默认配置生成
发现于
secretsmanager.SecretStringGenerator, (中文(简体) ),
密码长度除外 30 并排除一些不符合 SQL 字符 。 这个
密码的纯文本永远不会出现在 CDK 应用程序中; 相反, a
云格式动态
参考文献
用于任何需要密码值的地方.
创建表格
在 Redshift 集群数据库中创建一个表格 Table
构造。 这将向 Redshift 集群查询以创建新的数据库表格
与提供计划.
new Table(this, 'Table', {
tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
cluster: cluster,
databaseName: 'databaseName',
});
表格可以配置为 distStyle 属性和一个 distKey 列 :
new Table(this, 'Table', {
tableColumns: [
{ name: 'col1', dataType: 'varchar(4)', distKey: true },
{ name: 'col2', dataType: 'float' },
],
cluster: cluster,
databaseName: 'databaseName',
distStyle: TableDistStyle.KEY,
});
表格也可以配置为排序Style属性并排序Key列 :
new Table(this, 'Table', {
tableColumns: [
{ name: 'col1', dataType: 'varchar(4)', sortKey: true },
{ name: 'col2', dataType: 'float', sortKey: true },
],
cluster: cluster,
databaseName: 'databaseName',
sortStyle: TableSortStyle.COMPOUND,
});
授予特权
您可以通过使用 :
Table.grant() 方法.
const user = new User(this, 'User', {
cluster: cluster,
databaseName: 'databaseName',
});
const table = new Table(this, 'Table', {
tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
cluster: cluster,
databaseName: 'databaseName',
});
table.grant(user, TableAction.DROP, TableAction.SELECT);
在通过 CDK 管理权限时要小心, 作为试图管理用户的
多个 CDK 应用程序中同一表格中的权限可能导致意外
压倒这些权限。 考虑以下两个 CDK 应用程序,它们都提到
改为同一用户和表格。 在应用程序1中,创建了资源,用户是
给定 INSERT 表格中的权限 :
const databaseName = 'databaseName';
const username = 'myuser'
const tableName = 'mytable'
const user = new User(this, 'User', {
username: username,
cluster: cluster,
databaseName: databaseName,
});
const table = new Table(this, 'Table', {
tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
cluster: cluster,
databaseName: databaseName,
});
table.grant(user, TableAction.INSERT);
在应用程序2中,资源被导入并给出用户 INSERT 权限在
该表:
const databaseName = 'databaseName';
const username = 'myuser'
const tableName = 'mytable'
const user = User.fromUserAttributes(this, 'User', {
username: username,
password: SecretValue.unsafePlainText('NOT_FOR_PRODUCTION'),
cluster: cluster,
databaseName: databaseName,
});
const table = Table.fromTableAttributes(this, 'Table', {
tableName: tableName,
tableColumns: [{ name: 'col1', dataType: 'varchar(4)' }, { name: 'col2', dataType: 'float' }],
cluster: cluster,
databaseName: 'databaseName',
});
table.grant(user, TableAction.INSERT);
两个应用程序都试图通过下列方式给予用户桌面上的适当特权:
提交资料 GRANT USER SQL 查询到 Redshift 集群 。 注意,其中后者
由于用户已获得特权,两通电话将毫无效果.
现在,如果应用 1 要删除呼叫 grant页:1 REVOKE USER SQL 查询是
提交到 Redshift 集群。 一般来说,第1号申请并不知道
申请2也批准了这一许可,因此不能决定不签发该许可
撤销。 这导致申请2仍然包含以下内容的不良状态:
呼叫 grant 但用户没有指定的权限.
请注意,如果在同一权限范围内给予重复的特权,则不发生这种情况 应用程序,因为在提交任何 SQL 查询之前,此类权限将被删除.
证书的轮换
当主密码生成并存储在 AWS 秘密管理器中时,可以自动旋转:
cluster.addRotationSingleUser(); // Will rotate automatically after 30 days
还有多种用户轮换计划:
const user = new User(this, 'User', {
cluster: cluster,
databaseName: 'databaseName',
});
cluster.addRotationMultiUser('MultiUserRotation', {
secret: user.secret,
});