Command Line creation of DNS ‘A’ Record in AWS Route53

If you need to add a new record to a Route53 hosted Zone it can be clunky to log in, browse to the right place and manually add your record each time.

If you’re already using some elements of aws or eb command line functionality then this might just be a small step for you which simplifies a currently manual process.

The aws route53 tools are far more powerful than I will cover here. You could add multiple records in a single request. You could updated existing records, or even toggle certain records.

Hopefully this article and the links are enough to get you on your way.

Now the guides generally tell you to create and use a .json file to pull in your config when running the command line, but where the command is simple and you might want to document it, or share it, it’s easier if the whole thing is a single line. If you want to use a .json file then check out the AWS docs for that.

My initial need was to add a single new subdomain to a domain which has many records. Rather than log in and add the record each time, now it’s part of a flow of other command line requests and means less context switching. Opening a browser for any reason can lead to distraction.

I am however not adding a standard ‘A’ record. I’m actually pointing to an Application Load Balancer so I’ll show you the differences for that below.

The first thing you’ll need to do is confirm you have aws command line tools set up and with permissions for the account you’ll be making changes for. Confirmed? Continue…

aws route53 list-hosted-zones

Find the relevent zone in the list and make a note of the final part of the Id from the last forward slash.

Now we’re going to CREATE in our examples but you can also DELETE or UPSERT (update if exists, insert otherwise).

You can also CREATE all sorts of other records, but we’ll stick to ‘A’ for now as it’s a pretty popular record to add.

Take the following and replace the hosted zone id with the code part taken from above after the forward slash. Replace the domain name with yours, replace the subdomain with the one you want to add.

aws route53 change-resource-record-sets --hosted-zone-id BD55*****RS2 --change-batch '{"Changes": [{"Action": "CREATE","ResourceRecordSet": {"Name": "example.com","Type":"A","ResourceRecords": [{"Value": "subdomain.example.com"}]}]}'

And then run it. You can optionally add a comment, TTL and other details. See the docs for that.

Hopefully if you got the zone id right and the details in the right place, you’ll now have a new record in your route53. You can check with:

aws route53 list-resource-record-sets --hosted-zone-id BD55*****RS2

Aliases

If you want to point to an Alias—for example to point to a load balancer—you’ll first need to confirm the details of the loadbalancer to point to.

Here we’re specifically looking for the ‘hosted zone id’ and the ‘DNS Name’.

aws elbv2 describe-load-balancers --region [The Region]

… switch out the region above first. You should then be shown a list of your load balancers. Match the one you need to point to by its code. I actually looked at my existing DNS records to find that using the list-resource-record-sets method above. Then copy the Hosted Zone ID and the DNS Name for it somewhere safe.

The code when an alias is involved contains little more information. In the following you’ll need to replace…

  • the hosted-zone-id with that of your domain
  • the HostedZoneId with that of your load balancer
  • the domain Name
  • the DNSName of your load balancer
  • the true / false value for EvaluateTargetHealth
aws route53 change-resource-record-sets --hosted-zone-id BD55*****RS2 --change-batch '{"Changes": [{"Action": "CREATE","ResourceRecordSet":{"Name": "subdomain.example.com","Type": "A","AliasTarget":{"HostedZoneId":"AC22*****UE7","DNSName": "dualstack.awseb-awseb-Lptg*****fDJ-203*****13.eu-west-1.elb.amazonaws.com","EvaluateTargetHealth": false}}}]}'

Run the above and you’ll be shown basic details about the new record. Again you can run the list-resource-record-sets line above to confirm it’s been created.


Hopefully that’s enough to get you started and you can move on to other options using the official AWS docs. You can also put batches of changes into a .json file if you’d like to CREATE multiple records at a time.

Update Lightsail PHP Version via Snapshot

I haven’t had a chance to try this yet, but it could be a much quicker option that the previous guide which focused more on WordPress and required a full export and import.

So if you give this a go, let me know how you get on and I’ll update the other article accordingly.

Warning

Just to be very clear, I haven’t yet run through this process in competion myself and there may be steps missing from this guide which will help with things like IP addresses and SSL certificates. Use it with care and let me know how you get on.

Confirm a new Lightsail instance will be created with a high enough version of PHP

Before you get started, it’s worth you confirming that a new AWS Lightsail instance can be created with a PHP version high enough to fulfil your requirements or to resolve any warmomg message displayed in WordPress. The Lightsail service doesn’t immediately start offering new PHP versions when they are made available, and so you may need to wait on the Lightsail PHP versions on offer being updated before you continue with this process.

Create a snapshot

The first step is to manually create a snapshot of your current Lightsail instance. You could do this from an ‘Automatic’ snapshot too, but they probably happen in the middle of the night if you have them enabled, and so might be out of date.

You do that from the lightsail dashboard by clicking an instance name to view it’s own screen then click the snapshots tab, then under the ‘Manual snapshots’ title click ‘+ Create snapshot’, and ‘Create’.

You’ll then see a spinning progress icon and ‘snapshotting’ while that process completes. Once done the panel will switch to show the date and time.

Use the snapshot to create a new instance

On the new snapshot’s panel, and indeed on the panels of all snapshots there is an options dots icon on the right side.

Clicking the three vertical dots icon on the right shows ‘Create new instance’ as the first option in a dropdown. Click that.

Lightsail is clever enough to know the type of instance you need at this point, so you don’t see that option, and if you’re getting close to your available storage, or the applications run slow, this is your chance to increase the instance size.

Lightsail also repopulates any tags your existing instance has.

The instance name will need to be unique. Here you probably want to either increment your instance name, so WordPress-1, 2, 3 etc or you could use the php version it’s using, or even the date your created it, for example WordPress-2021-04-16.

Once you’re happy, click ‘Create instance’.

You’ll then be redirected back to the dashboard and shown the new instance in ‘Pending’ status.

IP addresses

If you’re not using a static IP then you’re going to have to point any domain name DNS to the new IP address, but before you do so I would recommend adding a static IP to the new instance first so you can take advantage of the steps below in the future.

Got a static IP on your previous instance? The new instance will not yet have a static IP, but that’s a good thing. You can reassign the IP of the previous instance to the new instance and save having to change anything related to domain name DNS etc.

To do this, check the Static IP name of your previous instance by clicking the networking tab from it’s own page.

Head back to the Lightsail dashboard via the ‘Home’ link in the header and click the networking tab. Find the static IP name again and click it. Then on the IP’s own page you can ‘Detach’ and attach it to the new instance.

Conclusion

Once again, I haven’t been through all this yet to confirm any missing steps and I haven’t confirmed what happens with SSL certificates when you do this. I would love to hear how you get on.

Once I’ve run through this or heard from people who have, I’ll add some screenshots to further support.

Creating a scheduled Lambda or Lambda Cron

This guide revolves around a basic twitter bot implementation which posts a single tweet to the same twitter account every 6 hours.

It allows any Node script (or other if you fancy doing the work to get PHP/Python etc running) to be triggered on any schedule, from every minute to once every year.

Several steps are involved in getting this all up and running:

  • Get our Twitter auth details
  • Write our bot code
  • Create the Lambda in AWS Console
  • Add Environmental variables to keep our security details safe
  • Test our Lambda function
  • Set up a Cloudwatch trigger to act as the scheduler
  • Confirm the schedule is running as expected

Get our Twitter auth details

Open developer.twitter.com and consider which account you’re going to post tweets to.

You may need to sign up and verify your account. Do all that, or just login.

Once you’re in create a new app. Click to create or view keys / access details and ensure you have an App Token, App Secret, User Secret and User Token. So four hashes in total. Two tokens and two secrets.

Also check that your user details have read and write access so we can post tweet updates.

Continue reading “Creating a scheduled Lambda or Lambda Cron”

Migrating away from Mapbox Studio Classic Styles

If you’re using Mapbox static or interactive maps you might still be using the old method for pulling in a style.

Recognise either of these?

L.mapbox.map('map-id', 'account.styleID')

https://api.tiles.mapbox.com/v4/mapbox.style/

Well there are newer ways to do things now, and in the near future these will stop working for you.

First step is to update the version of the javascript library you’re using (if you are) to at least v2.4.0. So any direct links to mapbox javascript files or you might have it referenced in your composer or npm package list.

Continue reading “Migrating away from Mapbox Studio Classic Styles”