diff --git a/README.md b/README.md index c012624..fbf1584 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ -# nodejs-aws-cdk-starter \ No newline at end of file +# nodejs-aws-cdk-starter + +Task 2.1 Manual Deployment +### [S3-website](https://nodejs-aws-shop-react1.s3.eu-west-1.amazonaws.com/index.html) and [CloudFront URL](https://d82d3iyhzejev.cloudfront.net) + +Task 2.2 Automated Deployment +###[Domain name](https://d1qg6ersmgr5de.cloudfront.net/) +###[CloudFront](https://js-cc-cloudfront-s33.s3.eu-west-1.amazonaws.com/) +Task 2.3 Automated Deployment +Here done diff --git a/static-site.js b/static-site.js new file mode 100644 index 0000000..cddcdca --- /dev/null +++ b/static-site.js @@ -0,0 +1,45 @@ +#!/usr/bin/env node +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StaticSite = void 0; +const s3 = require("@aws-cdk/aws-s3"); +const s3deploy = require("@aws-cdk/aws-s3-deployment"); +const cloudfront = require("@aws-cdk/aws-cloudfront"); +const iam = require("@aws-cdk/aws-iam"); +const core_1 = require("@aws-cdk/core"); +class StaticSite extends core_1.Construct { + constructor(parent, name) { + super(parent, name); + const cloudfrontOAI = new cloudfront.OriginAccessIdentity(this, "JSCC-OAI"); + const siteBucket = new s3.Bucket(this, "JSCCStaticBucket", { + bucketName: "js-cc-cloudfront-s33", + websiteIndexDocument: 'index.html', + publicReadAccess: false, + blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL + }); + siteBucket.addToResourcePolicy(new iam.PolicyStatement({ + actions: ["s3:GetObject"], + resources: [siteBucket.arnForObjects("*")], + principals: [new iam.CanonicalUserPrincipal(cloudfrontOAI.cloudFrontOriginAccessIdentityS3CanonicalUserId)] + })); + const distribution = new cloudfront.CloudFrontWebDistribution(this, 'JSCCStaticDistribution', { + originConfigs: [{ + s3OriginSource: { + s3BucketSource: siteBucket, + originAccessIdentity: cloudfrontOAI + }, + behaviors: [{ + isDefaultBehavior: true + }] + }] + }); + new s3deploy.BucketDeployment(this, "JSCC-Bucket-Deployment", { + sources: [s3deploy.Source.asset("./website")], + destinationBucket: siteBucket, + distribution, + distributionPaths: ["/*"] + }); + } +} +exports.StaticSite = StaticSite; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGljLXNpdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGF0aWMtc2l0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBR0Esc0NBQXNDO0FBQ3RDLHVEQUF1RDtBQUN2RCxzREFBc0Q7QUFDdEQsd0NBQXdDO0FBQ3hDLHdDQUFpRDtBQUVqRCxNQUFhLFVBQVcsU0FBUSxnQkFBUztJQUN2QyxZQUFZLE1BQWEsRUFBRSxJQUFZO1FBQ3JDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxVQUFVLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDdkQsVUFBVSxFQUFFLHNCQUFzQjtZQUNsQyxvQkFBb0IsRUFBRSxZQUFZO1lBQ2xDLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVM7U0FDcEQsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUNuRCxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUM7WUFDekIsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUM5RyxDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sWUFBWSxHQUFHLElBQUksVUFBVSxDQUFDLHlCQUF5QixDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUMxRixhQUFhLEVBQUUsQ0FBQztvQkFDUixjQUFjLEVBQUU7d0JBQ1osY0FBYyxFQUFFLFVBQVU7d0JBQzFCLG9CQUFvQixFQUFFLGFBQWE7cUJBQ3RDO29CQUNELFNBQVMsRUFBRSxDQUFDOzRCQUNKLGlCQUFpQixFQUFFLElBQUk7eUJBQzFCLENBQUM7aUJBQ1QsQ0FBQztTQUNULENBQUMsQ0FBQztRQUNILElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSx3QkFBd0IsRUFBRTtZQUMxRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxpQkFBaUIsRUFBRSxVQUFVO1lBQzdCLFlBQVk7WUFDWixpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQztTQUM1QixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFsQ0QsZ0NBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy9AdHMtbm9jaGVja1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnQGF3cy1jZGsvYXdzLXMzJztcbmltcG9ydCAqIGFzIHMzZGVwbG95IGZyb20gJ0Bhd3MtY2RrL2F3cy1zMy1kZXBsb3ltZW50JztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ0Bhd3MtY2RrL2F3cy1pYW0nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBTdGFjayB9IGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgU3RhdGljU2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogU3RhY2ssIG5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKHBhcmVudCwgbmFtZSk7XG5cbiAgICBjb25zdCBjbG91ZGZyb250T0FJID0gbmV3IGNsb3VkZnJvbnQuT3JpZ2luQWNjZXNzSWRlbnRpdHkodGhpcywgXCJKU0NDLU9BSVwiKTtcbiAgICAgICAgY29uc3Qgc2l0ZUJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgXCJKU0NDU3RhdGljQnVja2V0XCIsIHtcbiAgICAgICAgICAgIGJ1Y2tldE5hbWU6IFwianMtY2MtY2xvdWRmcm9udC1zMzNcIixcbiAgICAgICAgICAgIHdlYnNpdGVJbmRleERvY3VtZW50OiAnaW5kZXguaHRtbCcsXG4gICAgICAgICAgICBwdWJsaWNSZWFkQWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTExcbiAgICAgICAgfSk7XG4gICAgICAgIHNpdGVCdWNrZXQuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJzMzpHZXRPYmplY3RcIl0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtzaXRlQnVja2V0LmFybkZvck9iamVjdHMoXCIqXCIpXSxcbiAgICAgICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkNhbm9uaWNhbFVzZXJQcmluY2lwYWwoY2xvdWRmcm9udE9BSS5jbG91ZEZyb250T3JpZ2luQWNjZXNzSWRlbnRpdHlTM0Nhbm9uaWNhbFVzZXJJZCldXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IGNsb3VkZnJvbnQuQ2xvdWRGcm9udFdlYkRpc3RyaWJ1dGlvbih0aGlzLCAnSlNDQ1N0YXRpY0Rpc3RyaWJ1dGlvbicsIHtcbiAgICAgICAgICAgIG9yaWdpbkNvbmZpZ3M6IFt7XG4gICAgICAgICAgICAgICAgICAgIHMzT3JpZ2luU291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzM0J1Y2tldFNvdXJjZTogc2l0ZUJ1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkFjY2Vzc0lkZW50aXR5OiBjbG91ZGZyb250T0FJXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yczogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRCZWhhdmlvcjogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICB9KTtcbiAgICAgICAgbmV3IHMzZGVwbG95LkJ1Y2tldERlcGxveW1lbnQodGhpcywgXCJKU0NDLUJ1Y2tldC1EZXBsb3ltZW50XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZXM6IFtzM2RlcGxveS5Tb3VyY2UuYXNzZXQoXCIuL3dlYnNpdGVcIildLFxuICAgICAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHNpdGVCdWNrZXQsXG4gICAgICAgICAgICBkaXN0cmlidXRpb24sXG4gICAgICAgICAgICBkaXN0cmlidXRpb25QYXRoczogW1wiLypcIl1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/static-site.ts b/static-site.ts index f50ab4f..222e6bc 100644 --- a/static-site.ts +++ b/static-site.ts @@ -11,6 +11,34 @@ export class StaticSite extends Construct { constructor(parent: Stack, name: string) { super(parent, name); - - } + const cloudfrontOAI = new cloudfront.OriginAccessIdentity(this, "JSCC-OAI"); + const siteBucket = new s3.Bucket(this, "JSCCStaticBucket", { + bucketName: "js-cc-cloudfront-s33", + websiteIndexDocument: 'index.html', + publicReadAccess: false, + blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL + }); + siteBucket.addToResourcePolicy(new iam.PolicyStatement({ + actions: ["s3:GetObject"], + resources: [siteBucket.arnForObjects("*")], + principals: [new iam.CanonicalUserPrincipal(cloudfrontOAI.cloudFrontOriginAccessIdentityS3CanonicalUserId)] + })); + const distribution = new cloudfront.CloudFrontWebDistribution(this, 'JSCCStaticDistribution', { + originConfigs: [{ + s3OriginSource: { + s3BucketSource: siteBucket, + originAccessIdentity: cloudfrontOAI + }, + behaviors: [{ + isDefaultBehavior: true + }] + }] + }); + new s3deploy.BucketDeployment(this, "JSCC-Bucket-Deployment", { + sources: [s3deploy.Source.asset("./website")], + destinationBucket: siteBucket, + distribution, + distributionPaths: ["/*"] + }); + } }