What do you mean by production ready?
A site hosted on AWS S3, using a custom domain, with a CDN and a SSL certificate.
TL;DR
I use the CDK, a custom construct, and Python to easily deploy this site to AWS.
Requirements
- Install the AWS CDK
- Python 3.6+
- Your hugo website
- An AWS account and have previously setup the AWS CLI and run
aws configure
- A Route53 hosted zone and an available domain/subdoman A record (a domain or sub domain not currently in use)
Setup
Create a new directory and start a new CDK app:
mkdir cdk-app
cd cdk-app
cdk init --language python
This will generate a number of files, but the two that you care about are:
app.py
cdk_app/cdk_app_stack.py
2 Lines of Code
open the cdk_app_stack.py
and add the following code at the bottom of the __init__
:
zone = HostedZone.from_lookup(
self, "HostedZone",
domain_name="MYDOMAINNAME.COM",
private_zone=False
)
StaticWebsite(
self, "serverlesslink-website",
hosted_zone=zone,
site_domain="BLOG.DOMAINNAME.COM",
sources="../public",
website_error="404.html"
)
In the first line, you will be creating a hosted zone object from a lookup, this is an existing hosted zone in Route53 and you must have access to use it.
The second line is the static website construct and it takes:
- The hosted zone you created above
- The site domain/subdomain you want to use for your hugo site
- The location of your code relative to the CDK app directory
- Optional, the error page if is not called
error.html
Deploy the site
All that is left now is to deploy the site:
cdk deploy
and that is it!
Troubleshooting
While working with the CDK I learned some important lessons:
CDK asking for account and region
For local development and deployment, it is best to pass a custom env
to the application stack. Open the
app.py
and pass a custom env
dict to the stack:
env = {
'account': os.environ.get("AWS_ACCOUNT_ID", os.environ["CDK_DEFAULT_ACCOUNT"]),
'region': os.environ.get("AWS_DEFAULT_REGION", os.environ["CDK_DEFAULT_REGION"])
}
CdkAppStack(app, "cdk-app", env=env)
All this is saying is that if the app can’t find some custom environment variables AWS_ACCOUNT_ID
and AWS_DEFAULT_REGION
, to use the CDK values which come from the
aws cli profile. You would use the custom env vars when deploying this in a CICD.
Sub-directories are showing errors
Simply follow the instructions in this post. I’ll try to fix this in the construct, but as of right now, you may need to do it manually.