UNPKG

@gammarers/aws-frontend-web-app-deploy-stack

Version:

This is an AWS CDK Construct to make deploying a Frontend Web App (SPA) deploy to S3 behind CloudFront.

60 lines • 8.85 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.FrontendWebAppDeployStack = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_secure_bucket_1 = require("@gammarers/aws-secure-bucket"); const aws_secure_frontend_web_app_cloudfront_distribution_1 = require("@gammarers/aws-secure-frontend-web-app-cloudfront-distribution"); const cdk = require("aws-cdk-lib"); const acm = require("aws-cdk-lib/aws-certificatemanager"); const route53 = require("aws-cdk-lib/aws-route53"); const alias = require("aws-cdk-lib/aws-route53-targets"); const s3 = require("aws-cdk-lib/aws-s3"); const s3deploy = require("aws-cdk-lib/aws-s3-deployment"); class FrontendWebAppDeployStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); // 👇Create Secure Cloud Front Origin Bucket const originBucket = new aws_secure_bucket_1.SecureBucket(this, 'SecureCloudFrontOriginBucket', { bucketName: props.originBucketName, isCloudFrontOriginBucket: true, }); // 👇Get Hosted Zone. const hostedZone = route53.HostedZone.fromHostedZoneAttributes(this, 'HostedZone', { hostedZoneId: props.hostedZoneId, zoneName: props.domainName, }); // 👇Create Certificate with DNS validate. const certificate = new acm.Certificate(this, 'Certificate', { domainName: props.domainName, validation: acm.CertificateValidation.fromDns(hostedZone), }); // 👇Secure Frontend Web App CloudFront Distribution. const distribution = new aws_secure_frontend_web_app_cloudfront_distribution_1.SecureFrontendWebAppCloudFrontDistribution(this, 'SecureFrontendWebAppCloudFrontDistribution', { comment: 'frontend web app distribution.', accessLogBucket: s3.Bucket.fromBucketArn(this, 'LogBucket', props.logBucketArn), certificate: certificate, domainName: props.domainName, originBucket: originBucket, }); // 👇Route 53 DNS (Alias) new route53.ARecord(this, 'DNSARecord', { zone: hostedZone, recordName: props.domainName, target: route53.RecordTarget.fromAlias(new alias.CloudFrontTarget(distribution)), ttl: cdk.Duration.seconds(300), }); // 👇Deploy to Bucket with CloudFront Cache invalidate new s3deploy.BucketDeployment(this, 'DeployWithInvalidation', { sources: [s3deploy.Source.asset(props.deploySourceAssetPath)], destinationBucket: originBucket, prune: true, distribution, distributionPaths: ['/*'], }); } } exports.FrontendWebAppDeployStack = FrontendWebAppDeployStack; _a = JSII_RTTI_SYMBOL_1; FrontendWebAppDeployStack[_a] = { fqn: "@gammarers/aws-frontend-web-app-deploy-stack.FrontendWebAppDeployStack", version: "2.0.11" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvRUFBNEQ7QUFDNUQsd0lBQTRIO0FBQzVILG1DQUFtQztBQUNuQywwREFBMEQ7QUFDMUQsbURBQW1EO0FBQ25ELHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDekMsMERBQTBEO0FBVzFELE1BQWEseUJBQTBCLFNBQVEsR0FBRyxDQUFDLEtBQUs7SUFDdEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFxQztRQUM3RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4Qiw0Q0FBNEM7UUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxnQ0FBWSxDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRTtZQUMxRSxVQUFVLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtZQUNsQyx3QkFBd0IsRUFBRSxJQUFJO1NBQy9CLENBQUMsQ0FBQztRQUVILHFCQUFxQjtRQUNyQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDakYsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2hDLFFBQVEsRUFBRSxLQUFLLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7UUFFSCwwQ0FBMEM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDM0QsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLFVBQVUsRUFBRSxHQUFHLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUMxRCxDQUFDLENBQUM7UUFFSCxxREFBcUQ7UUFDckQsTUFBTSxZQUFZLEdBQUcsSUFBSSxnR0FBMEMsQ0FBQyxJQUFJLEVBQUUsNENBQTRDLEVBQUU7WUFDdEgsT0FBTyxFQUFFLGdDQUFnQztZQUN6QyxlQUFlLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQy9FLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixZQUFZLEVBQUUsWUFBWTtTQUMzQixDQUFDLENBQUM7UUFFSCx5QkFBeUI7UUFDekIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDdEMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoRixHQUFHLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1NBQy9CLENBQUMsQ0FBQztRQUVILHNEQUFzRDtRQUN0RCxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7WUFDNUQsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDN0QsaUJBQWlCLEVBQUUsWUFBWTtZQUMvQixLQUFLLEVBQUUsSUFBSTtZQUNYLFlBQVk7WUFDWixpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQztTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDOztBQS9DSCw4REFnREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWN1cmVCdWNrZXQgfSBmcm9tICdAZ2FtbWFyZXJzL2F3cy1zZWN1cmUtYnVja2V0JztcbmltcG9ydCB7IFNlY3VyZUZyb250ZW5kV2ViQXBwQ2xvdWRGcm9udERpc3RyaWJ1dGlvbiB9IGZyb20gJ0BnYW1tYXJlcnMvYXdzLXNlY3VyZS1mcm9udGVuZC13ZWItYXBwLWNsb3VkZnJvbnQtZGlzdHJpYnV0aW9uJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzJztcbmltcG9ydCAqIGFzIGFsaWFzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzZGVwbG95IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50JztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZyb250ZW5kV2ViQXBwRGVwbG95U3RhY2tQcm9wcyBleHRlbmRzIGNkay5TdGFja1Byb3BzIHtcbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBob3N0ZWRab25lSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgb3JpZ2luQnVja2V0TmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsb2dCdWNrZXRBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgZGVwbG95U291cmNlQXNzZXRQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBGcm9udGVuZFdlYkFwcERlcGxveVN0YWNrIGV4dGVuZHMgY2RrLlN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEZyb250ZW5kV2ViQXBwRGVwbG95U3RhY2tQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgLy8g8J+Rh0NyZWF0ZSBTZWN1cmUgQ2xvdWQgRnJvbnQgT3JpZ2luIEJ1Y2tldFxuICAgIGNvbnN0IG9yaWdpbkJ1Y2tldCA9IG5ldyBTZWN1cmVCdWNrZXQodGhpcywgJ1NlY3VyZUNsb3VkRnJvbnRPcmlnaW5CdWNrZXQnLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5vcmlnaW5CdWNrZXROYW1lLFxuICAgICAgaXNDbG91ZEZyb250T3JpZ2luQnVja2V0OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8g8J+Rh0dldCBIb3N0ZWQgWm9uZS5cbiAgICBjb25zdCBob3N0ZWRab25lID0gcm91dGU1My5Ib3N0ZWRab25lLmZyb21Ib3N0ZWRab25lQXR0cmlidXRlcyh0aGlzLCAnSG9zdGVkWm9uZScsIHtcbiAgICAgIGhvc3RlZFpvbmVJZDogcHJvcHMuaG9zdGVkWm9uZUlkLFxuICAgICAgem9uZU5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgfSk7XG5cbiAgICAvLyDwn5GHQ3JlYXRlIENlcnRpZmljYXRlIHdpdGggRE5TIHZhbGlkYXRlLlxuICAgIGNvbnN0IGNlcnRpZmljYXRlID0gbmV3IGFjbS5DZXJ0aWZpY2F0ZSh0aGlzLCAnQ2VydGlmaWNhdGUnLCB7XG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgdmFsaWRhdGlvbjogYWNtLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKGhvc3RlZFpvbmUpLFxuICAgIH0pO1xuXG4gICAgLy8g8J+Rh1NlY3VyZSBGcm9udGVuZCBXZWIgQXBwIENsb3VkRnJvbnQgRGlzdHJpYnV0aW9uLlxuICAgIGNvbnN0IGRpc3RyaWJ1dGlvbiA9IG5ldyBTZWN1cmVGcm9udGVuZFdlYkFwcENsb3VkRnJvbnREaXN0cmlidXRpb24odGhpcywgJ1NlY3VyZUZyb250ZW5kV2ViQXBwQ2xvdWRGcm9udERpc3RyaWJ1dGlvbicsIHtcbiAgICAgIGNvbW1lbnQ6ICdmcm9udGVuZCB3ZWIgYXBwIGRpc3RyaWJ1dGlvbi4nLFxuICAgICAgYWNjZXNzTG9nQnVja2V0OiBzMy5CdWNrZXQuZnJvbUJ1Y2tldEFybih0aGlzLCAnTG9nQnVja2V0JywgcHJvcHMubG9nQnVja2V0QXJuKSxcbiAgICAgIGNlcnRpZmljYXRlOiBjZXJ0aWZpY2F0ZSxcbiAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICBvcmlnaW5CdWNrZXQ6IG9yaWdpbkJ1Y2tldCxcbiAgICB9KTtcblxuICAgIC8vIPCfkYdSb3V0ZSA1MyBETlMgKEFsaWFzKVxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgJ0ROU0FSZWNvcmQnLCB7XG4gICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBhbGlhcy5DbG91ZEZyb250VGFyZ2V0KGRpc3RyaWJ1dGlvbikpLFxuICAgICAgdHRsOiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgIH0pO1xuXG4gICAgLy8g8J+Rh0RlcGxveSB0byBCdWNrZXQgd2l0aCBDbG91ZEZyb250IENhY2hlIGludmFsaWRhdGVcbiAgICBuZXcgczNkZXBsb3kuQnVja2V0RGVwbG95bWVudCh0aGlzLCAnRGVwbG95V2l0aEludmFsaWRhdGlvbicsIHtcbiAgICAgIHNvdXJjZXM6IFtzM2RlcGxveS5Tb3VyY2UuYXNzZXQocHJvcHMuZGVwbG95U291cmNlQXNzZXRQYXRoKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3JpZ2luQnVja2V0LFxuICAgICAgcHJ1bmU6IHRydWUsXG4gICAgICBkaXN0cmlidXRpb24sXG4gICAgICBkaXN0cmlidXRpb25QYXRoczogWycvKiddLFxuICAgIH0pO1xuICB9XG59XG4iXX0=