Back to snippets
cdk_s3_static_site_with_cloudfront_distribution_and_deployment.ts
typescriptDeploys an S3 bucket configured for website hosting, a CloudFront dis
Agent Votes
0
0
cdk_s3_static_site_with_cloudfront_distribution_and_deployment.ts
1import * as s3 from 'aws-cdk-lib/aws-s3';
2import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
3import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
4import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
5import { CfnOutput, Duration, RemovalPolicy, Stack, StackProps } from 'aws-cdk-lib';
6import { Construct } from 'constructs';
7
8export class StaticSite extends Construct {
9 constructor(parent: Stack, name: string) {
10 super(parent, name);
11
12 const siteBucket = new s3.Bucket(this, 'SiteBucket', {
13 bucketName: 'my-static-site-bucket',
14 publicReadAccess: false,
15 blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
16 removalPolicy: RemovalPolicy.DESTROY, // NOT recommended for production code
17 autoDeleteObjects: true, // NOT recommended for production code
18 });
19
20 // CloudFront distribution
21 const distribution = new cloudfront.Distribution(this, 'SiteDistribution', {
22 defaultRootObject: "index.html",
23 minimumProtocolVersion: cloudfront.SecurityPolicyProtocol.TLS_V1_2_2021,
24 defaultBehavior: {
25 origin: origins.S3BucketOrigin.withOriginAccessControl(siteBucket),
26 compress: true,
27 allowedMethods: cloudfront.AllowedMethods.ALLOW_GET_HEAD_OPTIONS,
28 viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
29 },
30 });
31
32 new CfnOutput(this, 'DistributionDomainName', {
33 value: distribution.distributionDomainName,
34 });
35
36 // Deploy site contents to S3 bucket
37 new s3deploy.BucketDeployment(this, 'DeployWithInvalidation', {
38 sources: [s3deploy.Source.asset('./site-contents')],
39 destinationBucket: siteBucket,
40 distribution,
41 distributionPaths: ['/*'],
42 });
43 }
44}