From 31952bfaab9ed7851d876d684abf776e20613254 Mon Sep 17 00:00:00 2001 From: Sam Hatoum Date: Wed, 19 Aug 2020 12:28:32 -0400 Subject: [PATCH] Added deployment --- README.md | 27 +- documentation/package.json | 3 +- documentation/scripts/deployToS3.sh | 11 + .../cloudformation-template-create-stack.json | 67 ++ .../cloudformation-template-update-stack.json | 315 ++++++++ .../.serverless/serverless-state.json | 695 ++++++++++++++++++ documentation/serverless/serverless.yml | 173 +++++ images/chimp.png | Bin 0 -> 51901 bytes 8 files changed, 1286 insertions(+), 5 deletions(-) create mode 100644 documentation/scripts/deployToS3.sh create mode 100644 documentation/serverless/.serverless/cloudformation-template-create-stack.json create mode 100644 documentation/serverless/.serverless/cloudformation-template-update-stack.json create mode 100644 documentation/serverless/.serverless/serverless-state.json create mode 100644 documentation/serverless/serverless.yml create mode 100644 images/chimp.png diff --git a/README.md b/README.md index 7843f4eb..5dacb0c4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,24 @@ -# Chimp +# +![Chimp by Xolv.io](./images/chimp.png?raw=true) +# -## Your Quality Faster Companion - -Please go to http://chimpjs.com for documentation +# IMPORTANT ANNOUNCEMENT - July 22nd, 2018 + +The Chimp that you know and love is now being split into two separate projects, both of which are intended to help you deliver higher quality faster. + +The first is [*Chimpy*](https://github.com/TheBrainFamily/chimpy). This project will continue evolving and supporting the current thinking behind Chimp 1.x. + +The second is [*Chimp 2.0*](https://github.com/xolvio/chimp). This project will be built from scratch based on the learnings made while using Chimp 1.x in the field. + +For more details about this decision, [please see the full announcement here.](https://medium.com/@sam_hatoum/the-future-of-chimp-js-e911f8e9aaa6) + +## Chimp 2.0 +Chimp 2.0 is likely to be a [Yeoman](http://yeoman.io/) for quality. The intention is to have Chimp be your companion that you can call on to help you create high quality code that is optimized for changes + +## Quality Faster +Please checkout the new [Quality Faster](https://www.qualityfaster.com) guide where you can learn how to build quality in to your application across the full stack. + +Anyone that purchased The Meteor Testing Manual will get this guide for free. [See here for the announcement](https://www.qualityfaster.com/landing/meteor-testing.html). + +## Community +**Slack:** Please join our Slack [xolv.io/community](http://community.xolv.io) #chimp channel, where you can chat, find help and help others. (it might take a minute for the free Now.sh serverless function to start up!) diff --git a/documentation/package.json b/documentation/package.json index 36525475..1824f480 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -7,7 +7,8 @@ "start": "docusaurus start", "build": "docusaurus build", "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", + "deploy": "sh ./scripts/deployToS3.sh s3://www.chimpjs.com && yarn run invalidate", + "invalidate": "aws cloudfront create-invalidation --distribution-id $XOLVIO_WEBSITE_DISTRIBUTION_ID --paths \"/*\"", "serve": "docusaurus serve" }, "dependencies": { diff --git a/documentation/scripts/deployToS3.sh b/documentation/scripts/deployToS3.sh new file mode 100644 index 00000000..6b8103d2 --- /dev/null +++ b/documentation/scripts/deployToS3.sh @@ -0,0 +1,11 @@ +echo "Cleaning the bucket $1" + +aws s3 rm $1 --recursive + +#echo "Syncing gzipped files to bucket $1" +#aws s3 sync ./build/ $1 \ +#--include "*" --acl public-read --cache-control max-age=31556926,public --content-encoding gzip \ +#--delete \ + +echo "Syncing non-gzipped files to bucket $1" +aws s3 sync ./build/ $1 --acl public-read --cache-control max-age=31556926,public diff --git a/documentation/serverless/.serverless/cloudformation-template-create-stack.json b/documentation/serverless/.serverless/cloudformation-template-create-stack.json new file mode 100644 index 00000000..aadbe3b2 --- /dev/null +++ b/documentation/serverless/.serverless/cloudformation-template-create-stack.json @@ -0,0 +1,67 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "ServerlessDeploymentBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + } + } + }, + "ServerlessDeploymentBucketPolicy": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "ServerlessDeploymentBucket" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Effect": "Deny", + "Principal": "*", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Ref": "ServerlessDeploymentBucket" + }, + "/*" + ] + ] + } + ], + "Condition": { + "Bool": { + "aws:SecureTransport": false + } + } + } + ] + } + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": { + "Ref": "ServerlessDeploymentBucket" + } + } + } +} \ No newline at end of file diff --git a/documentation/serverless/.serverless/cloudformation-template-update-stack.json b/documentation/serverless/.serverless/cloudformation-template-update-stack.json new file mode 100644 index 00000000..64b42995 --- /dev/null +++ b/documentation/serverless/.serverless/cloudformation-template-update-stack.json @@ -0,0 +1,315 @@ +{ + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "ServerlessDeploymentBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + } + } + }, + "ServerlessDeploymentBucketPolicy": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "ServerlessDeploymentBucket" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Effect": "Deny", + "Principal": "*", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Ref": "ServerlessDeploymentBucket" + }, + "/*" + ] + ] + } + ], + "Condition": { + "Bool": { + "aws:SecureTransport": false + } + } + } + ] + } + } + }, + "DomainZone": { + "Type": "AWS::Route53::HostedZone", + "Properties": { + "Name": "chimpjs.com", + "HostedZoneConfig": { + "Comment": "Created on August 19 2020 to codify DNS" + } + } + }, + "Certificate": { + "Type": "AWS::CertificateManager::Certificate", + "Properties": { + "DomainName": "*.chimpjs.com", + "SubjectAlternativeNames": [ + "chimpjs.com", + "*.chimpjs.com" + ], + "DomainValidationOptions": [ + { + "DomainName": "chimpjs.com", + "ValidationDomain": "chimpjs.com" + } + ] + } + }, + "WebsiteBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "www.chimpjs.com", + "AccessControl": "Private", + "WebsiteConfiguration": { + "IndexDocument": "index.html", + "ErrorDocument": "error.html" + } + } + }, + "WebsiteDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "www.chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "WebsiteOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "DefaultRootObject": "index.html", + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "WebsiteOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "WebsiteBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ], + "CustomErrorResponses": [ + { + "ErrorCode": "403", + "ErrorCachingMinTTL": 1, + "ResponseCode": 403, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "404", + "ErrorCachingMinTTL": 1, + "ResponseCode": 404, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "500", + "ErrorCachingMinTTL": 1, + "ResponseCode": 500, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "502", + "ErrorCachingMinTTL": 1, + "ResponseCode": 502, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "503", + "ErrorCachingMinTTL": 1, + "ResponseCode": 503, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "504", + "ErrorCachingMinTTL": 1, + "ResponseCode": 504, + "ResponsePagePath": "/index.html" + } + ] + } + } + }, + "WebsiteDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "www.chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "WebsiteDistribution", + "DomainName" + ] + } + } + }, + { + "Name": "www.chimpjs.com.", + "Type": "TXT", + "ResourceRecords": [ + "\"google-site-verification=TwPZPfFdTvgtB94eKQtEAbWWU7_S59xKF8WU8WtwkMQ\"" + ], + "TTL": "300" + } + ] + } + }, + "RedirectBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "chimpjs.com", + "AccessControl": "PublicRead", + "WebsiteConfiguration": { + "RedirectAllRequestsTo": { + "HostName": "www.chimpjs.com", + "Protocol": "https" + } + } + } + }, + "RedirectDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "RedirectOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "RedirectOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "RedirectBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ] + } + } + }, + "RedirectDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "RedirectDistribution", + "DomainName" + ] + } + } + } + ] + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": { + "Ref": "ServerlessDeploymentBucket" + } + } + } +} \ No newline at end of file diff --git a/documentation/serverless/.serverless/serverless-state.json b/documentation/serverless/.serverless/serverless-state.json new file mode 100644 index 00000000..5866fc37 --- /dev/null +++ b/documentation/serverless/.serverless/serverless-state.json @@ -0,0 +1,695 @@ +{ + "service": { + "service": "www-chimpjs-com", + "serviceObject": { + "name": "www-chimpjs-com" + }, + "provider": { + "stage": "prod", + "variableSyntax": "\\${([^{}]+?)}", + "runtime": "nodejs10.x", + "name": "aws", + "region": "us-east-1", + "versionFunctions": true, + "compiledCloudFormationTemplate": { + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "ServerlessDeploymentBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + } + } + }, + "ServerlessDeploymentBucketPolicy": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "ServerlessDeploymentBucket" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Effect": "Deny", + "Principal": "*", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Ref": "ServerlessDeploymentBucket" + }, + "/*" + ] + ] + } + ], + "Condition": { + "Bool": { + "aws:SecureTransport": false + } + } + } + ] + } + } + }, + "DomainZone": { + "Type": "AWS::Route53::HostedZone", + "Properties": { + "Name": "chimpjs.com", + "HostedZoneConfig": { + "Comment": "Created on August 19 2020 to codify DNS" + } + } + }, + "Certificate": { + "Type": "AWS::CertificateManager::Certificate", + "Properties": { + "DomainName": "*.chimpjs.com", + "SubjectAlternativeNames": [ + "chimpjs.com", + "*.chimpjs.com" + ], + "DomainValidationOptions": [ + { + "DomainName": "chimpjs.com", + "ValidationDomain": "chimpjs.com" + } + ] + } + }, + "WebsiteBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "www.chimpjs.com", + "AccessControl": "Private", + "WebsiteConfiguration": { + "IndexDocument": "index.html", + "ErrorDocument": "error.html" + } + } + }, + "WebsiteDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "www.chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "WebsiteOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "DefaultRootObject": "index.html", + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "WebsiteOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "WebsiteBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ], + "CustomErrorResponses": [ + { + "ErrorCode": "403", + "ErrorCachingMinTTL": 1, + "ResponseCode": 403, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "404", + "ErrorCachingMinTTL": 1, + "ResponseCode": 404, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "500", + "ErrorCachingMinTTL": 1, + "ResponseCode": 500, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "502", + "ErrorCachingMinTTL": 1, + "ResponseCode": 502, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "503", + "ErrorCachingMinTTL": 1, + "ResponseCode": 503, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "504", + "ErrorCachingMinTTL": 1, + "ResponseCode": 504, + "ResponsePagePath": "/index.html" + } + ] + } + } + }, + "WebsiteDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "www.chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "WebsiteDistribution", + "DomainName" + ] + } + } + }, + { + "Name": "www.chimpjs.com.", + "Type": "TXT", + "ResourceRecords": [ + "\"google-site-verification=TwPZPfFdTvgtB94eKQtEAbWWU7_S59xKF8WU8WtwkMQ\"" + ], + "TTL": "300" + } + ] + } + }, + "RedirectBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "chimpjs.com", + "AccessControl": "PublicRead", + "WebsiteConfiguration": { + "RedirectAllRequestsTo": { + "HostName": "www.chimpjs.com", + "Protocol": "https" + } + } + } + }, + "RedirectDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "RedirectOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "RedirectOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "RedirectBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ] + } + } + }, + "RedirectDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "RedirectDistribution", + "DomainName" + ] + } + } + } + ] + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": { + "Ref": "ServerlessDeploymentBucket" + } + } + } + }, + "coreCloudFormationTemplate": { + "AWSTemplateFormatVersion": "2010-09-09", + "Description": "The AWS CloudFormation template for this Serverless application", + "Resources": { + "ServerlessDeploymentBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketEncryption": { + "ServerSideEncryptionConfiguration": [ + { + "ServerSideEncryptionByDefault": { + "SSEAlgorithm": "AES256" + } + } + ] + } + } + }, + "ServerlessDeploymentBucketPolicy": { + "Type": "AWS::S3::BucketPolicy", + "Properties": { + "Bucket": { + "Ref": "ServerlessDeploymentBucket" + }, + "PolicyDocument": { + "Statement": [ + { + "Action": "s3:*", + "Effect": "Deny", + "Principal": "*", + "Resource": [ + { + "Fn::Join": [ + "", + [ + "arn:", + { + "Ref": "AWS::Partition" + }, + ":s3:::", + { + "Ref": "ServerlessDeploymentBucket" + }, + "/*" + ] + ] + } + ], + "Condition": { + "Bool": { + "aws:SecureTransport": false + } + } + } + ] + } + } + } + }, + "Outputs": { + "ServerlessDeploymentBucketName": { + "Value": { + "Ref": "ServerlessDeploymentBucket" + } + } + } + } + }, + "custom": { + "subdomain": "www", + "name": "chimpjs", + "tld": "com", + "domain": "chimpjs.com", + "url": "www.chimpjs.com", + "prefix": "www-chimpjs-com", + "region": "us-east-1", + "stage": "prod" + }, + "pluginsData": {}, + "functions": {}, + "resources": { + "Resources": { + "DomainZone": { + "Type": "AWS::Route53::HostedZone", + "Properties": { + "Name": "chimpjs.com", + "HostedZoneConfig": { + "Comment": "Created on August 19 2020 to codify DNS" + } + } + }, + "Certificate": { + "Type": "AWS::CertificateManager::Certificate", + "Properties": { + "DomainName": "*.chimpjs.com", + "SubjectAlternativeNames": [ + "chimpjs.com", + "*.chimpjs.com" + ], + "DomainValidationOptions": [ + { + "DomainName": "chimpjs.com", + "ValidationDomain": "chimpjs.com" + } + ] + } + }, + "WebsiteBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "www.chimpjs.com", + "AccessControl": "Private", + "WebsiteConfiguration": { + "IndexDocument": "index.html", + "ErrorDocument": "error.html" + } + } + }, + "WebsiteDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "www.chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "WebsiteOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "DefaultRootObject": "index.html", + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "WebsiteOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "WebsiteBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ], + "CustomErrorResponses": [ + { + "ErrorCode": "403", + "ErrorCachingMinTTL": 1, + "ResponseCode": 403, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "404", + "ErrorCachingMinTTL": 1, + "ResponseCode": 404, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "500", + "ErrorCachingMinTTL": 1, + "ResponseCode": 500, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "502", + "ErrorCachingMinTTL": 1, + "ResponseCode": 502, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "503", + "ErrorCachingMinTTL": 1, + "ResponseCode": 503, + "ResponsePagePath": "/index.html" + }, + { + "ErrorCode": "504", + "ErrorCachingMinTTL": 1, + "ResponseCode": 504, + "ResponsePagePath": "/index.html" + } + ] + } + } + }, + "WebsiteDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "www.chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "WebsiteDistribution", + "DomainName" + ] + } + } + }, + { + "Name": "www.chimpjs.com.", + "Type": "TXT", + "ResourceRecords": [ + "\"google-site-verification=TwPZPfFdTvgtB94eKQtEAbWWU7_S59xKF8WU8WtwkMQ\"" + ], + "TTL": "300" + } + ] + } + }, + "RedirectBucket": { + "Type": "AWS::S3::Bucket", + "Properties": { + "BucketName": "chimpjs.com", + "AccessControl": "PublicRead", + "WebsiteConfiguration": { + "RedirectAllRequestsTo": { + "HostName": "www.chimpjs.com", + "Protocol": "https" + } + } + } + }, + "RedirectDistribution": { + "Type": "AWS::CloudFront::Distribution", + "Properties": { + "DistributionConfig": { + "Aliases": [ + "chimpjs.com" + ], + "DefaultCacheBehavior": { + "TargetOriginId": "RedirectOriginBucket", + "ViewerProtocolPolicy": "redirect-to-https", + "Compress": true, + "ForwardedValues": { + "QueryString": false, + "Cookies": { + "Forward": "none" + } + } + }, + "Enabled": true, + "HttpVersion": "http2", + "ViewerCertificate": { + "AcmCertificateArn": { + "Ref": "Certificate" + }, + "SslSupportMethod": "sni-only" + }, + "Origins": [ + { + "Id": "RedirectOriginBucket", + "DomainName": { + "Fn::Select": [ + 2, + { + "Fn::Split": [ + "/", + { + "Fn::GetAtt": [ + "RedirectBucket", + "WebsiteURL" + ] + } + ] + } + ] + }, + "CustomOriginConfig": { + "OriginProtocolPolicy": "http-only" + } + } + ] + } + } + }, + "RedirectDNSRecords": { + "Type": "AWS::Route53::RecordSetGroup", + "Properties": { + "HostedZoneId": { + "Ref": "DomainZone" + }, + "RecordSets": [ + { + "Name": "chimpjs.com.", + "Type": "A", + "AliasTarget": { + "HostedZoneId": "Z2FDTNDATAQYW2", + "DNSName": { + "Fn::GetAtt": [ + "RedirectDistribution", + "DomainName" + ] + } + } + } + ] + } + } + }, + "Outputs": {} + }, + "configValidationMode": "warn", + "serviceFilename": "serverless.yml", + "layers": {}, + "initialServerlessConfig": { + "custom": { + "$ref": "$[\"service\"][\"custom\"]" + }, + "service": { + "$ref": "$[\"service\"][\"serviceObject\"]" + }, + "provider": { + "$ref": "$[\"service\"][\"provider\"]" + }, + "resources": { + "$ref": "$[\"service\"][\"resources\"]" + }, + "functions": { + "$ref": "$[\"service\"][\"functions\"]" + }, + "package": { + "artifactDirectoryName": "serverless/www-chimpjs-com/prod/1597853126636-2020-08-19T16:05:26.636Z" + }, + "layers": { + "$ref": "$[\"service\"][\"layers\"]" + }, + "configValidationMode": "warn" + }, + "isDashboardMonitoringPreconfigured": false + }, + "package": { + "artifactDirectoryName": "serverless/www-chimpjs-com/prod/1597853126636-2020-08-19T16:05:26.636Z", + "artifact": "" + } +} \ No newline at end of file diff --git a/documentation/serverless/serverless.yml b/documentation/serverless/serverless.yml new file mode 100644 index 00000000..f131909e --- /dev/null +++ b/documentation/serverless/serverless.yml @@ -0,0 +1,173 @@ +custom: + subdomain: "www" + name: "chimpjs" + tld: "com" + domain: "${self:custom.name}.${self:custom.tld}" + url: "${self:custom.subdomain}.${self:custom.domain}" + prefix: "${self:custom.subdomain}-${self:custom.name}-${self:custom.tld}" + region: "us-east-1" + stage: "prod" + +service: + name: ${self:custom.prefix} + +provider: + runtime: nodejs10.x + name: aws + region: "${self:custom.region}" + stage: "${self:custom.stage}" + +resources: + Resources: + DomainZone: + Type: "AWS::Route53::HostedZone" + Properties: + Name: "${self:custom.domain}" + HostedZoneConfig: + Comment: "Created on August 19 2020 to codify DNS" + + ## SSL CERT + Certificate: + Type: "AWS::CertificateManager::Certificate" + Properties: + DomainName: "*.${self:custom.domain}" + SubjectAlternativeNames: + - "${self:custom.domain}" + - "*.${self:custom.domain}" + DomainValidationOptions: + - DomainName: "${self:custom.domain}" + ValidationDomain: "${self:custom.domain}" + + # WEBSITE, CDN, HTTP > HTTPS REDIRECT, DNS RECORD + WebsiteBucket: + Type: "AWS::S3::Bucket" + Properties: + BucketName: "${self:custom.url}" + AccessControl: Private + WebsiteConfiguration: + IndexDocument: index.html + ErrorDocument: error.html + WebsiteDistribution: + Type: "AWS::CloudFront::Distribution" + Properties: + DistributionConfig: + Aliases: + - "${self:custom.url}" + DefaultCacheBehavior: + TargetOriginId: WebsiteOriginBucket + ViewerProtocolPolicy: redirect-to-https + Compress: true + ForwardedValues: + QueryString: false + Cookies: + Forward: none + DefaultRootObject: index.html + Enabled: true + HttpVersion: http2 + ViewerCertificate: + AcmCertificateArn: + Ref: Certificate + SslSupportMethod: "sni-only" + Origins: + - Id: WebsiteOriginBucket + DomainName: + !Select [2, !Split ["/", !GetAtt [WebsiteBucket, WebsiteURL]]] + CustomOriginConfig: + OriginProtocolPolicy: "http-only" + CustomErrorResponses: + - ErrorCode: "403" + ErrorCachingMinTTL: 1 + ResponseCode: 403 + ResponsePagePath: "/index.html" + - ErrorCode: "404" + ErrorCachingMinTTL: 1 + ResponseCode: 404 + ResponsePagePath: "/index.html" + - ErrorCode: "500" + ErrorCachingMinTTL: 1 + ResponseCode: 500 + ResponsePagePath: "/index.html" + - ErrorCode: "502" + ErrorCachingMinTTL: 1 + ResponseCode: 502 + ResponsePagePath: "/index.html" + - ErrorCode: "503" + ErrorCachingMinTTL: 1 + ResponseCode: 503 + ResponsePagePath: "/index.html" + - ErrorCode: "504" + ErrorCachingMinTTL: 1 + ResponseCode: 504 + ResponsePagePath: "/index.html" + WebsiteDNSRecords: + Type: AWS::Route53::RecordSetGroup + Properties: + HostedZoneId: + Ref: DomainZone + RecordSets: + - Name: "${self:custom.url}." + Type: A + AliasTarget: + HostedZoneId: Z2FDTNDATAQYW2 + DNSName: + Fn::GetAtt: [WebsiteDistribution, DomainName] + - Name: "${self:custom.url}." + Type: TXT + ResourceRecords: + - '"google-site-verification=TwPZPfFdTvgtB94eKQtEAbWWU7_S59xKF8WU8WtwkMQ"' + TTL: "300" + # NAKED DOMAIN REDIRECT + RedirectBucket: + Type: "AWS::S3::Bucket" + Properties: + BucketName: "${self:custom.domain }" + AccessControl: PublicRead + WebsiteConfiguration: + RedirectAllRequestsTo: + HostName: "${self:custom.url}" + Protocol: "https" + RedirectDistribution: + Type: "AWS::CloudFront::Distribution" + Properties: + DistributionConfig: + Aliases: + - "${self:custom.domain}" + DefaultCacheBehavior: + TargetOriginId: RedirectOriginBucket + ViewerProtocolPolicy: redirect-to-https + Compress: true + ForwardedValues: + QueryString: false + Cookies: + Forward: none + Enabled: true + HttpVersion: http2 + ViewerCertificate: + AcmCertificateArn: + Ref: Certificate + SslSupportMethod: "sni-only" + Origins: + - Id: RedirectOriginBucket + DomainName: + "Fn::Select": + [ + 2, + "Fn::Split": + ["/", "Fn::GetAtt": ["RedirectBucket", "WebsiteURL"]], + ] + CustomOriginConfig: + OriginProtocolPolicy: "http-only" + # TODO ENABLE THIS WHEN READY TO GO LIVE + RedirectDNSRecords: + Type: AWS::Route53::RecordSetGroup + Properties: + HostedZoneId: + Ref: DomainZone + RecordSets: + - Name: "${self:custom.domain}." + Type: A + AliasTarget: + HostedZoneId: Z2FDTNDATAQYW2 + DNSName: + Fn::GetAtt: [RedirectDistribution, DomainName] + diff --git a/images/chimp.png b/images/chimp.png new file mode 100644 index 0000000000000000000000000000000000000000..e20a5394c797fc3a047d62ebf160846c1c38d8df GIT binary patch literal 51901 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 CHKu(4 literal 0 HcmV?d00001