@scloud/cdk-patterns
Version:
Serverless CDK patterns for common infrastructure needs
62 lines • 9.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ApiFunction = void 0;
const constructs_1 = require("constructs");
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
const aws_route53_1 = require("aws-cdk-lib/aws-route53");
const aws_route53_targets_1 = require("aws-cdk-lib/aws-route53-targets");
const ZipFunction_1 = require("./ZipFunction");
const ContainerFunction_1 = require("./ContainerFunction");
/**
* An API gateway backed by a Lambda function.
*/
class ApiFunction extends constructs_1.Construct {
constructor(scope, id, props) {
var _a;
super(scope, `${id}ApiFunction`);
// Domain name and SSL certificate (default to api.<zoneName>):
const name = props.domain || `api.${(_a = props.zone) === null || _a === void 0 ? void 0 : _a.zoneName}`;
let domainName;
if (props.zone) {
domainName = props.zone ? {
domainName: name,
certificate: new aws_certificatemanager_1.DnsValidatedCertificate(scope, `${id}Certificate`, {
domainName: name,
hostedZone: props.zone,
}),
} : undefined;
}
this.lambda = props.lambda;
this.api = new aws_apigateway_1.LambdaRestApi(scope, `${id}ApiGateway`, {
handler: props.lambda,
proxy: true,
description: id,
domainName,
});
this.apiGateway = new aws_route53_targets_1.ApiGateway(this.api);
// DNS record
if (props.zone) {
new aws_route53_1.ARecord(scope, `${id}ARecord`, {
zone: props.zone,
recordName: name,
target: aws_route53_1.RecordTarget.fromAlias(this.apiGateway),
comment: `${id} API gateway`,
});
}
}
static node(scope, id, functionProps, zone, domain) {
const lambda = ZipFunction_1.ZipFunction.node(scope, id, functionProps);
return new ApiFunction(scope, id, { lambda, zone, domain });
}
static python(scope, id, functionProps, zone, domain) {
const lambda = ZipFunction_1.ZipFunction.python(scope, id, functionProps);
return new ApiFunction(scope, id, { lambda, zone, domain });
}
static container(scope, id, functionProps, zone, domain) {
const lambda = new ContainerFunction_1.ContainerFunction(scope, id, functionProps);
return new ApiFunction(scope, id, { lambda, zone, domain });
}
}
exports.ApiFunction = ApiFunction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBpRnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvQXBpRnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBRXZDLCtEQUE4RTtBQUM5RSwrRUFBNkU7QUFDN0UseURBQTZFO0FBQzdFLHlFQUE2RDtBQUM3RCwrQ0FBOEQ7QUFDOUQsMkRBQWdGO0FBYWhGOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFPeEMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBdUI7O1FBRXZCLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWpDLCtEQUErRDtRQUMvRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBQSxLQUFLLENBQUMsSUFBSSwwQ0FBRSxRQUFRLEVBQUUsQ0FBQztRQUMzRCxJQUFJLFVBQXlDLENBQUM7UUFDOUMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixXQUFXLEVBQUUsSUFBSSxnREFBdUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtvQkFDbEUsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDdkIsQ0FBQzthQUNILENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBRTNCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSw4QkFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFO1lBQ3JELE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNyQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxFQUFFO1lBQ2YsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxnQ0FBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUUzQyxhQUFhO1FBQ2IsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixJQUFJLHFCQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRSwwQkFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUMvQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGNBQWM7YUFDN0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUNULEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixhQUFnQyxFQUNoQyxJQUFrQixFQUNsQixNQUFlO1FBRWYsTUFBTSxNQUFNLEdBQUcseUJBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMxRCxPQUFPLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQ1gsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLGFBQWdDLEVBQ2hDLElBQWtCLEVBQ2xCLE1BQWU7UUFFZixNQUFNLE1BQU0sR0FBRyx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FDZCxLQUFnQixFQUNoQixFQUFVLEVBQ1YsYUFBc0MsRUFDdEMsSUFBa0IsRUFDbEIsTUFBZTtRQUVmLE1BQU0sTUFBTSxHQUFHLElBQUkscUNBQWlCLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMvRCxPQUFPLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNGO0FBakZELGtDQWlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IERvbWFpbk5hbWVPcHRpb25zLCBMYW1iZGFSZXN0QXBpIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0IHsgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCB7IEFSZWNvcmQsIElIb3N0ZWRab25lLCBSZWNvcmRUYXJnZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgeyBBcGlHYXRld2F5IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBaaXBGdW5jdGlvbiwgWmlwRnVuY3Rpb25Qcm9wcyB9IGZyb20gJy4vWmlwRnVuY3Rpb24nO1xuaW1wb3J0IHsgQ29udGFpbmVyRnVuY3Rpb24sIENvbnRhaW5lckZ1bmN0aW9uUHJvcHMgfSBmcm9tICcuL0NvbnRhaW5lckZ1bmN0aW9uJztcblxuLyoqXG4gKiBAcGFyYW0gbGFtYmRhIFRoZSBMYW1iZGEgZnVuY3Rpb24gdG8gYmUgdHJpZ2dlcmVkIGJ5IHRoZSBidWNrZXQuIFRoaXMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdSBpZiB5b3UgdXNlIG9uZSBvZiB0aGUgc3RhdGljIG1ldGhvZHMgKG5vZGUsIHB5dGhvbiwgY29udGFpbmVyKVxuICogQHBhcmFtIHpvbmUgT3B0aW9uYWw6IGEgRE5TIHpvbmUgZm9yIHRoaXMgQVBJLiBCeSBkZWZhdWx0IHRoZSBkb21haW4gbmFtZSBpcyBzZXQgdG8gJ2FwaS48em9uZU5hbWU+J1xuICogQHBhcmFtIGRvbWFpbiBPcHRpb25hbDogSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIGRvbWFpbiBuYW1lIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0ICdhcGkuPHpvbmVOYW1lPicgKGUuZy4gJ3N1YmRvbWFpbi5leGFtcGxlLmNvbScpIHlvdSBjYW4gZG8gc28gaGVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUZ1bmN0aW9uUHJvcHMge1xuICBsYW1iZGE6IEZ1bmN0aW9uLFxuICB6b25lPzogSUhvc3RlZFpvbmUsXG4gIGRvbWFpbj86IHN0cmluZyxcbn1cblxuLyoqXG4gKiBBbiBBUEkgZ2F0ZXdheSBiYWNrZWQgYnkgYSBMYW1iZGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlGdW5jdGlvbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGxhbWJkYTogRnVuY3Rpb247XG5cbiAgYXBpOiBMYW1iZGFSZXN0QXBpO1xuXG4gIGFwaUdhdGV3YXk6IEFwaUdhdGV3YXk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBBcGlGdW5jdGlvblByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgYCR7aWR9QXBpRnVuY3Rpb25gKTtcblxuICAgIC8vIERvbWFpbiBuYW1lIGFuZCBTU0wgY2VydGlmaWNhdGUgKGRlZmF1bHQgdG8gYXBpLjx6b25lTmFtZT4pOlxuICAgIGNvbnN0IG5hbWUgPSBwcm9wcy5kb21haW4gfHwgYGFwaS4ke3Byb3BzLnpvbmU/LnpvbmVOYW1lfWA7XG4gICAgbGV0IGRvbWFpbk5hbWU6IERvbWFpbk5hbWVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmIChwcm9wcy56b25lKSB7XG4gICAgICBkb21haW5OYW1lID0gcHJvcHMuem9uZSA/IHtcbiAgICAgICAgZG9tYWluTmFtZTogbmFtZSxcbiAgICAgICAgY2VydGlmaWNhdGU6IG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZShzY29wZSwgYCR7aWR9Q2VydGlmaWNhdGVgLCB7XG4gICAgICAgICAgZG9tYWluTmFtZTogbmFtZSxcbiAgICAgICAgICBob3N0ZWRab25lOiBwcm9wcy56b25lLFxuICAgICAgICB9KSxcbiAgICAgIH0gOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5sYW1iZGEgPSBwcm9wcy5sYW1iZGE7XG5cbiAgICB0aGlzLmFwaSA9IG5ldyBMYW1iZGFSZXN0QXBpKHNjb3BlLCBgJHtpZH1BcGlHYXRld2F5YCwge1xuICAgICAgaGFuZGxlcjogcHJvcHMubGFtYmRhLFxuICAgICAgcHJveHk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogaWQsXG4gICAgICBkb21haW5OYW1lLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcGlHYXRld2F5ID0gbmV3IEFwaUdhdGV3YXkodGhpcy5hcGkpO1xuXG4gICAgLy8gRE5TIHJlY29yZFxuICAgIGlmIChwcm9wcy56b25lKSB7XG4gICAgICBuZXcgQVJlY29yZChzY29wZSwgYCR7aWR9QVJlY29yZGAsIHtcbiAgICAgICAgem9uZTogcHJvcHMuem9uZSxcbiAgICAgICAgcmVjb3JkTmFtZTogbmFtZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKHRoaXMuYXBpR2F0ZXdheSksXG4gICAgICAgIGNvbW1lbnQ6IGAke2lkfSBBUEkgZ2F0ZXdheWAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgbm9kZShcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25Qcm9wcz86IFppcEZ1bmN0aW9uUHJvcHMsXG4gICAgem9uZT86IElIb3N0ZWRab25lLFxuICAgIGRvbWFpbj86IHN0cmluZyxcbiAgKTogQXBpRnVuY3Rpb24ge1xuICAgIGNvbnN0IGxhbWJkYSA9IFppcEZ1bmN0aW9uLm5vZGUoc2NvcGUsIGlkLCBmdW5jdGlvblByb3BzKTtcbiAgICByZXR1cm4gbmV3IEFwaUZ1bmN0aW9uKHNjb3BlLCBpZCwgeyBsYW1iZGEsIHpvbmUsIGRvbWFpbiB9KTtcbiAgfVxuXG4gIHN0YXRpYyBweXRob24oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uUHJvcHM/OiBaaXBGdW5jdGlvblByb3BzLFxuICAgIHpvbmU/OiBJSG9zdGVkWm9uZSxcbiAgICBkb21haW4/OiBzdHJpbmcsXG4gICk6IEFwaUZ1bmN0aW9uIHtcbiAgICBjb25zdCBsYW1iZGEgPSBaaXBGdW5jdGlvbi5weXRob24oc2NvcGUsIGlkLCBmdW5jdGlvblByb3BzKTtcbiAgICByZXR1cm4gbmV3IEFwaUZ1bmN0aW9uKHNjb3BlLCBpZCwgeyBsYW1iZGEsIHpvbmUsIGRvbWFpbiB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjb250YWluZXIoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGZ1bmN0aW9uUHJvcHM/OiBDb250YWluZXJGdW5jdGlvblByb3BzLFxuICAgIHpvbmU/OiBJSG9zdGVkWm9uZSxcbiAgICBkb21haW4/OiBzdHJpbmcsXG4gICk6IEFwaUZ1bmN0aW9uIHtcbiAgICBjb25zdCBsYW1iZGEgPSBuZXcgQ29udGFpbmVyRnVuY3Rpb24oc2NvcGUsIGlkLCBmdW5jdGlvblByb3BzKTtcbiAgICByZXR1cm4gbmV3IEFwaUZ1bmN0aW9uKHNjb3BlLCBpZCwgeyBsYW1iZGEsIHpvbmUsIGRvbWFpbiB9KTtcbiAgfVxufVxuIl19