@cdklabs/aws-data-solutions-framework
Version:
L3 CDK Constructs used to build data solutions with AWS
53 lines • 8.15 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const aws_cdk_lib_1 = require("aws-cdk-lib");
const dsf = require("../../index");
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
class ExampleRedshiftServerlessWorkgroupBootstrapStack extends aws_cdk_lib_1.Stack {
constructor(scope, id) {
super(scope, id);
const bucket = new aws_s3_1.Bucket(this, "ExampleDataBucket");
const ingestionRole = new aws_iam_1.Role(this, "IngestionRole", {
assumedBy: new aws_iam_1.ServicePrincipal("redshift.amazonaws.com"),
managedPolicies: [
aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName("AmazonRedshiftAllCommandsFullAccess")
]
});
bucket.grantRead(ingestionRole);
const namespace = new dsf.consumption.RedshiftServerlessNamespace(this, 'DefaultRedshiftServerlessNamespace', {
name: "default",
dbName: 'defaultdb',
});
/// !show
const workgroup = new dsf.consumption.RedshiftServerlessWorkgroup(this, "DefaultRedshiftServerlessWorkgroup", {
name: "default",
namespace: namespace,
});
// Run a custom SQL to create a customer table
const createTable = workgroup.runCustomSQL('CreateCustomerTable', "defaultdb", `
CREATE TABLE customer(
customer_id varchar(50),
salutation varchar(5),
first_name varchar(50),
last_name varchar(50),
email_address varchar(100)
)
diststyle even
`, "drop table customer");
// Run a COPY command to load data into the customer table
const ingestion = workgroup.ingestData('ExampleCopy', "defaultdb", "customer", bucket, "data-products/customer/", "csv ignoreheader 1");
// Add dependencies between Redshift Data API commands because CDK cannot infer them
ingestion.node.addDependency(createTable);
// Create an engineering role in the defaultdb
const dbRole = workgroup.createDbRole('EngineeringRole', 'defaultdb', 'engineering');
// Grant the engineering role full access to the public schema in the defaultdb
const dbSchema = workgroup.grantDbSchemaToRole('EngineeringGrant', 'defaultdb', 'public', 'engineering');
// Enforce dependencies
dbSchema.node.addDependency(dbRole);
/// !hide
}
}
const app = new aws_cdk_lib_1.App();
new ExampleRedshiftServerlessWorkgroupBootstrapStack(app, "ExampleRedshiftServerlessWorkgroupBootstrapStack");
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkc2hpZnQtc2VydmVybGVzcy13b3JrZ3JvdXAtYm9vdHN0cmFwLmxpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb25zdW1wdGlvbi9leGFtcGxlcy9yZWRzaGlmdC1zZXJ2ZXJsZXNzLXdvcmtncm91cC1ib290c3RyYXAubGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkNBQXlDO0FBRXpDLG1DQUFtQztBQUNuQywrQ0FBNEM7QUFDNUMsaURBQTRFO0FBRTVFLE1BQU0sZ0RBQWlELFNBQVEsbUJBQUs7SUFDbEUsWUFBWSxLQUFnQixFQUFFLEVBQVU7UUFDdEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtRQUVwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLGNBQUksQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3BELFNBQVMsRUFBRSxJQUFJLDBCQUFnQixDQUFDLHdCQUF3QixDQUFDO1lBQ3pELGVBQWUsRUFBRTtnQkFDZix1QkFBYSxDQUFDLHdCQUF3QixDQUFDLHFDQUFxQyxDQUFDO2FBQzlFO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUUvQixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxXQUFXLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLG9DQUFvQyxFQUFFO1lBQzVHLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLFdBQVc7U0FDcEIsQ0FBQyxDQUFBO1FBQ0YsU0FBUztRQUNULE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsb0NBQW9DLEVBQUU7WUFDNUcsSUFBSSxFQUFFLFNBQVM7WUFDZixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDLENBQUE7UUFFRiw4Q0FBOEM7UUFDOUMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxXQUFXLEVBQzNFOzs7Ozs7Ozs7T0FTQyxFQUNELHFCQUFxQixDQUN0QixDQUFDO1FBRUYsMERBQTBEO1FBQzFELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLHlCQUF5QixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFeEksb0ZBQW9GO1FBQ3BGLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFDLDhDQUE4QztRQUM5QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVyRiwrRUFBK0U7UUFDL0UsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFekcsdUJBQXVCO1FBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLFNBQVM7SUFDWCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLGlCQUFHLEVBQUUsQ0FBQTtBQUNyQixJQUFJLGdEQUFnRCxDQUFDLEdBQUcsRUFBRSxrREFBa0QsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGRzZiBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBNYW5hZ2VkUG9saWN5LCBSb2xlLCBTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcblxuY2xhc3MgRXhhbXBsZVJlZHNoaWZ0U2VydmVybGVzc1dvcmtncm91cEJvb3RzdHJhcFN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIFxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgXCJFeGFtcGxlRGF0YUJ1Y2tldFwiKVxuICAgIFxuICAgIGNvbnN0IGluZ2VzdGlvblJvbGUgPSBuZXcgUm9sZSh0aGlzLCBcIkluZ2VzdGlvblJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgU2VydmljZVByaW5jaXBhbChcInJlZHNoaWZ0LmFtYXpvbmF3cy5jb21cIiksXG4gICAgICBtYW5hZ2VkUG9saWNpZXM6IFtcbiAgICAgICAgTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBbWF6b25SZWRzaGlmdEFsbENvbW1hbmRzRnVsbEFjY2Vzc1wiKVxuICAgICAgXVxuICAgIH0pXG4gICAgXG4gICAgYnVja2V0LmdyYW50UmVhZChpbmdlc3Rpb25Sb2xlKVxuICAgIFxuICAgIGNvbnN0IG5hbWVzcGFjZSA9IG5ldyBkc2YuY29uc3VtcHRpb24uUmVkc2hpZnRTZXJ2ZXJsZXNzTmFtZXNwYWNlKHRoaXMsICdEZWZhdWx0UmVkc2hpZnRTZXJ2ZXJsZXNzTmFtZXNwYWNlJywge1xuICAgICAgbmFtZTogXCJkZWZhdWx0XCIsXG4gICAgICBkYk5hbWU6ICdkZWZhdWx0ZGInLFxuICAgIH0pXG4gICAgLy8vICFzaG93XG4gICAgY29uc3Qgd29ya2dyb3VwID0gbmV3IGRzZi5jb25zdW1wdGlvbi5SZWRzaGlmdFNlcnZlcmxlc3NXb3JrZ3JvdXAodGhpcywgXCJEZWZhdWx0UmVkc2hpZnRTZXJ2ZXJsZXNzV29ya2dyb3VwXCIsIHtcbiAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgfSlcblxuICAgIC8vIFJ1biBhIGN1c3RvbSBTUUwgdG8gY3JlYXRlIGEgY3VzdG9tZXIgdGFibGVcbiAgICBjb25zdCBjcmVhdGVUYWJsZSA9IHdvcmtncm91cC5ydW5DdXN0b21TUUwoJ0NyZWF0ZUN1c3RvbWVyVGFibGUnLCBcImRlZmF1bHRkYlwiLCBcbiAgICAgIGBcbiAgICAgIENSRUFURSBUQUJMRSBjdXN0b21lcihcbiAgICAgICAgY3VzdG9tZXJfaWQgdmFyY2hhcig1MCksIFxuICAgICAgICBzYWx1dGF0aW9uIHZhcmNoYXIoNSksIFxuICAgICAgICBmaXJzdF9uYW1lIHZhcmNoYXIoNTApLCBcbiAgICAgICAgbGFzdF9uYW1lIHZhcmNoYXIoNTApLCBcbiAgICAgICAgZW1haWxfYWRkcmVzcyB2YXJjaGFyKDEwMClcbiAgICAgICkgXG4gICAgICBkaXN0c3R5bGUgZXZlblxuICAgICAgYCwgXG4gICAgICBcImRyb3AgdGFibGUgY3VzdG9tZXJcIlxuICAgICk7XG5cbiAgICAvLyBSdW4gYSBDT1BZIGNvbW1hbmQgdG8gbG9hZCBkYXRhIGludG8gdGhlIGN1c3RvbWVyIHRhYmxlXG4gICAgY29uc3QgaW5nZXN0aW9uID0gd29ya2dyb3VwLmluZ2VzdERhdGEoJ0V4YW1wbGVDb3B5JywgXCJkZWZhdWx0ZGJcIiwgXCJjdXN0b21lclwiLCBidWNrZXQsIFwiZGF0YS1wcm9kdWN0cy9jdXN0b21lci9cIiwgXCJjc3YgaWdub3JlaGVhZGVyIDFcIik7XG5cbiAgICAvLyBBZGQgZGVwZW5kZW5jaWVzIGJldHdlZW4gUmVkc2hpZnQgRGF0YSBBUEkgY29tbWFuZHMgYmVjYXVzZSBDREsgY2Fubm90IGluZmVyIHRoZW1cbiAgICBpbmdlc3Rpb24ubm9kZS5hZGREZXBlbmRlbmN5KGNyZWF0ZVRhYmxlKTtcblxuICAgIC8vIENyZWF0ZSBhbiBlbmdpbmVlcmluZyByb2xlIGluIHRoZSBkZWZhdWx0ZGJcbiAgICBjb25zdCBkYlJvbGUgPSB3b3JrZ3JvdXAuY3JlYXRlRGJSb2xlKCdFbmdpbmVlcmluZ1JvbGUnLCAnZGVmYXVsdGRiJywgJ2VuZ2luZWVyaW5nJyk7XG5cbiAgICAvLyBHcmFudCB0aGUgZW5naW5lZXJpbmcgcm9sZSBmdWxsIGFjY2VzcyB0byB0aGUgcHVibGljIHNjaGVtYSBpbiB0aGUgZGVmYXVsdGRiXG4gICAgY29uc3QgZGJTY2hlbWEgPSB3b3JrZ3JvdXAuZ3JhbnREYlNjaGVtYVRvUm9sZSgnRW5naW5lZXJpbmdHcmFudCcsICdkZWZhdWx0ZGInLCAncHVibGljJywgJ2VuZ2luZWVyaW5nJyk7XG5cbiAgICAvLyBFbmZvcmNlIGRlcGVuZGVuY2llc1xuICAgIGRiU2NoZW1hLm5vZGUuYWRkRGVwZW5kZW5jeShkYlJvbGUpO1xuICAgIC8vLyAhaGlkZVxuICB9XG59XG5cbmNvbnN0IGFwcCA9IG5ldyBBcHAoKVxubmV3IEV4YW1wbGVSZWRzaGlmdFNlcnZlcmxlc3NXb3JrZ3JvdXBCb290c3RyYXBTdGFjayhhcHAsIFwiRXhhbXBsZVJlZHNoaWZ0U2VydmVybGVzc1dvcmtncm91cEJvb3RzdHJhcFN0YWNrXCIpIl19