testing/environments/infra/terraform/modules/ec_deployment/deployment.tf (211 lines of code) (raw):
locals {
region = var.region
version = var.stack_version
deployment_template = var.deployment_template
name_prefix = var.deployment_name_prefix
}
data "ec_stack" "deployment_version" {
version_regex = local.version
region = local.region
}
resource "ec_deployment" "deployment" {
name = "${local.name_prefix}-${data.ec_stack.deployment_version.version}"
version = data.ec_stack.deployment_version.version
region = local.region
deployment_template_id = local.deployment_template
tags = var.tags
elasticsearch {
autoscale = var.elasticsearch_autoscale
topology {
id = "hot_content"
size = var.elasticsearch_size
zone_count = var.elasticsearch_zone_count
}
dynamic "topology" {
for_each = var.elasticsearch_dedicated_masters ? [3] : []
content {
id = "master"
size = "1g"
zone_count = topology.value # Dedicated masters always need to be set in all zones
}
}
dynamic "config" {
for_each = var.docker_image_tag_override["elasticsearch"] != "" ? [var.docker_image["elasticsearch"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["elasticsearch"]}"
}
}
}
kibana {
dynamic "config" {
for_each = var.docker_image_tag_override["kibana"] != "" ? [var.docker_image["kibana"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["kibana"]}"
}
}
}
dynamic "apm" {
for_each = var.integrations_server ? [] : [1]
content {
dynamic "config" {
for_each = var.docker_image_tag_override["agent"] != "" ? [var.docker_image["agent"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["agent"]}"
}
}
topology {
size = var.apm_server_size
zone_count = var.apm_server_zone_count
}
}
}
dynamic "integrations_server" {
for_each = var.integrations_server ? [1] : []
content {
dynamic "config" {
for_each = var.docker_image_tag_override["agent"] != "" ? [var.docker_image["agent"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["agent"]}"
}
}
topology {
size = var.apm_server_size
zone_count = var.apm_server_zone_count
}
}
}
dynamic "observability" {
for_each = ec_deployment.deployment_monitor.*
content {
deployment_id = observability.value.id
logs = true
metrics = true
ref_id = "main-elasticsearch"
}
}
}
resource "ec_deployment" "deployment_monitor" {
count = var.monitor_deployment ? 1 : 0
name = "monitor-${local.name_prefix}-${local.version}"
version = data.ec_stack.deployment_version.version
region = local.region
deployment_template_id = local.deployment_template
tags = var.tags
elasticsearch {
topology {
id = "hot_content"
size = "2g"
}
}
kibana {}
}
resource "local_file" "enable_expvar" {
content = templatefile("${path.module}/scripts/enable_expvar.tftpl", {
kibana_url = ec_deployment.deployment.kibana.0.https_endpoint,
elastic_password = ec_deployment.deployment.elasticsearch_password,
enable_expvar = var.apm_server_expvar
enable_pprof = var.apm_server_pprof
})
filename = "${path.module}/scripts/enable_expvar.sh"
}
resource "local_file" "secret_token" {
count = var.integrations_server ? 1 : 0
content = templatefile("${path.module}/scripts/secret_token.tftpl", {
kibana_url = ec_deployment.deployment.kibana.0.https_endpoint,
elastic_password = ec_deployment.deployment.elasticsearch_password,
})
filename = "${path.module}/scripts/secret_token.sh"
}
resource "local_file" "shard_settings" {
count = var.apm_index_shards > 0 ? 1 : 0
content = templatefile("${path.module}/scripts/index_shards.tftpl", {
elasticsearch_url = ec_deployment.deployment.elasticsearch.0.https_endpoint,
elasticsearch_password = ec_deployment.deployment.elasticsearch_password,
elasticsearch_username = ec_deployment.deployment.elasticsearch_username,
shards = var.apm_index_shards,
})
filename = "${path.module}/scripts/index_shards.sh"
}
resource "local_file" "custom_apm_integration_pkg" {
count = var.custom_apm_integration_pkg_path != "" ? 1 : 0
content = templatefile("${path.module}/scripts/custom-apm-integration-pkg.tftpl", {
kibana_url = ec_deployment.deployment.kibana.0.https_endpoint,
elastic_password = ec_deployment.deployment.elasticsearch_password,
custom_apm_integration_pkg_path = var.custom_apm_integration_pkg_path,
})
filename = "${path.module}/scripts/custom-apm-integration-pkg.sh"
}
resource "null_resource" "enable_expvar" {
triggers = {
shell_hash = local_file.enable_expvar.id
integrations_server = var.integrations_server
}
provisioner "local-exec" {
command = "scripts/enable_expvar.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.module
}
}
resource "null_resource" "secret_token" {
count = var.integrations_server ? 1 : 0
triggers = {
deployment_id = ec_deployment.deployment.id
shell_hash = local_file.secret_token.0.id
}
provisioner "local-exec" {
command = "scripts/secret_token.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.module
}
}
resource "null_resource" "shard_settings" {
count = var.apm_index_shards > 0 ? 1 : 0
triggers = {
deployment_id = ec_deployment.deployment.id
shell_hash = local_file.shard_settings.0.id
}
provisioner "local-exec" {
command = "scripts/index_shards.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.module
}
}
resource "null_resource" "custom_apm_integration_pkg" {
count = var.custom_apm_integration_pkg_path != "" ? 1 : 0
triggers = {
deployment_id = ec_deployment.deployment.id
pkg_update = filesha256(var.custom_apm_integration_pkg_path)
}
provisioner "local-exec" {
command = "scripts/custom-apm-integration-pkg.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.module
}
}
# Since the secret token value is set in the APM Integration policy, we need
# an "external" resource to run a shell script that returns the secret token
# as {"value":"SECRET_TOKEN"}.
data "external" "secret_token" {
count = var.integrations_server ? 1 : 0
depends_on = [local_file.secret_token]
program = ["/bin/bash", "-c", "scripts/secret_token.sh"]
working_dir = path.module
}
resource "null_resource" "drop_pipeline" {
count = var.drop_pipeline ? 1 : 0
triggers = {
deployment_id = ec_deployment.deployment.id
shell_hash = local_file.drop_pipeline.0.id
}
provisioner "local-exec" {
command = "scripts/drop_pipeline.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.module
}
}
resource "local_file" "drop_pipeline" {
count = var.drop_pipeline ? 1 : 0
content = templatefile("${path.module}/scripts/drop_pipeline.tftpl", {
elasticsearch_url = ec_deployment.deployment.elasticsearch.0.https_endpoint,
elasticsearch_password = ec_deployment.deployment.elasticsearch_password,
elasticsearch_username = ec_deployment.deployment.elasticsearch_username,
})
filename = "${path.module}/scripts/drop_pipeline.sh"
}