jcolemorrison
getting-into-consul
HCL

A zero to complete walk through of setting up HashiCorp Consul on AWS from scratch!

Last updated Jan 13, 2026
76
Stars
33
Forks
1
Issues
0
Stars/day
Attention Score
26
Language breakdown
HCL 76.1%
Shell 23.9%
Files click to expand
README

Getting into Consul

This is the repo used in the Getting into HashiCorp Consul series where we walk through building out a Consul based architecture and cluster, on AWS, from scratch.

This repo is split into branches, each representing a part in the series:

- uses HashiCorp Cloud Platform (HCP) Consul instead of deploying Consul via Terraform Note: for Parts 5 and beyond, the corresponding branch will include different resources, setup instructions, and scripts. This is because we build out a foundation with Consul in the earlier parts, but after that, it's been exploration of different aspects of Consul which are not necessarily dependent upon each other. The current master branch is the foundation state where only consul and two services are launched.

The Architecture So Far:

Getting into Consul Infrastructure

Getting Started

To set use this repo, take the following steps:

  • Have an AWS Account.
  • Ensure you have the following things installed locally:
- The AWS CLI - Terraform - Consul - jq
  • Either use the root user for your account, or create a new IAM user with either Admin or PowerUser permissions.
# After downloading the key from AWS, on Mac for example
	chmod 400 ~/Downloads/yourawsec2_key.pem

# Optionally move it to another directory mv ~/Downloads/yourawsec2_key.pem ~/.ssh/

# Add the key to your auth agent ssh-add -k ~/.ssh/yourawsec2_key.pem

  • Create a terraform.tfvars file and add the name of your key for the ec2keypair_name variable:
ec2keypairname = "yourawsec2key"
  • Run terraform apply!
  • After the apply is complete, run the post apply script:
# this will output two things:

# 1. Sensitive values needed in a local file 'tokens.txt'

# 2. Values required by the metrics_module

# 3. Detailed setup instructions which are also listed below bash scripts/post-apply.sh

  • SSH into bastion and then into your getting-into-consul-api nodes...
1. Add the clientapinodeidtoken from tokens.txt to the /etc/consul.d/consul.hcl file in the acl.tokens block. 2. Add the clientapiservice_token from tokens.txt to the /etc/consul.d/api.hcl file in the service.token block. 3. Add the clientapiservice_token from tokens.txt to the /etc/systemd/system/consul-envoy.service. 4. Restart both consul, api, and consul-envoy service:
sudo systemctl daemon-reload
       sudo systemctl restart consul api consul-envoy
> NOTE: Sometimes consul-envoy will fail to start if consul isn't given enough time to start up. Simply restart consul-envoy again if this is the case.
  • SSH into bastion and then into your getting-into-consul-web nodes...
1. Add the clientwebnodeidtoken from tokens.txt to the /etc/consul.d/consul.hcl file in the acl.tokens block. 2. Add the clientwebservice_token from tokens.txt to the /etc/consul.d/web.hcl file in the service.token block. 3. Add the clientwebservice_token from tokens.txt to the /etc/systemd/system/consul-envoy.service. 4. Restart both consul, web, and consul-envoy service:
sudo systemctl daemon-reload
       sudo systemctl restart consul web consul-envoy
> NOTE: Sometimes consul-envoy will fail to start if consul isn't given enough time to start up. Simply restart consul-envoy again if this is the case.
  • Head to the Consul UI via your consul_server output from Terraform (the application load balancer DNS for the server).
1. Login with your root token (the consul_token output, you can find it in your state file)
  • To verify everything is working, check out your Consul UI...
- All services in the Services tab should be green. - All nodes in the Nodes tab should be green.
  • To verify the web service is up and running, head to the DNS printed in the terraform output as web_server
- It should show the upstream body of the api server with an IP address in dc1.

Deploy the Optional Metrics Server

There's also another module nested in this repository that will stand up a prometheus deployment to monitor your Consul cluster. To deploy it.

  • Ensure that the above "Getting Started" instructions have been followed.
- including running the post-apply.sh script that creates needed variables for the metrics deployment.
  • Run the post-apply-metrics.sh script:
bash scripts/post-apply-metrics.sh
  • Navigate to the nested metrics_module.
cd metrics_module/
  • Initialize the nested Terraform Module:
terraform init
  • Deploy it:
terraform apply
  • Afterwards, it'll output metrics_endpoint which is the endpoint you can visit to view your metrics.

Setting Things Up Manually

Although this repo is set up so that you can get everything working via terraform apply, if you'd like to take the manual steps for learning, you can reference these documents:

- Checkout the part-9-manual branch to follow these. For example, if you wanted to manually learn Part 1 to Part 2, begin on the Part 1 Branch, and follow the "From Part 1 to Part 2 Manual Steps".

Troubleshooting

502 Bad Gateway Error when visiting the Consul Server UI

The most likely cause of this is a failure to fetch and install consul on the servers due to a failure to get the required GPG key. The most straightforward way to fix this is to terraform destroy the infrastructure and reapply it via terraform apply.

web service fails to reach the api service

If everything deployed fine and you can see the Consul UI and the web service is reachable but is saying that the api can't be reached, it's likely Consul Intentions. To fix:

  • Login with your consul bootstrap token.
  • Click the Web service and then click on the Topology tab.
  • Click on the red arrow between the web and the api boxes and click Create to create a new intention that allows the web to access the api service.

Notes

  • Cloud Auto-Join is set up for part 1, despite not being in the stream itself.
🔗 More in this category

© 2026 GitRepoTrend · jcolemorrison/getting-into-consul · Updated daily from GitHub