aws-cdk-image-resize
Version:
AWS CDK construct to easily setup the required arquitecture to serve performant responsive images.
87 lines • 12.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
};
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ImageResize = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const cloudfront = require("aws-cdk-lib/aws-cloudfront");
const origins = require("aws-cdk-lib/aws-cloudfront-origins");
const lambda = require("aws-cdk-lib/aws-lambda");
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
const s3 = require("aws-cdk-lib/aws-s3");
const constructs_1 = require("constructs");
__exportStar(require("./types"), exports);
class ImageResize extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
const { s3BucketProps, originResponseLambdaProps, viewerRequestLambdaProps, cloudfrontDistributionProps } = props || {};
this.imagesBucket = new s3.Bucket(this, 'Bucket', s3BucketProps);
this.imageOriginResponseLambda = new aws_lambda_nodejs_1.NodejsFunction(this, 'OriginResponseFunction', {
bundling: {
minify: true,
nodeModules: ['sharp'],
},
entry: `${__dirname}/../lambda/image-origin-response-function/index.js`,
functionName: 'image-origin-response-function',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_12_X,
timeout: aws_cdk_lib_1.Duration.seconds(15),
...originResponseLambdaProps,
});
this.imagesBucket.grantRead(this.imageOriginResponseLambda);
this.imagesBucket.grantPut(this.imageOriginResponseLambda);
this.imageViewerRequestLambda = new lambda.Function(this, 'ViewerRequestFunction', {
code: lambda.Code.fromAsset(`${__dirname}/../lambda/image-viewer-request-function`),
functionName: 'image-viewer-request-function',
handler: 'index.handler',
runtime: lambda.Runtime.NODEJS_12_X,
...viewerRequestLambdaProps,
});
const cachePolicy = new cloudfront.CachePolicy(this, 'CachePolicy', {
cachePolicyName: 'images-cache-policy',
defaultTtl: aws_cdk_lib_1.Duration.days(365),
enableAcceptEncodingBrotli: true,
enableAcceptEncodingGzip: true,
maxTtl: aws_cdk_lib_1.Duration.days(365 * 2),
minTtl: aws_cdk_lib_1.Duration.days(30 * 3),
queryStringBehavior: cloudfront.CacheQueryStringBehavior.allowList('height', 'width'),
});
const originAccessIdentity = new cloudfront.OriginAccessIdentity(this, 'OAI');
this.imagesBucket.grantRead(originAccessIdentity);
// Cloudfront distribution for the S3 bucket.
this.distribution = new cloudfront.Distribution(this, 'Distribution', {
...cloudfrontDistributionProps,
defaultBehavior: {
origin: new origins.S3Origin(this.imagesBucket, { originAccessIdentity }),
cachePolicy,
edgeLambdas: [
{
eventType: cloudfront.LambdaEdgeEventType.ORIGIN_RESPONSE,
functionVersion: this.imageOriginResponseLambda.currentVersion,
},
{
eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
functionVersion: this.imageViewerRequestLambda.currentVersion,
},
],
viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
compress: true,
...cloudfrontDistributionProps?.defaultBehavior,
},
});
}
}
exports.ImageResize = ImageResize;
_a = JSII_RTTI_SYMBOL_1;
ImageResize[_a] = { fqn: "aws-cdk-image-resize.ImageResize", version: "0.0.21" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLHlEQUF5RDtBQUN6RCw4REFBOEQ7QUFDOUQsaURBQWlEO0FBQ2pELHFFQUFvRjtBQUNwRix5Q0FBeUM7QUFDekMsMkNBQXVDO0FBRXZDLDBDQUF3QjtBQVN4QixNQUFhLFdBQVksU0FBUSxzQkFBUztJQU14QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXlCO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUFFLGFBQWEsRUFBRSx5QkFBeUIsRUFBRSx3QkFBd0IsRUFBRSwyQkFBMkIsRUFBRSxHQUN2RyxLQUFLLElBQUksRUFBRSxDQUFDO1FBRWQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxrQ0FBYyxDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUNsRixRQUFRLEVBQUU7Z0JBQ1IsTUFBTSxFQUFFLElBQUk7Z0JBQ1osV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO2FBQ3ZCO1lBQ0QsS0FBSyxFQUFFLEdBQUcsU0FBUyxvREFBb0Q7WUFDdkUsWUFBWSxFQUFFLGdDQUFnQztZQUM5QyxPQUFPLEVBQUUsU0FBUztZQUNsQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDN0IsR0FBRyx5QkFBeUI7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFM0QsSUFBSSxDQUFDLHdCQUF3QixHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLEVBQUU7WUFDakYsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUywwQ0FBMEMsQ0FBQztZQUNuRixZQUFZLEVBQUUsK0JBQStCO1lBQzdDLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsR0FBRyx3QkFBd0I7U0FDNUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDbEUsZUFBZSxFQUFFLHFCQUFxQjtZQUN0QyxVQUFVLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQzlCLDBCQUEwQixFQUFFLElBQUk7WUFDaEMsd0JBQXdCLEVBQUUsSUFBSTtZQUM5QixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUM5QixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3QixtQkFBbUIsRUFBRSxVQUFVLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7U0FDdEYsQ0FBQyxDQUFDO1FBRUgsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUVsRCw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNwRSxHQUFHLDJCQUEyQjtZQUM5QixlQUFlLEVBQUU7Z0JBQ2YsTUFBTSxFQUFFLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztnQkFDekUsV0FBVztnQkFDWCxXQUFXLEVBQUU7b0JBQ1g7d0JBQ0UsU0FBUyxFQUFFLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlO3dCQUN6RCxlQUFlLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWM7cUJBQy9EO29CQUNEO3dCQUNFLFNBQVMsRUFBRSxVQUFVLENBQUMsbUJBQW1CLENBQUMsY0FBYzt3QkFDeEQsZUFBZSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxjQUFjO3FCQUM5RDtpQkFDRjtnQkFDRCxvQkFBb0IsRUFBRSxVQUFVLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCO2dCQUN2RSxRQUFRLEVBQUUsSUFBSTtnQkFDZCxHQUFHLDJCQUEyQixFQUFFLGVBQWU7YUFDaEQ7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXhFSCxrQ0F5RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgb3JpZ2lucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uLCBOb2RlanNGdW5jdGlvblByb3BzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRGlzdHJpYnV0aW9uUHJvcHMsIEZ1bmN0aW9uUHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElJbWFnZVJlc2l6ZVByb3BzIHtcbiAgY2xvdWRmcm9udERpc3RyaWJ1dGlvblByb3BzPzogRGlzdHJpYnV0aW9uUHJvcHM7XG4gIG9yaWdpblJlc3BvbnNlTGFtYmRhUHJvcHM/OiBOb2RlanNGdW5jdGlvblByb3BzO1xuICBzM0J1Y2tldFByb3BzPzogczMuQnVja2V0UHJvcHM7XG4gIHZpZXdlclJlcXVlc3RMYW1iZGFQcm9wcz86IEZ1bmN0aW9uUHJvcHM7XG59XG5cbmV4cG9ydCBjbGFzcyBJbWFnZVJlc2l6ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGRpc3RyaWJ1dGlvbjogY2xvdWRmcm9udC5EaXN0cmlidXRpb247XG4gIGltYWdlT3JpZ2luUmVzcG9uc2VMYW1iZGE6IE5vZGVqc0Z1bmN0aW9uO1xuICBpbWFnZXNCdWNrZXQ6IHMzLkJ1Y2tldDtcbiAgaW1hZ2VWaWV3ZXJSZXF1ZXN0TGFtYmRhOiBsYW1iZGEuRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBJSW1hZ2VSZXNpemVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7IHMzQnVja2V0UHJvcHMsIG9yaWdpblJlc3BvbnNlTGFtYmRhUHJvcHMsIHZpZXdlclJlcXVlc3RMYW1iZGFQcm9wcywgY2xvdWRmcm9udERpc3RyaWJ1dGlvblByb3BzIH0gPVxuICAgICAgcHJvcHMgfHwge307XG5cbiAgICB0aGlzLmltYWdlc0J1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0J1Y2tldCcsIHMzQnVja2V0UHJvcHMpO1xuXG4gICAgdGhpcy5pbWFnZU9yaWdpblJlc3BvbnNlTGFtYmRhID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdPcmlnaW5SZXNwb25zZUZ1bmN0aW9uJywge1xuICAgICAgYnVuZGxpbmc6IHtcbiAgICAgICAgbWluaWZ5OiB0cnVlLFxuICAgICAgICBub2RlTW9kdWxlczogWydzaGFycCddLFxuICAgICAgfSxcbiAgICAgIGVudHJ5OiBgJHtfX2Rpcm5hbWV9Ly4uL2xhbWJkYS9pbWFnZS1vcmlnaW4tcmVzcG9uc2UtZnVuY3Rpb24vaW5kZXguanNgLFxuICAgICAgZnVuY3Rpb25OYW1lOiAnaW1hZ2Utb3JpZ2luLXJlc3BvbnNlLWZ1bmN0aW9uJyxcbiAgICAgIGhhbmRsZXI6ICdoYW5kbGVyJyxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xMl9YLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygxNSksXG4gICAgICAuLi5vcmlnaW5SZXNwb25zZUxhbWJkYVByb3BzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbWFnZXNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMuaW1hZ2VPcmlnaW5SZXNwb25zZUxhbWJkYSk7XG4gICAgdGhpcy5pbWFnZXNCdWNrZXQuZ3JhbnRQdXQodGhpcy5pbWFnZU9yaWdpblJlc3BvbnNlTGFtYmRhKTtcblxuICAgIHRoaXMuaW1hZ2VWaWV3ZXJSZXF1ZXN0TGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCAnVmlld2VyUmVxdWVzdEZ1bmN0aW9uJywge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGAke19fZGlybmFtZX0vLi4vbGFtYmRhL2ltYWdlLXZpZXdlci1yZXF1ZXN0LWZ1bmN0aW9uYCksXG4gICAgICBmdW5jdGlvbk5hbWU6ICdpbWFnZS12aWV3ZXItcmVxdWVzdC1mdW5jdGlvbicsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMTJfWCxcbiAgICAgIC4uLnZpZXdlclJlcXVlc3RMYW1iZGFQcm9wcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhY2hlUG9saWN5ID0gbmV3IGNsb3VkZnJvbnQuQ2FjaGVQb2xpY3kodGhpcywgJ0NhY2hlUG9saWN5Jywge1xuICAgICAgY2FjaGVQb2xpY3lOYW1lOiAnaW1hZ2VzLWNhY2hlLXBvbGljeScsXG4gICAgICBkZWZhdWx0VHRsOiBEdXJhdGlvbi5kYXlzKDM2NSksIC8vIDEgeWVhclxuICAgICAgZW5hYmxlQWNjZXB0RW5jb2RpbmdCcm90bGk6IHRydWUsXG4gICAgICBlbmFibGVBY2NlcHRFbmNvZGluZ0d6aXA6IHRydWUsXG4gICAgICBtYXhUdGw6IER1cmF0aW9uLmRheXMoMzY1ICogMiksIC8vIDIgeWVhcnNcbiAgICAgIG1pblR0bDogRHVyYXRpb24uZGF5cygzMCAqIDMpLCAvLyAzIG1vbnRoc1xuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogY2xvdWRmcm9udC5DYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IuYWxsb3dMaXN0KCdoZWlnaHQnLCAnd2lkdGgnKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9yaWdpbkFjY2Vzc0lkZW50aXR5ID0gbmV3IGNsb3VkZnJvbnQuT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgJ09BSScpO1xuICAgIHRoaXMuaW1hZ2VzQnVja2V0LmdyYW50UmVhZChvcmlnaW5BY2Nlc3NJZGVudGl0eSk7XG5cbiAgICAvLyBDbG91ZGZyb250IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIFMzIGJ1Y2tldC5cbiAgICB0aGlzLmRpc3RyaWJ1dGlvbiA9IG5ldyBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbih0aGlzLCAnRGlzdHJpYnV0aW9uJywge1xuICAgICAgLi4uY2xvdWRmcm9udERpc3RyaWJ1dGlvblByb3BzLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogbmV3IG9yaWdpbnMuUzNPcmlnaW4odGhpcy5pbWFnZXNCdWNrZXQsIHsgb3JpZ2luQWNjZXNzSWRlbnRpdHkgfSksXG4gICAgICAgIGNhY2hlUG9saWN5LFxuICAgICAgICBlZGdlTGFtYmRhczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogY2xvdWRmcm9udC5MYW1iZGFFZGdlRXZlbnRUeXBlLk9SSUdJTl9SRVNQT05TRSxcbiAgICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogdGhpcy5pbWFnZU9yaWdpblJlc3BvbnNlTGFtYmRhLmN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXZlbnRUeXBlOiBjbG91ZGZyb250LkxhbWJkYUVkZ2VFdmVudFR5cGUuVklFV0VSX1JFUVVFU1QsXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246IHRoaXMuaW1hZ2VWaWV3ZXJSZXF1ZXN0TGFtYmRhLmN1cnJlbnRWZXJzaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBjbG91ZGZyb250LlZpZXdlclByb3RvY29sUG9saWN5LlJFRElSRUNUX1RPX0hUVFBTLFxuICAgICAgICBjb21wcmVzczogdHJ1ZSxcbiAgICAgICAgLi4uY2xvdWRmcm9udERpc3RyaWJ1dGlvblByb3BzPy5kZWZhdWx0QmVoYXZpb3IsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=