Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

143 lines
4.0 KiB

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: MPL-2.0
data "aws_ami" "consul" {
most_recent = true
owners = var.ami_owners
filter {
name = "virtualization-type"
values = ["hvm"]
}
filter {
name = "is-public"
values = ["false"]
}
filter {
name = "name"
values = ["consul-ubuntu-*"]
}
}
# ---------------------------------------------------------------------------------------------------------------------
# Deploy consul cluster
# ---------------------------------------------------------------------------------------------------------------------
module "consul_servers" {
source = "git::git@github.com:hashicorp/terraform-aws-consul.git//modules/consul-cluster?ref=v0.8.0"
cluster_name = "${var.cluster_name}-server"
cluster_size = var.num_servers
instance_type = var.instance_type
cluster_tag_key = var.cluster_tag_key
cluster_tag_value = var.cluster_name
ami_id = var.consul_ami_id == null ? data.aws_ami.consul.id : var.consul_ami_id
user_data = data.template_file.user_data_server.rendered
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.public_subnets
allowed_ssh_cidr_blocks = [var.vpc_cidr]
allowed_inbound_cidr_blocks = [var.vpc_cidr]
ssh_key_name = module.keys.key_name
}
module "consul_clients" {
source = "git::git@github.com:hashicorp/terraform-aws-consul.git//modules/consul-cluster?ref=v0.8.0"
cluster_name = "${var.cluster_name}-client"
cluster_size = var.num_clients
instance_type = var.instance_type
cluster_tag_key = var.cluster_tag_key
cluster_tag_value = var.cluster_name
ami_id = var.consul_ami_id == null ? data.aws_ami.consul.id : var.consul_ami_id
user_data = data.template_file.user_data_client.rendered
vpc_id = module.vpc.vpc_id
subnet_ids = module.vpc.public_subnets
allowed_ssh_cidr_blocks = [var.vpc_cidr]
allowed_inbound_cidr_blocks = [var.vpc_cidr]
ssh_key_name = module.keys.key_name
}
# ---------------------------------------------------------------------------------------------------------------------
# This script will configure and start Consul agents
# ---------------------------------------------------------------------------------------------------------------------
data "template_file" "user_data_server" {
template = file("${path.module}/user-data-server.sh")
vars = {
consul_version = var.consul_version
consul_download_url = var.consul_download_url
cluster_tag_key = var.cluster_tag_key
cluster_tag_value = var.cluster_name
}
}
data "template_file" "user_data_client" {
template = file("${path.module}/user-data-client.sh")
vars = {
consul_version = var.consul_version
consul_download_url = var.consul_download_url
cluster_tag_key = var.cluster_tag_key
cluster_tag_value = var.cluster_name
}
}
#
# Set up ALB for test-servers to talk to consul clients
#
module "alb" {
source = "terraform-aws-modules/alb/aws"
version = "~> 5.0"
name = "${var.cluster_name}-alb"
load_balancer_type = "application"
vpc_id = module.vpc.vpc_id
subnets = module.vpc.public_subnets
security_groups = [module.consul_clients.security_group_id]
internal = true
target_groups = [
{
#name_prefix has a six char limit
name_prefix = "test-"
backend_protocol = "HTTP"
backend_port = 8500
target_type = "instance"
health_check = {
interval = 5
timeout = 3
protocol = "HTTP"
healthy_threshold = 2
path = "/v1/status/leader"
}
}
]
http_tcp_listeners = [
{
port = 8500
protocol = "HTTP"
target_group_index = 0
}
]
}
# Attach ALB to Consul clients
resource "aws_autoscaling_attachment" "asg_attachment_bar" {
autoscaling_group_name = module.consul_clients.asg_name
alb_target_group_arn = module.alb.target_group_arns[0]
}