@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
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,
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=