Automate your Website with Hugo, S3, & CloudFront
Bash script to load Hugo Site to S3 bucket and invalidate Cloudfront cache
Cole Russell
February 9, 2020
February 9, 2020
Bash Script to Update S3 and invalidate Cloudfront
This is the script I used with my AWS CLI to “publish” my Hugo site to my static website S3 bucket. Once the files have been uploaded you will need to “invalidate” your Cloudfront cache in order for it to serve the latest content.
#!/bin/bash
set -e
#### Run this inside your HUGO Directory.
## Make sure you have AWS CLI configured, with a user that has the appropriate permissions.
#### Update these with your code.
DISTRIBUTION_ID=ABCDEF123456 # As pulled from your AWS console.
BUCKET_NAME=ownthe.cloud # Your main bucket that has static hosting checked.
PROFILE=default # Keep as "default" unless you use a separate profile.
hugo -v
#### Copy over Hugo public folder to S3 /w Server Side Encryption (SSE).
# Add ""--exclude 'img' --exclude 'js' --exclude 'downloads' --exclude 'css'"", to the command to control cache behaivor.
aws s3 sync --profile ${PROFILE} --acl "public-read" --sse "AES256" public/ s3://${BUCKET_NAME}/
### (OPTIONAL) Ensure static files are set to cache forever - cache for a month --cache-control "max-age=2592000"
# aws s3 sync --profile ${PROFILE} --cache-control "max-age=2592000" --acl "public-read" --sse "AES256" public/img/ s3://${BUCKET_NAME}/img/
# aws s3 sync --profile ${PROFILE} --cache-control "max-age=2592000" --acl "public-read" --sse "AES256" public/css/ s3://${BUCKET_NAME}/css/
# aws s3 sync --profile ${PROFILE} --cache-control "max-age=2592000" --acl "public-read" --sse "AES256" public/js/ s3://${BUCKET_NAME}/js/
# aws s3 sync --profile ${PROFILE} --cache-control "max-age=31536000" --acl "public-read" --sse "AES256" static/downloads/ s3://${BUCKET_NAME}/downloads/
### Invalidate cache so that everything is up-to-date (Warning, first 1K/mo free, then 1/2 cent each)
aws cloudfront create-invalidation --profile ${PROFILE} --distribution-id ${DISTRIBUTION_ID} --paths "/*"
AWS Guides
AWS CloudFront with Static Website
References
LustForge - https://github.com/twistedpair/lustforge.com/blob/master/deploy_site.sh