Fastmail AWS Route53 with CloudFormation
Situation
You use Fastmail for your email with your custom domain name(s) and AWS Route53 to manage your DNS records. You also use CloudFormation to set up your Route53 hosted zones. How do you configure your DNS records for your email?
Good news is that Fastmail has a very helpful guide to setting up your custom domain, including specific instructions for several providers such as CloudFlare, Gandi, Namecheap, GoDaddy, Enom, etc..
But they don’t provide such detailed help with Route53 and CloudFormation.
Solution
Here’s a quick CloudFormation template that might save you some time. It includes MX, SPF and DKIM records for Fastmail and provides you with a variable named Domain so you can use it with any domain (or sub-domain) you’d like.
I reproduced the template below, but here’s a GitHub gist too.
Parameters:
Domain:
Description: Domain for hosted zone, e.g. example.com
Type: String
Resources:
WebHostedZone:
Type: AWS::Route53::HostedZone
Properties:
Name: !Ref Domain
WebMailRecordSetGroup:
Type: AWS::Route53::RecordSetGroup
Properties:
HostedZoneId: !Ref WebHostedZone
RecordSets:
- Name: !Ref Domain
TTL: 21600
Type: MX
ResourceRecords:
- 10 in1-smtp.messagingengine.com
- 20 in2-smtp.messagingengine.com
- Name: !Ref Domain
TTL: 21600
Type: TXT
ResourceRecords:
- "\"v=spf1 include:spf.messagingengine.com ?all\""
- Name: !Join ["", ["fm1._domainkey.", !Ref Domain]]
TTL: 21600
Type: CNAME
ResourceRecords:
- !Join ["", ["fm1.", !Ref Domain, ".dkim.fmhosted.com"]]
- Name: !Join ["", ["fm2._domainkey.", !Ref Domain]]
TTL: 21600
Type: CNAME
ResourceRecords:
- !Join ["", ["fm2.", !Ref Domain, ".dkim.fmhosted.com"]]
- Name: !Join ["", ["fm3._domainkey.", !Ref Domain]]
TTL: 21600
Type: CNAME
ResourceRecords:
- !Join ["", ["fm3.", !Ref Domain, ".dkim.fmhosted.com"]]
Outputs:
HostedZoneId:
Description: Hosted Zone ID
Value: !Ref WebHostedZone
WebMailDomain:
Description: Mail RecordSetGroup Domain Name
Value: !Ref WebMailRecordSetGroup