Updated: June 2025

Overview:

Establishing and improving websites by Champlin Technologies LLC have been rewarding learning experiences. Specifically, this website has gone through a some major reincarnations using various web-dev tools and hosting webservers. The original website for Champlin Technologies LLC (2014) was dirt simple and hosted with a popular webhosting service that didn’t deliver on two important metrics: load-time (over 12 seconds for initial load time for home page) and up-time (down for several hours each month).

All our websites are currently hosted with Amazon Web Services (AWS) and have the following metrics:

  • Performance is now quick (load time is less than 1 second for first view, less than 0.4 seconds for repeat views).
  • Availability is unbelievably impressive.
  • Solution is affordable.

As I can affirm, establishing a website on AWS EC2 can be a little intimidating at first to setup, configure, backup, and operate … even for people with good Linux and IT skills. Fortunately, effective help is just a few clicks away. This post is the first of a 6-post series with step-by-step procedures that I follow to setup WordPress on AWS for websites. As such, these posts provide a detailed procedure for me to reuse and for others to reference while creating their sites. As with all projects, I am an advocate of incremental testing – confirming success at intermediate points in a multiple-step complex process.

Note: The original version for this series was written in 2016 with EC2 servers running Ubuntu 16.04. This series has been completely updated in mid-2025. An example website, Seattle Hobbies, will be used throughout this series. The development of the Seattle Hobbies website assumes a simple low-maintenance website with low visitor count with no auto-scaling or redundancy. As such, implementation and configuration are easy. I will most likely seek the support of professional web-dev experts if I want to establish a more sophisticated website that handles commerce or has significant traffic with lots of site visitors.

Configuration Overview:

This example simple website will have the following configuration:

  • Host: AWS EC2
  • Instance: Ubuntu 24.04 running on a 64-bit ARM ‘t4g.small’ instance (2 virtual CPUs, 2 GB memory, 8 GB disk space),
  • Stack: LAMP (Linux, Apache, MySQL, PHP)
  • Website: WordPress

AWS Account:

If an AWS account needs to be established, then go to Amazon Web Services (AWS), click on ‘Sign in to the Console’, and follow the steps to create an account.

DNS Name Search and Purchase:

Each website has a name registered with DNS. And, this website is no different. Availability of website names makes the search and selection process a little challenging. ‘Route 53’ is the AWS service that allows for searching for an available website name from a DNS and purchasing it. The ‘Route 53’ service can be accessed from the AWS ‘Services’ on the top menu by clicking on ‘Route 53’ under ‘Networking & Content Delivery’. Select ‘Registered domains’ from the left column menu and then, click on ‘Register domain’ button.

At this point, enter the desired name for the website to check for its availability. For this series, the name ‘thehobbyapp.com’ was unavailable as shown below. However, the choice of ‘seattlehobbies.com’ was available. Add to cart, fill in contact info and purchase. I recommend turning on privacy protection during this step. Typically, it takes from 15 to 45 minutes for DNS to register the website name. In the meantime, an instance needs to be created.

Launching an AWS Ubuntu Instance:

To create a new instance, sign into AWS and click on ‘Services’ on the top menu, then click on ‘EC2’ located under ‘Compute’. Then click on ‘Instances’ from the left column on the EC2 Dashboard. To create a new instance, start by clicking on ‘Launch Instance’.

  • Enter a name for your EC2 instance under ‘Name and tags’.
  • Choose an AMI: Under ‘Application and OS Images (Amazon Machine Image), I usually select 64-bit (ARM) as the architecture first. Then, select ‘Ubuntu’. Then, select ‘Ubuntu Server 24.04 LTS (HVM), SSD Volume Type’ as the Amazon Machine Image (AMI).
  • Choose an Instance Type: I recommend a t4g.small instance as a minimum size.
  • Configure Storage: The standard amount of disk space for the ‘t4g.small’ instance is 8 GB. Although this is a small website with a standard LAMP stack, I still recommend increasing storage to 16 GiB of ‘gp3’.
  • Configure Advanced Details: I usually accept the defaults.
  • Configure Security Group: Under ‘Network Settings’, create a new security group (e.g., example-security-1) and select ‘Allow SSH traffic from anywhere’. There will be a small warning about the ‘open to the world’ security group settings. For this example, it is acceptable, but for a commercial grade website, it is advisable to learn more about security group settings and restrict SSH access to a particular IP address or range of addresses. In addition, select both ‘Allow HTTPS traffic from the internet’ and ‘Allow HTTP traffic from the internet’. The following screenshot is an example of the result:
  • Create key pair: SSH access via a command line interface (e.g., terminal on the Mac or PuTTY on Windows) to an AWS instance is not with a password but with a public/private encryption key pair. Under ‘Key pair (login)’, select ‘Create a new key pair’, type in a relevant filename (e.g., seattlehobbies) and choose ‘RSA’. Select either ‘.pem’ (if using terminal from a Mac, or Linux OS to access this instance via SSH) or ‘.ppk’ (if using PuTTY on Windows OS to access this instance via SSH). Click on ‘Create Key Pair’.
  • After the key file has been downloaded, it is time to launch this instance. Click on ‘Launch Instance’. Going back to the EC2 dashboard, a new instance will start initializing. After a few minutes, it will be running as shown in the following screenshot:
  • Make a note of the ‘Public DNS‘ value. For this example, it is ‘ec2-35-91-32-235.us-west-2.compute.amazonaws.com’. It will be used for accessing the instance via SSH.
If a Mac is being used to access AWS, the private key is sent to the Mac OS ‘Downloads’ folder with the following example filename: ‘seattlehobbies.pem’.

  • Move the file to the .ssh folder using ‘Terminal’ using the following command and restrict file permissions with the second command:
mv ~/Downloads/seattlehobbies.pem ~/.ssh
chmod 400 ~/.ssh/seattlehobbies.pem
  • Access the instance via SSH. Enter the following command to access the instance as ubuntu (default user) with the ‘Public IPv4 DNS‘ associated with this instance into the Mac OS ‘Terminal’:
ssh -i ~/.ssh/seattlehobbies.pem ubuntu@ec2-35-91-32-235.us-west-2.compute.amazonaws.com
  • On first launch, the AWS instance may ask to verify. Type ‘yes’ and return. A successful login screen will look similar to:

  • Type ‘exit’ to quit the SSH connection.

If a Windows PC is being used to access AWS, the private key is sent to the Windows ‘Downloads’ folder with the following filename: ‘seattlehobbies.pem’.

Accessing the AWS instance from a Windows PC is accomplished with a software program such as PuTTY. Here are the steps to install, generate a compatible private key file, configure settings, and connect to the AWS instance using PuTTY:

  • Install: Download the 64-bit MSI installer from PuTTY. Windows will ask what to do with the file and ask again if you want to run the file. Select ‘Run’ each time and follow the prompts to install PuTTY.
  • Generate a compatible private key file: The private key file ‘seattlehobbies.pem‘ needs to be converted to a ‘*.ppk‘ by PuTTYgen. PuTTYgen is one of the software programs that was created during the installation process with PuTTY. Locate PuTTYgen in the Windows app menu as shown below and double-click to launch it.

    Set the ‘Type of key to generate:‘ to RSA and the ‘Number of bits in a generated key:‘ to 2048 as shown in the following screenshot. Then, click on ‘Load‘ to load the recently downloaded private key file. Since the file type we are looking for is a ‘*.pem‘ file, select ‘All Files (*.*)‘ so that it will be visible. Then, go to the ‘Downloads’ folder and select ‘seattlehobbies.pem‘ and click ‘OK‘ on the displayed notice. Click ‘Save private key‘ and click ‘Yes‘ to confirm saving without a passphrase key. Then, save the ‘seattlehobbies.ppk‘ in the same folder as the ‘seattlehobbies.pem‘ file. Close ‘PuTTYgen‘ software program.

  • Configure settings: PuTTY is one of the software programs that was created during the installation process with PuTTY. Start PuTTY. In the left pane, select ‘Connection -> SSH -> Auth‘. Click on ‘Browse‘ and select the ‘seattlehobbies.ppk‘ as shown in the following screenshot.

  • Then, in the left pane, select ‘Session‘. In the right pane, confirm or select ‘SSH‘, port is 22, and type in the ‘ubuntu@‘ followed by the ‘Public DNS‘ associated with this instance. At this point, type in a name for ‘Saved Sessions‘ (e.g., Seattle Hobbies) and click ‘Save‘ as shown in the following screenshot.

  • To access the instance via SSH using PuTTY, load a saved session and click on ‘Open‘ (may need to confirm yes on initial login using this IP address). A successful login screen to the AWS instance from PuTTY will look similar to:

  • Type ‘exit’ to quit the SSH connection to AWS which will also close PuTTY.

Setting up an Elastic IP Address:

An Elastic IP address (i.e., static public IP for the website) is needed to associate a website name via a DNS (domain name service). Click on the ‘Elastic IPs’ topic located on the left column of the EC2 dashboard. Then, click on ‘Allocate Elastic IP address’ button and confirm the allocation request by clicking on ‘Allocate’. An Elastic IP address is immediately allocated. Associate the Elastic IP address (e.g., 44.247.136.248) to the instance by selecting the address and select ‘Associate Elastic IP address’ from the ‘Actions’ pull-down menu. Click in the ‘Instance’ field, associate the instance (e.g., seattlehobbies), and click ‘Associate’. Click the ‘button’ to return to the EC2 dashboard.

At this point, a nice clean static IP address (e.g., 44.247.136.248) is our Seattle Hobbies instance’s IP address.

Open a new Terminal window and enter the following command with the new Elastic IP address (may need to confirm yes on initial login using this elastic IP):

ssh -i ~/.ssh/seattlehobbies.pem ubuntu@44.247.136.248
Start PuTTY and load a saved session (e.g., windows aws). Change the ‘Host Name (or IP address)‘ to the elastic IP address (e.g., ‘unbuntu@ssh -i ~/.ssh/seattlehobbies.pem ubuntu@44.247.136.248)‘ and save the session. Then, click ‘Open‘ as before to start a SSH session with the AWS instance (may need to confirm yes on initial login using this elastic IP).

Associate an Elastic IP to DNS:

To associate an Elastic IP to the DNS website name, go back to AWS ‘Route 53’ service and click on ‘Hosted Zones’. Select the ‘Domain name’ corresponding to the website (e.g., ‘seattlehobbies’).

To associate an Elastic IP to the DNS website name, create an ‘A’ record for the hosted zone. Click on ‘Create record’, select ‘Simple routing’ from the array of choices’ under ‘Routing policy’. Leave ‘Record name’ subdomain blank. Under ‘Value’, enter the Elastic IP address (e.g., 44.247.136.248). Record type should be ‘A – Routes traffic to an IPv4 address and some AWS resources’. Click on ‘Create records’.

In addition, the Elastic IP needs to be associated with the ‘www’ sub-domain of the DNS website name. Repeat the steps above, but fill in ‘Record name’ with ‘www’ as shown in the screenshot below:

After both record are created, the records table should have entries similar to the table below:

It will take several minutes before the website names, records, and IP address are propagated through DNS.
After the DNS website name is associated, the website name can replace the Elastic IP address in the SSH command line (Mac) or the IP address in PuTTY (Windows PC).

Since package updates to Ubuntu occur frequently, the initial Ubuntu 20.04 needs to process any updates. Follow the update steps listed in this blog post: A Collection of AWS EC2 Ubuntu Tips

That’s it. A Linux instance has been established and SSH access works with the DNS website name ‘seattlehobbies.com’.