@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.
61 lines • 9.41 kB
JavaScript
"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,
bucketType: aws_secure_bucket_1.SecureBucketType.CLOUD_FRONT_ORIGIN,
});
// 👇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,
priceClass: props.cloudFrontOptions?.priceClass,
});
// 👇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.1.17" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvRUFBOEU7QUFDOUUsd0lBQTRIO0FBQzVILG1DQUFtQztBQUNuQywwREFBMEQ7QUFFMUQsbURBQW1EO0FBQ25ELHlEQUF5RDtBQUN6RCx5Q0FBeUM7QUFDekMsMERBQTBEO0FBZ0IxRCxNQUFhLHlCQUEwQixTQUFRLEdBQUcsQ0FBQyxLQUFLO0lBQ3RELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsNENBQTRDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLElBQUksZ0NBQVksQ0FBQyxJQUFJLEVBQUUsOEJBQThCLEVBQUU7WUFDMUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7WUFDbEMsVUFBVSxFQUFFLG9DQUFnQixDQUFDLGtCQUFrQjtTQUNoRCxDQUFDLENBQUM7UUFFSCxxQkFBcUI7UUFDckIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQ2pGLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtZQUNoQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsMENBQTBDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQzNELFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtZQUM1QixVQUFVLEVBQUUsR0FBRyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7U0FDMUQsQ0FBQyxDQUFDO1FBRUgscURBQXFEO1FBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksZ0dBQTBDLENBQUMsSUFBSSxFQUFFLDRDQUE0QyxFQUFFO1lBQ3RILE9BQU8sRUFBRSxnQ0FBZ0M7WUFDekMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQztZQUMvRSxXQUFXLEVBQUUsV0FBVztZQUN4QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsWUFBWSxFQUFFLFlBQVk7WUFDMUIsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxVQUFVO1NBQ2hELENBQUMsQ0FBQztRQUVILHlCQUF5QjtRQUN6QixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN0QyxJQUFJLEVBQUUsVUFBVTtZQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hGLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsc0RBQXNEO1FBQ3RELElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUM1RCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUM3RCxpQkFBaUIsRUFBRSxZQUFZO1lBQy9CLEtBQUssRUFBRSxJQUFJO1lBQ1gsWUFBWTtZQUNaLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBaERILDhEQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlY3VyZUJ1Y2tldCwgU2VjdXJlQnVja2V0VHlwZSB9IGZyb20gJ0BnYW1tYXJlcnMvYXdzLXNlY3VyZS1idWNrZXQnO1xuaW1wb3J0IHsgU2VjdXJlRnJvbnRlbmRXZWJBcHBDbG91ZEZyb250RGlzdHJpYnV0aW9uIH0gZnJvbSAnQGdhbW1hcmVycy9hd3Mtc2VjdXJlLWZyb250ZW5kLXdlYi1hcHAtY2xvdWRmcm9udC1kaXN0cmlidXRpb24nO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGFjbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2VydGlmaWNhdGVtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1Myc7XG5pbXBvcnQgKiBhcyBhbGlhcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBzM2RlcGxveSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHByaWNlQ2xhc3M/OiBjbG91ZGZyb250LlByaWNlQ2xhc3M7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbnRlbmRXZWJBcHBEZXBsb3lTdGFja1Byb3BzIGV4dGVuZHMgY2RrLlN0YWNrUHJvcHMge1xuICByZWFkb25seSBkb21haW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhvc3RlZFpvbmVJZDogc3RyaW5nO1xuICByZWFkb25seSBvcmlnaW5CdWNrZXROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ0J1Y2tldEFybjogc3RyaW5nO1xuICByZWFkb25seSBkZXBsb3lTb3VyY2VBc3NldFBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgY2xvdWRGcm9udE9wdGlvbnM/OiBDbG91ZEZyb250T3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIEZyb250ZW5kV2ViQXBwRGVwbG95U3RhY2sgZXh0ZW5kcyBjZGsuU3RhY2sge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRnJvbnRlbmRXZWJBcHBEZXBsb3lTdGFja1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICAvLyDwn5GHQ3JlYXRlIFNlY3VyZSBDbG91ZCBGcm9udCBPcmlnaW4gQnVja2V0XG4gICAgY29uc3Qgb3JpZ2luQnVja2V0ID0gbmV3IFNlY3VyZUJ1Y2tldCh0aGlzLCAnU2VjdXJlQ2xvdWRGcm9udE9yaWdpbkJ1Y2tldCcsIHtcbiAgICAgIGJ1Y2tldE5hbWU6IHByb3BzLm9yaWdpbkJ1Y2tldE5hbWUsXG4gICAgICBidWNrZXRUeXBlOiBTZWN1cmVCdWNrZXRUeXBlLkNMT1VEX0ZST05UX09SSUdJTixcbiAgICB9KTtcblxuICAgIC8vIPCfkYdHZXQgSG9zdGVkIFpvbmUuXG4gICAgY29uc3QgaG9zdGVkWm9uZSA9IHJvdXRlNTMuSG9zdGVkWm9uZS5mcm9tSG9zdGVkWm9uZUF0dHJpYnV0ZXModGhpcywgJ0hvc3RlZFpvbmUnLCB7XG4gICAgICBob3N0ZWRab25lSWQ6IHByb3BzLmhvc3RlZFpvbmVJZCxcbiAgICAgIHpvbmVOYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgIH0pO1xuXG4gICAgLy8g8J+Rh0NyZWF0ZSBDZXJ0aWZpY2F0ZSB3aXRoIEROUyB2YWxpZGF0ZS5cbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IG5ldyBhY20uQ2VydGlmaWNhdGUodGhpcywgJ0NlcnRpZmljYXRlJywge1xuICAgICAgZG9tYWluTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHZhbGlkYXRpb246IGFjbS5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyhob3N0ZWRab25lKSxcbiAgICB9KTtcblxuICAgIC8vIPCfkYdTZWN1cmUgRnJvbnRlbmQgV2ViIEFwcCBDbG91ZEZyb250IERpc3RyaWJ1dGlvbi5cbiAgICBjb25zdCBkaXN0cmlidXRpb24gPSBuZXcgU2VjdXJlRnJvbnRlbmRXZWJBcHBDbG91ZEZyb250RGlzdHJpYnV0aW9uKHRoaXMsICdTZWN1cmVGcm9udGVuZFdlYkFwcENsb3VkRnJvbnREaXN0cmlidXRpb24nLCB7XG4gICAgICBjb21tZW50OiAnZnJvbnRlbmQgd2ViIGFwcCBkaXN0cmlidXRpb24uJyxcbiAgICAgIGFjY2Vzc0xvZ0J1Y2tldDogczMuQnVja2V0LmZyb21CdWNrZXRBcm4odGhpcywgJ0xvZ0J1Y2tldCcsIHByb3BzLmxvZ0J1Y2tldEFybiksXG4gICAgICBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGUsXG4gICAgICBkb21haW5OYW1lOiBwcm9wcy5kb21haW5OYW1lLFxuICAgICAgb3JpZ2luQnVja2V0OiBvcmlnaW5CdWNrZXQsXG4gICAgICBwcmljZUNsYXNzOiBwcm9wcy5jbG91ZEZyb250T3B0aW9ucz8ucHJpY2VDbGFzcyxcbiAgICB9KTtcblxuICAgIC8vIPCfkYdSb3V0ZSA1MyBETlMgKEFsaWFzKVxuICAgIG5ldyByb3V0ZTUzLkFSZWNvcmQodGhpcywgJ0ROU0FSZWNvcmQnLCB7XG4gICAgICB6b25lOiBob3N0ZWRab25lLFxuICAgICAgcmVjb3JkTmFtZTogcHJvcHMuZG9tYWluTmFtZSxcbiAgICAgIHRhcmdldDogcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBhbGlhcy5DbG91ZEZyb250VGFyZ2V0KGRpc3RyaWJ1dGlvbikpLFxuICAgICAgdHRsOiBjZGsuRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgIH0pO1xuXG4gICAgLy8g8J+Rh0RlcGxveSB0byBCdWNrZXQgd2l0aCBDbG91ZEZyb250IENhY2hlIGludmFsaWRhdGVcbiAgICBuZXcgczNkZXBsb3kuQnVja2V0RGVwbG95bWVudCh0aGlzLCAnRGVwbG95V2l0aEludmFsaWRhdGlvbicsIHtcbiAgICAgIHNvdXJjZXM6IFtzM2RlcGxveS5Tb3VyY2UuYXNzZXQocHJvcHMuZGVwbG95U291cmNlQXNzZXRQYXRoKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3JpZ2luQnVja2V0LFxuICAgICAgcHJ1bmU6IHRydWUsXG4gICAgICBkaXN0cmlidXRpb24sXG4gICAgICBkaXN0cmlidXRpb25QYXRoczogWycvKiddLFxuICAgIH0pO1xuICB9XG59XG4iXX0=