testing/infra/terraform/modules/standalone_apm_server/main.tf (275 lines of code) (raw):

locals { image_owners = { "ubuntu-focal-20.04-arm64-server" = "099720109477" # canonical "ubuntu-jammy-22.04-arm64-server" = "099720109477" # canonical "ubuntu-noble-24.04-arm64-server" = "099720109477" # canonical "debian-12-arm64" = "136693071363" # debian "al2023-ami-2023" = "137112412989" # amazon "al2023-ami-2023.*-x86_64" = "137112412989" # amazon "RHEL-8" = "309956199498" # Red Hat "RHEL-9" = "309956199498" # Red Hat "Rocky-8-EC2-Base" = "792107900819" # Rocky Linux "Rocky-9-EC2-Base" = "792107900819" # Rocky Linux "AlmaLinux OS 8" = "764336703387" # AlmaLinux OS Foundation "AlmaLinux OS 9" = "764336703387" # AlmaLinux OS Foundation "OL8" = "131827586825" # Oracle "OL9" = "131827586825" # Oracle } instance_types = { "ubuntu-focal-20.04-arm64-server" = "t4g.nano" "ubuntu-jammy-22.04-arm64-server" = "t4g.nano" "ubuntu-noble-24.04-arm64-server" = "t4g.nano" "debian-12-arm64" = "t4g.nano" "al2023-ami-2023" = "t4g.nano" "al2023-ami-2023.*-x86_64" = "t3a.micro" "RHEL-8" = "t4g.micro" # RHEL doesn't support nano instances "RHEL-9" = "t4g.micro" # RHEL doesn't support nano instances "Rocky-8-EC2-Base" = "t4g.nano" "Rocky-9-EC2-Base" = "t4g.nano" "AlmaLinux OS 8" = "t4g.nano" "AlmaLinux OS 9" = "t4g.nano" "OL8" = "t4g.nano" "OL9" = "t4g.nano" } instance_arch = { "ubuntu-focal-20.04-arm64-server" = "arm64" "ubuntu-jammy-22.04-arm64-server" = "arm64" "ubuntu-noble-24.04-arm64-server" = "arm64" "debian-12-arm64" = "arm64" "al2023-ami-2023" = "arm64" "al2023-ami-2023.*-x86_64" = "x86_64" "RHEL-8" = "arm64" "RHEL-9" = "arm64" "Rocky-8-EC2-Base" = "arm64" "Rocky-9-EC2-Base" = "arm64" "AlmaLinux OS 8" = "arm64" "AlmaLinux OS 9" = "arm64" "OL8" = "arm64" "OL9" = "arm64" } instance_ea_provision_cmd = { "ubuntu-focal-20.04-arm64-server" = "curl ${data.external.latest_elastic_agent.result.deb_arm} -o elastic-agent.deb && sudo dpkg -i elastic-agent.deb" "ubuntu-jammy-22.04-arm64-server" = "curl ${data.external.latest_elastic_agent.result.deb_arm} -o elastic-agent.deb && sudo dpkg -i elastic-agent.deb" "ubuntu-noble-24.04-arm64-server" = "curl ${data.external.latest_elastic_agent.result.deb_arm} -o elastic-agent.deb && sudo dpkg -i elastic-agent.deb" "debian-12-arm64" = "curl ${data.external.latest_elastic_agent.result.deb_arm} -o elastic-agent.deb && sudo dpkg -i elastic-agent.deb" "al2023-ami-2023" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "al2023-ami-2023.*-x86_64" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "RHEL-8" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "RHEL-9" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "Rocky-8-EC2-Base" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "Rocky-9-EC2-Base" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "AlmaLinux OS 8" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "AlmaLinux OS 9" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "OL8" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" "OL9" = "curl ${data.external.latest_elastic_agent.result.rpm_arm} -o elastic-agent.rpm && sudo rpm -i elastic-agent.rpm" } instance_standalone_provision_cmd = { "ubuntu-focal-20.04-arm64-server" = "curl ${data.external.latest_apm_server.result.deb_arm} -o apm-server.deb && sudo dpkg -i apm-server.deb" "ubuntu-jammy-22.04-arm64-server" = "curl ${data.external.latest_apm_server.result.deb_arm} -o apm-server.deb && sudo dpkg -i apm-server.deb" "ubuntu-noble-24.04-arm64-server" = "curl ${data.external.latest_apm_server.result.deb_arm} -o apm-server.deb && sudo dpkg -i apm-server.deb" "debian-12-arm64" = "curl ${data.external.latest_apm_server.result.deb_arm} -o apm-server.deb && sudo dpkg -i apm-server.deb" "al2023-ami-2023" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "al2023-ami-2023.*-x86_64" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "RHEL-8" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "RHEL-9" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "Rocky-8-EC2-Base" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "Rocky-9-EC2-Base" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "AlmaLinux OS 8" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "AlmaLinux OS 9" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "OL8" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" "OL9" = "curl ${data.external.latest_apm_server.result.rpm_arm} -o apm-server.rpm && sudo rpm -i apm-server.rpm" } image_ssh_users = { "ubuntu-focal-20.04-arm64-server" = "ubuntu" "ubuntu-jammy-22.04-arm64-server" = "ubuntu" "ubuntu-noble-24.04-arm64-server" = "ubuntu" "debian-12-arm64" = "admin" "al2023-ami-2023" = "ec2-user" "al2023-ami-2023.*-x86_64" = "ec2-user" "RHEL-8" = "ec2-user" "RHEL-9" = "ec2-user" "Rocky-8-EC2-Base" = "rocky" "Rocky-9-EC2-Base" = "rocky" "AlmaLinux OS 8" = "ec2-user" "AlmaLinux OS 9" = "ec2-user" "OL8" = "ec2-user" "OL9" = "ec2-user" } apm_port = "8200" conf_path = "/tmp/local-apm-config.yml" bin_path = "/tmp/apm-server" } data "aws_ami" "os" { most_recent = true filter { name = "name" values = ["*${var.aws_os}*"] } filter { name = "architecture" values = [local.instance_arch[var.aws_os]] } filter { name = "root-device-type" values = ["ebs"] } filter { name = "virtualization-type" values = ["hvm"] } owners = [local.image_owners[var.aws_os]] } data "aws_region" "current" {} data "aws_subnets" "public_subnets" { filter { name = "vpc-id" values = [var.vpc_id] } filter { name = "availability-zone" values = ["${data.aws_region.current.name}a"] } } resource "aws_security_group" "main" { vpc_id = var.vpc_id egress = [ { cidr_blocks = ["0.0.0.0/0"] description = "" from_port = 0 ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "-1" security_groups = [] self = false to_port = 0 } ] ingress = [ { cidr_blocks = ["0.0.0.0/0"] description = "" from_port = 22 ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "tcp" security_groups = [] self = false to_port = 22 }, { cidr_blocks = ["0.0.0.0/0"] description = "" from_port = local.apm_port ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "tcp" security_groups = [] self = false to_port = local.apm_port } ] } resource "aws_instance" "apm" { ami = data.aws_ami.os.id instance_type = var.apm_instance_type == "" ? local.instance_types[var.aws_os] : var.apm_instance_type subnet_id = data.aws_subnets.public_subnets.ids[0] vpc_security_group_ids = [aws_security_group.main.id] key_name = aws_key_pair.provisioner_key.key_name monitoring = false root_block_device { volume_type = var.apm_volume_type volume_size = var.apm_volume_size iops = var.apm_iops } connection { type = "ssh" user = local.image_ssh_users[var.aws_os] host = self.public_ip private_key = file("${var.aws_provisioner_key_name}") } // For instance types with 'd.' e.g. c6id.2xlarge, use the NVMe ssd as data disk. provisioner "remote-exec" { inline = length(regexall("d[.]", self.instance_type)) > 0 ? [ "sudo mkfs -t xfs /dev/nvme1n1", "mkdir ~/data", "sudo mount /dev/nvme1n1 ~/data", "sudo chown $USER:$USER ~/data", ] : [ ":", // no-op ] } provisioner "file" { source = "${var.apm_server_bin_path}/apm-server" destination = local.bin_path on_failure = continue } provisioner "file" { destination = local.conf_path content = templatefile(var.ea_managed ? "${path.module}/elastic-agent.yml.tftpl" : "${path.module}/apm-server.yml.tftpl", { elasticsearch_url = "${var.elasticsearch_url}", elasticsearch_username = "${var.elasticsearch_username}", elasticsearch_password = "${var.elasticsearch_password}", apm_version = "${var.stack_version}" apm_secret_token = "${random_password.apm_secret_token.result}" apm_port = "${local.apm_port}" apm_server_tail_sampling = "${var.apm_server_tail_sampling}" apm_server_tail_sampling_storage_limit = "${var.apm_server_tail_sampling_storage_limit}" }) } provisioner "remote-exec" { inline = var.ea_managed ? [ local.instance_ea_provision_cmd[var.aws_os], "sudo elastic-agent install -n --unprivileged", "sudo cp ${local.conf_path} /etc/elastic-agent/elastic-agent.yml", "sudo systemctl start elastic-agent", // oracle linux cloud image has firewalld enabled by default "sudo systemctl stop firewalld || true", "sleep 1", ] : ( var.apm_server_bin_path == "" ? [ local.instance_standalone_provision_cmd[var.aws_os], "sudo cp ${local.conf_path} /etc/apm-server/apm-server.yml", "sudo systemctl start apm-server", // oracle linux cloud image has firewalld enabled by default "sudo systemctl stop firewalld || true", "sleep 1", ] : [ "sudo cp ${local.bin_path} apm-server", "sudo chmod +x apm-server", "sudo cp ${local.conf_path} apm-server.yml", "sudo mkdir -m 777 /var/log/apm-server", "screen -d -m ./apm-server", "sleep 1" ] ) } tags = var.tags } resource "null_resource" "apm_server_log" { triggers = { user = local.image_ssh_users[var.aws_os] host = aws_instance.apm.public_ip private_key = aws_key_pair.provisioner_key.key_name } depends_on = [aws_instance.apm] provisioner "local-exec" { when = destroy command = "scp -i ${self.triggers.private_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${self.triggers.user}@${self.triggers.host}:/var/log/apm-server/apm-server-* ." on_failure = continue } } data "external" "latest_elastic_agent" { program = ["bash", "${path.module}/latest_elastic_agent.sh", "${var.stack_version}"] } data "external" "latest_apm_server" { program = ["bash", "${path.module}/latest_apm_server.sh", "${var.stack_version}"] } resource "aws_key_pair" "provisioner_key" { public_key = file("${var.aws_provisioner_key_name}.pub") tags = var.tags } resource "random_password" "apm_secret_token" { length = 16 special = false }