Back to snippets

cdk_s3_static_site_with_cloudfront_distribution_and_deployment.ts

typescript

Deploys 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}