added cloudformation stack and deployment script
This commit is contained in:
parent
f912a34b59
commit
4b2b49e9d3
1783
package-lock.json
generated
1783
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -7,6 +7,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@fortawesome/fontawesome-free": "5.15.4",
|
"@fortawesome/fontawesome-free": "5.15.4",
|
||||||
"serve": "12.0.1",
|
"serve": "12.0.1",
|
||||||
"sql.js": "1.6.1"
|
"sql.js": "1.6.1",
|
||||||
|
"tail-stack-events": "2.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
86
scripts/cfn/genreviews.yaml
Normal file
86
scripts/cfn/genreviews.yaml
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
AWSTemplateFormatVersion: "2010-09-09"
|
||||||
|
Description: "genreviews site"
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
GenreviewsSiteBucket:
|
||||||
|
Type: "AWS::S3::Bucket"
|
||||||
|
Properties:
|
||||||
|
BucketName: "genreviews.tmont.com"
|
||||||
|
PublicAccessBlockConfiguration:
|
||||||
|
BlockPublicAcls: false
|
||||||
|
BlockPublicPolicy: false
|
||||||
|
IgnorePublicAcls: false
|
||||||
|
RestrictPublicBuckets: false
|
||||||
|
DeletionPolicy: Retain
|
||||||
|
|
||||||
|
GenreviewsSiteCachePolicy:
|
||||||
|
Type: "AWS::CloudFront::CachePolicy"
|
||||||
|
Properties:
|
||||||
|
CachePolicyConfig:
|
||||||
|
Comment: "Cache policy for genreviews.tmont.com distribution"
|
||||||
|
DefaultTTL: 300 # five minutes
|
||||||
|
MaxTTL: 31536000
|
||||||
|
MinTTL: 60
|
||||||
|
Name: "genreviews-cache-policy"
|
||||||
|
ParametersInCacheKeyAndForwardedToOrigin:
|
||||||
|
CookiesConfig:
|
||||||
|
CookieBehavior: none
|
||||||
|
EnableAcceptEncodingBrotli: true
|
||||||
|
EnableAcceptEncodingGzip: true
|
||||||
|
HeadersConfig:
|
||||||
|
HeaderBehavior: none
|
||||||
|
QueryStringsConfig:
|
||||||
|
QueryStringBehavior: none
|
||||||
|
|
||||||
|
GenreviewsSiteDistribution:
|
||||||
|
Type: "AWS::CloudFront::Distribution"
|
||||||
|
Properties:
|
||||||
|
DistributionConfig:
|
||||||
|
Aliases:
|
||||||
|
- genreviews.tmont.com
|
||||||
|
Comment: "Frontend proxy for genreviews.tmont.com"
|
||||||
|
DefaultCacheBehavior:
|
||||||
|
AllowedMethods:
|
||||||
|
- GET
|
||||||
|
- HEAD
|
||||||
|
CachedMethods:
|
||||||
|
- GET
|
||||||
|
- HEAD
|
||||||
|
CachePolicyId: !Ref GenreviewsSiteCachePolicy
|
||||||
|
Compress: true
|
||||||
|
TargetOriginId: s3-genreviews-bucket
|
||||||
|
ViewerProtocolPolicy: "redirect-to-https"
|
||||||
|
DefaultRootObject: "index.html"
|
||||||
|
Enabled: true
|
||||||
|
HttpVersion: http2
|
||||||
|
IPV6Enabled: true
|
||||||
|
Origins:
|
||||||
|
- DomainName: !GetAtt GenreviewsSiteBucket.RegionalDomainName
|
||||||
|
Id: s3-genreviews-bucket
|
||||||
|
S3OriginConfig:
|
||||||
|
OriginAccessIdentity: ""
|
||||||
|
ViewerCertificate:
|
||||||
|
AcmCertificateArn: "arn:aws:acm:us-east-1:592283802202:certificate/73845214-de19-46df-9504-d3c9995564b2"
|
||||||
|
MinimumProtocolVersion: "TLSv1"
|
||||||
|
SslSupportMethod: "sni-only"
|
||||||
|
Tags:
|
||||||
|
- Key: app
|
||||||
|
Value: genreviews
|
||||||
|
|
||||||
|
GenreviewsSiteDNS:
|
||||||
|
Type: "AWS::Route53::RecordSetGroup"
|
||||||
|
Properties:
|
||||||
|
Comment: "DNS for genreviews.tmont.com CloudFront proxy"
|
||||||
|
HostedZoneName: "tmont.com."
|
||||||
|
RecordSets:
|
||||||
|
- Name: genreviews.tmont.com
|
||||||
|
Type: "A"
|
||||||
|
AliasTarget:
|
||||||
|
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid
|
||||||
|
HostedZoneId: "Z2FDTNDATAQYW2"
|
||||||
|
DNSName: !GetAtt GenreviewsSiteDistribution.DomainName
|
||||||
|
- Name: genreviews.tmont.com
|
||||||
|
Type: "AAAA"
|
||||||
|
AliasTarget:
|
||||||
|
HostedZoneId: "Z2FDTNDATAQYW2"
|
||||||
|
DNSName: !GetAtt GenreviewsSiteDistribution.DomainName
|
36
scripts/deploy.sh
Executable file
36
scripts/deploy.sh
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
readonly thisDir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
readonly rootDir="$(dirname "${thisDir}")"
|
||||||
|
|
||||||
|
main() {
|
||||||
|
SECONDS=0
|
||||||
|
echo "copying files to S3..."
|
||||||
|
aws s3 cp --recursive --acl public-read "${rootDir}/web/" s3://genreviews.tmont.com/
|
||||||
|
|
||||||
|
local distId
|
||||||
|
|
||||||
|
echo "querying for CloudFront distribution..."
|
||||||
|
distId=$(
|
||||||
|
aws cloudfront list-distributions \
|
||||||
|
--query "DistributionList.Items[?contains(Aliases.Items, 'genreviews.tmont.com')].Id | [0]" \
|
||||||
|
--output text
|
||||||
|
)
|
||||||
|
|
||||||
|
if [[ -z "${distId}" ]]; then
|
||||||
|
echo "failed to find cloudfront distribution"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "found distribution \"${distId}\", invalidating CloudFront cache..."
|
||||||
|
|
||||||
|
aws cloudfront create-invalidation \
|
||||||
|
--distribution-id "${distId}" \
|
||||||
|
--paths '/*'
|
||||||
|
|
||||||
|
echo "all done in ${SECONDS}s"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
123
scripts/update-stack.sh
Executable file
123
scripts/update-stack.sh
Executable file
@ -0,0 +1,123 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
getStackAction() {
|
||||||
|
local stackName=$1
|
||||||
|
local region=$2
|
||||||
|
local command="create"
|
||||||
|
|
||||||
|
aws cloudformation describe-stacks \
|
||||||
|
--stack-name "${stackName}" \
|
||||||
|
--output text \
|
||||||
|
--region "${region}" &> /dev/null
|
||||||
|
|
||||||
|
# shellcheck disable=SC2181
|
||||||
|
if [[ $? -eq 0 ]]; then
|
||||||
|
command="update"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${command}"
|
||||||
|
}
|
||||||
|
|
||||||
|
checkError() {
|
||||||
|
# shellcheck disable=SC2181
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo "$1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat << USAGE
|
||||||
|
Updates or creates a CloudFormation stack
|
||||||
|
|
||||||
|
Usage: $0 [--region region] template.yaml
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
--region region The region to create/update the stack in (us-west-2)
|
||||||
|
-h|--help Show this message
|
||||||
|
|
||||||
|
Example:
|
||||||
|
$0 path/to/template.yaml
|
||||||
|
USAGE
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local cfnFile=
|
||||||
|
local region=us-west-2
|
||||||
|
|
||||||
|
parseArgs() {
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
local key="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
case "${key}" in
|
||||||
|
-h | --help)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--region)
|
||||||
|
region=$1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ -n "${cfnFile}" ]]; then
|
||||||
|
echo "only one template file allowed"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cfnFile="${key}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
parseArgs "$@"
|
||||||
|
|
||||||
|
if [[ ! -f "${cfnFile}" ]]; then
|
||||||
|
echo "template \"${cfnFile}\" does not exist"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local stackName
|
||||||
|
stackName=$(basename "${cfnFile%.*}")
|
||||||
|
|
||||||
|
local action
|
||||||
|
action=$(getStackAction "${stackName}" "${region}")
|
||||||
|
local command=
|
||||||
|
local extraOpts=
|
||||||
|
if [ "${action}" = "create" ]; then
|
||||||
|
command="create-stack"
|
||||||
|
extraOpts="--on-failure DO_NOTHING"
|
||||||
|
else
|
||||||
|
command="update-stack"
|
||||||
|
fi
|
||||||
|
|
||||||
|
local shouldContinue
|
||||||
|
read -r -p "${action} stack ${stackName} in ${region} (profile: ${AWS_PROFILE}), continue? [y/n] " shouldContinue
|
||||||
|
if [ "${shouldContinue}" != "y" ]; then
|
||||||
|
echo "ok bye"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
aws cloudformation ${command} \
|
||||||
|
--stack-name "${stackName}" \
|
||||||
|
${extraOpts} \
|
||||||
|
--template-body "file://${cfnFile}" \
|
||||||
|
--region "${region}" \
|
||||||
|
> /dev/null
|
||||||
|
|
||||||
|
checkError "${command} failed"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local -r tailStackEvents="node_modules/.bin/tail-stack-events"
|
||||||
|
if [ -x "${tailStackEvents}" ]; then
|
||||||
|
"${tailStackEvents}" --region "${region}" --stack-name "${stackName}" --die --outputs
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "finished in ${SECONDS}s"
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
Loading…
Reference in New Issue
Block a user