in src/integ.default.ts [25:143]
constructor() {
const app = new cdk.App();
const env = {
region: process.env.CDK_DEFAULT_REGION,
account: process.env.CDK_DEFAULT_ACCOUNT,
};
const stack = new cdk.Stack(app, 'integ-test-stack', { env });
let redshiftUsername = 'admin';
let redshiftDbName = 'dev';
let cluster = new redshift.Cluster(
stack, 'rsCluster', {
vpc: new ec2.Vpc(stack, 'vpc',
{
subnetConfiguration: [
{
cidrMask: 28,
name: 'isolated',
subnetType: ec2.SubnetType.ISOLATED,
},
],
},
),
masterUser: {
masterUsername: redshiftUsername,
},
defaultDatabaseName: redshiftDbName,
clusterType: redshift.ClusterType.SINGLE_NODE,
removalPolicy: cdk.RemovalPolicy.DESTROY,
vpcSubnets: { subnetType: ec2.SubnetType.ISOLATED },
},
);
let rs_task_helper = new SfnRedshiftTasker(
stack, 'RSTask', {
redshiftTargetProps: {
dbUser: redshiftUsername,
dbName: redshiftDbName,
clusterIdentifier: cluster.clusterName,
},
logLevel: 'DEBUG',
},
);
//Deploying separate function to allow access to another user without duplicating infra or powertools layer.
let rs_task_helper2 = new SfnRedshiftTasker(
stack, 'RSTaskUser2', {
redshiftTargetProps: {
dbUser: 'user2',
dbName: redshiftDbName,
clusterIdentifier: cluster.clusterName,
},
existingTableObj: rs_task_helper.trackingTable,
createCallbackInfra: false,
powertoolsArn: rs_task_helper.powertoolsArn,
},
);
let exampleFunctionsCode = Code.fromAsset(path.join(__dirname, '../lambda/python/cfn_example_functions'));
let rs_user_manager = new lambda.Function(stack, 'RSUserManager', {
runtime: Runtime.PYTHON_3_8,
handler: 'manage_user.handler',
code: exampleFunctionsCode,
environment: { CDK_STEPFUNCTIONS_REDSHIFT_LAMBDA: rs_task_helper.lambdaFunction.functionName },
});
rs_task_helper.lambdaFunction.grantInvoke(rs_user_manager);
new CustomResource(stack, 'rs_cfncreated_user', {
serviceToken: rs_user_manager.functionArn,
properties: {
username: 'cfncreated_user',
password: 'md5e1c252bf4c426727db9c7bfc726760d8', //Note that this would require all password changes to pass through CFN.
create_db: true,
create_user: false,
unrestricted_syslog_access: true,
groups: ['group_a', 'group_b'],
valid_until: '2025-01-01 12:00:00',
connection_limit: 3,
session_timeout: 1728000,
},
});
let rs_create_drop = new lambda.Function(stack, 'RSCreateDrop', {
runtime: Runtime.PYTHON_3_8,
handler: 'create_drop.handler',
code: exampleFunctionsCode,
environment: { CDK_STEPFUNCTIONS_REDSHIFT_LAMBDA: rs_task_helper.lambdaFunction.functionName },
});
rs_task_helper.lambdaFunction.grantInvoke(rs_create_drop);
// Create a table
let rsTable = new CustomResource(stack, 'rs_table', {
serviceToken: rs_create_drop.functionArn,
properties: {
create_sql: 'create table my_table(id int, value varchar(50));',
drop_sql: 'drop table if exists my_table;',
},
});
// Create a view that depends on the table
let rsView = new CustomResource(stack, 'rs_view', {
serviceToken: rs_create_drop.functionArn,
properties: {
create_sql: 'create view my_view as (select id from my_table);',
drop_sql: 'drop view if exists my_view;',
},
});
rsView.node.addDependency(rsTable); // Explicitly put dependencies!
let chainedMachine = new ChainedMachine(stack);
chainedMachine.push_front('singleFailure', new SingleFailureMachine(stack, rs_task_helper2.lambdaFunction).definition);
chainedMachine.push_front('singleSuccess', new SingleSuccessMachine(stack, rs_task_helper.lambdaFunction).definition);
chainedMachine.push_front('parallelNoConcurrency', new ParallelNoConcurrencyMachine(stack, rs_task_helper.lambdaFunction).definition);
chainedMachine.push_front('successAndFail', new SuccessAndFailMachine(stack, rs_task_helper.lambdaFunction).definition);
chainedMachine.push_front('polling', new PollingMachine(stack, rs_task_helper.lambdaFunction).definition);
chainedMachine.push_front('cancelling', new CancellingStatementMachine(stack, rs_task_helper.lambdaFunction).definition);
chainedMachine.build();
this.stack = [stack];
}