UNPKG

@aws-cdk/aws-redshift-alpha

Version:

The CDK Construct Library for AWS::Redshift

105 lines 17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DatabaseQuery = void 0; const path = require("path"); const iam = require("aws-cdk-lib/aws-iam"); const lambda = require("aws-cdk-lib/aws-lambda"); const cdk = require("aws-cdk-lib/core"); const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal"); const customresources = require("aws-cdk-lib/custom-resources"); const constructs_1 = require("constructs"); const cluster_1 = require("../cluster"); class DatabaseQuery extends constructs_1.Construct { grantPrincipal; ref; resource; constructor(scope, id, props) { super(scope, id); if (props.timeout && !cdk.Token.isUnresolved(props.timeout)) { if (props.timeout.toMilliseconds() < cdk.Duration.seconds(1).toMilliseconds()) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `TimeoutTooShort`, `The timeout for the handler must be BETWEEN 1 second and 15 minutes, got ${props.timeout.toMilliseconds()} milliseconds.`, this); } if (props.timeout.toSeconds() > cdk.Duration.minutes(15).toSeconds()) { throw new cdk.ValidationError((0, helpers_internal_1.lit) `TimeoutTooLong`, `The timeout for the handler must be between 1 second and 15 minutes, got ${props.timeout.toSeconds()} seconds.`, this); } } const adminUser = this.getAdminUser(props); const handler = new lambda.SingletonFunction(this, 'Handler', { code: lambda.Code.fromAsset(path.join(__dirname, 'database-query-provider'), { exclude: ['*.ts'], }), runtime: lambda.determineLatestNodeRuntime(this), handler: 'index.handler', timeout: props.timeout ?? cdk.Duration.minutes(1), uuid: '3de5bea7-27da-4796-8662-5efb56431b5f', lambdaPurpose: 'Query Redshift Database', }); handler.addToRolePolicy(new iam.PolicyStatement({ actions: ['redshift-data:DescribeStatement', 'redshift-data:ExecuteStatement'], resources: ['*'], })); adminUser.grantRead(handler); const provider = new customresources.Provider(this, 'Provider', { onEventHandler: handler, role: this.getOrCreateInvokerRole(handler), }); const queryHandlerProps = { handler: props.handler, clusterName: props.cluster.clusterName, adminUserArn: adminUser.secretArn, databaseName: props.databaseName, ...props.properties, }; this.resource = new cdk.CustomResource(this, 'Resource', { resourceType: 'Custom::RedshiftDatabaseQuery', serviceToken: provider.serviceToken, removalPolicy: props.removalPolicy, properties: queryHandlerProps, }); this.grantPrincipal = handler.grantPrincipal; this.ref = this.resource.ref; } applyRemovalPolicy(policy) { this.resource.applyRemovalPolicy(policy); } getAtt(attributeName) { return this.resource.getAtt(attributeName); } getAttString(attributeName) { return this.resource.getAttString(attributeName); } getAdminUser(props) { const cluster = props.cluster; let adminUser = props.adminUser; if (!adminUser) { if (cluster instanceof cluster_1.Cluster) { if (cluster.secret) { adminUser = cluster.secret; } else { throw new cdk.ValidationError((0, helpers_internal_1.lit) `AdminUserSecretNotAvailable`, 'Administrative access to the Redshift cluster is required but an admin user secret was not provided and the cluster did not generate admin user credentials (they were provided explicitly)', this); } } else { throw new cdk.ValidationError((0, helpers_internal_1.lit) `AdminUserSecretNotProvided`, 'Administrative access to the Redshift cluster is required but an admin user secret was not provided and the cluster was imported', this); } } return adminUser; } /** * Get or create the IAM role for the singleton lambda function. * We only need one function since it's just acting as an invoker. * */ getOrCreateInvokerRole(handler) { const id = handler.constructName + 'InvokerRole'; const existing = cdk.Stack.of(this).node.tryFindChild(id); return existing != null ? existing : new iam.Role(cdk.Stack.of(this), id, { assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'), managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')], }); } } exports.DatabaseQuery = DatabaseQuery; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkYXRhYmFzZS1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IsMkNBQTJDO0FBQzNDLGlEQUFpRDtBQUVqRCx3Q0FBd0M7QUFDeEMsNEVBQTREO0FBQzVELGdFQUFnRTtBQUNoRSwyQ0FBdUM7QUFFdkMsd0NBQXFDO0FBcUJyQyxNQUFhLGFBQTRCLFNBQVEsc0JBQVM7SUFDL0MsY0FBYyxDQUFpQjtJQUMvQixHQUFHLENBQVM7SUFFSixRQUFRLENBQXFCO0lBRTlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUM7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztnQkFDOUUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBQSxzQkFBRyxFQUFBLGlCQUFpQixFQUFFLDRFQUE0RSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4TCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JFLE1BQU0sSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUEsc0JBQUcsRUFBQSxnQkFBZ0IsRUFBRSw0RUFB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dGgnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgKiBhcyBjdXN0b21yZXNvdXJjZXMgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VRdWVyeUhhbmRsZXJQcm9wcyB9IGZyb20gJy4vaGFuZGxlci1wcm9wcyc7XG5pbXBvcnQgeyBDbHVzdGVyIH0gZnJvbSAnLi4vY2x1c3Rlcic7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlT3B0aW9ucyB9IGZyb20gJy4uL2RhdGFiYXNlLW9wdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlUXVlcnlQcm9wczxIYW5kbGVyUHJvcHM+IGV4dGVuZHMgRGF0YWJhc2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzOiBIYW5kbGVyUHJvcHM7XG4gIC8qKlxuICAgKiBUaGUgcG9saWN5IHRvIGFwcGx5IHdoZW4gdGhpcyByZXNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBjZGsuUmVtb3ZhbFBvbGljeS5EZXN0cm95XG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGVyIHRpbWVvdXQgZHVyYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMSlcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBjZGsuRHVyYXRpb247XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZVF1ZXJ5PEhhbmRsZXJQcm9wcz4gZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBpYW0uSUdyYW50YWJsZSB7XG4gIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcbiAgcmVhZG9ubHkgcmVmOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogY2RrLkN1c3RvbVJlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhYmFzZVF1ZXJ5UHJvcHM8SGFuZGxlclByb3BzPikge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAocHJvcHMudGltZW91dCAmJiAhY2RrLlRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy50aW1lb3V0KSkge1xuICAgICAgaWYgKHByb3BzLnRpbWVvdXQudG9NaWxsaXNlY29uZHMoKSA8IGNkay5EdXJhdGlvbi5zZWNvbmRzKDEpLnRvTWlsbGlzZWNvbmRzKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGNkay5WYWxpZGF0aW9uRXJyb3IobGl0YFRpbWVvdXRUb29TaG9ydGAsIGBUaGUgdGltZW91dCBmb3IgdGhlIGhhbmRsZXIgbXVzdCBiZSBCRVRXRUVOIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzLCBnb3QgJHtwcm9wcy50aW1lb3V0LnRvTWlsbGlzZWNvbmRzKCl9IG1pbGxpc2Vjb25kcy5gLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpID4gY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMTUpLnRvU2Vjb25kcygpKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBUaW1lb3V0VG9vTG9uZ2AsIGBUaGUgdGltZW91dCBmb3IgdGhlIGhhbmRsZXIgbXVzdCBiZSBiZXR3ZWVuIDEgc2Vjb25kIGFuZCAxNSBtaW51dGVzLCBnb3QgJHtwcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpfSBzZWNvbmRzLmAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkbWluVXNlciA9IHRoaXMuZ2V0QWRtaW5Vc2VyKHByb3BzKTtcbiAgICBjb25zdCBoYW5kbGVyID0gbmV3IGxhbWJkYS5TaW5nbGV0b25GdW5jdGlvbih0aGlzLCAnSGFuZGxlcicsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnZGF0YWJhc2UtcXVlcnktcHJvdmlkZXInKSwge1xuICAgICAgICBleGNsdWRlOiBbJyoudHMnXSxcbiAgICAgIH0pLFxuICAgICAgcnVudGltZTogbGFtYmRhLmRldGVybWluZUxhdGVzdE5vZGVSdW50aW1lKHRoaXMpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCA/PyBjZGsuRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIHV1aWQ6ICczZGU1YmVhNy0yN2RhLTQ3OTYtODY2Mi01ZWZiNTY0MzFiNWYnLFxuICAgICAgbGFtYmRhUHVycG9zZTogJ1F1ZXJ5IFJlZHNoaWZ0IERhdGFiYXNlJyxcbiAgICB9KTtcbiAgICBoYW5kbGVyLmFkZFRvUm9sZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBhY3Rpb25zOiBbJ3JlZHNoaWZ0LWRhdGE6RGVzY3JpYmVTdGF0ZW1lbnQnLCAncmVkc2hpZnQtZGF0YTpFeGVjdXRlU3RhdGVtZW50J10sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgIH0pKTtcbiAgICBhZG1pblVzZXIuZ3JhbnRSZWFkKGhhbmRsZXIpO1xuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgY3VzdG9tcmVzb3VyY2VzLlByb3ZpZGVyKHRoaXMsICdQcm92aWRlcicsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgcm9sZTogdGhpcy5nZXRPckNyZWF0ZUludm9rZXJSb2xlKGhhbmRsZXIpLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcXVlcnlIYW5kbGVyUHJvcHM6IERhdGFiYXNlUXVlcnlIYW5kbGVyUHJvcHMgJiBIYW5kbGVyUHJvcHMgPSB7XG4gICAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyLFxuICAgICAgY2x1c3Rlck5hbWU6IHByb3BzLmNsdXN0ZXIuY2x1c3Rlck5hbWUsXG4gICAgICBhZG1pblVzZXJBcm46IGFkbWluVXNlci5zZWNyZXRBcm4sXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgIC4uLnByb3BzLnByb3BlcnRpZXMsXG4gICAgfTtcbiAgICB0aGlzLnJlc291cmNlID0gbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICByZXNvdXJjZVR5cGU6ICdDdXN0b206OlJlZHNoaWZ0RGF0YWJhc2VRdWVyeScsXG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzLnJlbW92YWxQb2xpY3ksXG4gICAgICBwcm9wZXJ0aWVzOiBxdWVyeUhhbmRsZXJQcm9wcyxcbiAgICB9KTtcblxuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSBoYW5kbGVyLmdyYW50UHJpbmNpcGFsO1xuICAgIHRoaXMucmVmID0gdGhpcy5yZXNvdXJjZS5yZWY7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSZW1vdmFsUG9saWN5KHBvbGljeTogY2RrLlJlbW92YWxQb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlc291cmNlLmFwcGx5UmVtb3ZhbFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgcHVibGljIGdldEF0dChhdHRyaWJ1dGVOYW1lOiBzdHJpbmcpOiBjZGsuUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5nZXRBdHQoYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0U3RyaW5nKGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2UuZ2V0QXR0U3RyaW5nKGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBZG1pblVzZXIocHJvcHM6IERhdGFiYXNlT3B0aW9ucyk6IHNlY3JldHNtYW5hZ2VyLklTZWNyZXQge1xuICAgIGNvbnN0IGNsdXN0ZXIgPSBwcm9wcy5jbHVzdGVyO1xuICAgIGxldCBhZG1pblVzZXIgPSBwcm9wcy5hZG1pblVzZXI7XG4gICAgaWYgKCFhZG1pblVzZXIpIHtcbiAgICAgIGlmIChjbHVzdGVyIGluc3RhbmNlb2YgQ2x1c3Rlcikge1xuICAgICAgICBpZiAoY2x1c3Rlci5zZWNyZXQpIHtcbiAgICAgICAgICBhZG1pblVzZXIgPSBjbHVzdGVyLnNlY3JldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBBZG1pblVzZXJTZWNyZXROb3RBdmFpbGFibGVgLFxuICAgICAgICAgICAgJ0FkbWluaXN0cmF0aXZlIGFjY2VzcyB0byB0aGUgUmVkc2hpZnQgY2x1c3RlciBpcyByZXF1aXJlZCBidXQgYW4gYWRtaW4gdXNlciBzZWNyZXQgd2FzIG5vdCBwcm92aWRlZCBhbmQgdGhlIGNsdXN0ZXIgZGlkIG5vdCBnZW5lcmF0ZSBhZG1pbiB1c2VyIGNyZWRlbnRpYWxzICh0aGV5IHdlcmUgcHJvdmlkZWQgZXhwbGljaXRseSknLFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgY2RrLlZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgQWRtaW5Vc2VyU2VjcmV0Tm90UHJvdmlkZWRgLFxuICAgICAgICAgICdBZG1pbmlzdHJhdGl2ZSBhY2Nlc3MgdG8gdGhlIFJlZHNoaWZ0IGNsdXN0ZXIgaXMgcmVxdWlyZWQgYnV0IGFuIGFkbWluIHVzZXIgc2VjcmV0IHdhcyBub3QgcHJvdmlkZWQgYW5kIHRoZSBjbHVzdGVyIHdhcyBpbXBvcnRlZCcsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFkbWluVXNlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlIHRoZSBJQU0gcm9sZSBmb3IgdGhlIHNpbmdsZXRvbiBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIFdlIG9ubHkgbmVlZCBvbmUgZnVuY3Rpb24gc2luY2UgaXQncyBqdXN0IGFjdGluZyBhcyBhbiBpbnZva2VyLlxuICAgKiAqL1xuICBwcml2YXRlIGdldE9yQ3JlYXRlSW52b2tlclJvbGUoaGFuZGxlcjogbGFtYmRhLlNpbmdsZXRvbkZ1bmN0aW9uKTogaWFtLklSb2xlIHtcbiAgICBjb25zdCBpZCA9IGhhbmRsZXIuY29uc3RydWN0TmFtZSArICdJbnZva2VyUm9sZSc7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBjZGsuU3RhY2sub2YodGhpcykubm9kZS50cnlGaW5kQ2hpbGQoaWQpO1xuICAgIHJldHVybiBleGlzdGluZyAhPSBudWxsXG4gICAgICA/IGV4aXN0aW5nIGFzIGlhbS5Sb2xlXG4gICAgICA6IG5ldyBpYW0uUm9sZShjZGsuU3RhY2sub2YodGhpcyksIGlkLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdsYW1iZGEuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBtYW5hZ2VkUG9saWNpZXM6IFtpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoJ3NlcnZpY2Utcm9sZS9BV1NMYW1iZGFCYXNpY0V4ZWN1dGlvblJvbGUnKV0sXG4gICAgICB9KTtcbiAgfVxufVxuIl19