testing/infra/terraform/modules/ec_deployment/deployment.tf (216 lines of code) (raw):
locals {
region = var.region
version = var.stack_version
deployment_template = var.deployment_template
name_prefix = var.deployment_name_prefix
disable_observability = var.observability_deployment == "none"
self_observability = var.observability_deployment == "self"
dedicated_observability = var.observability_deployment == "dedicated"
}
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["apm"] != "" ? [var.docker_image["apm"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["apm"]}"
}
}
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["apm"] != "" ? [var.docker_image["apm"]] : []
content {
docker_image = "${config.value}:${var.docker_image_tag_override["apm"]}"
}
}
topology {
size = var.apm_server_size
zone_count = var.apm_server_zone_count
}
}
}
dynamic "observability" {
for_each = local.disable_observability ? [] : [1]
content {
deployment_id = var.observability_deployment
}
}
}
#ref_id = "main-elasticsearch"
resource "ec_deployment" "dedicated_observability_deployment" {
count = local.dedicated_observability ? 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_features" {
content = templatefile("${path.module}/scripts/enable_features.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
enable_tail_sampling = var.apm_server_tail_sampling
tail_sampling_storage_limit = var.apm_server_tail_sampling_storage_limit
})
filename = "${path.cwd}/scripts/enable_features.sh"
}
locals {
secret_token_file = "${path.cwd}/secret_token_value.json"
}
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,
secret_token_file = local.secret_token_file
})
filename = "${path.cwd}/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.cwd}/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.cwd}/scripts/custom-apm-integration-pkg.sh"
}
resource "null_resource" "enable_features" {
triggers = {
shell_hash = local_file.enable_features.id
integrations_server = var.integrations_server
}
provisioner "local-exec" {
command = "scripts/enable_features.sh"
interpreter = ["/bin/bash", "-c"]
working_dir = path.cwd
}
}
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.cwd
}
}
# Since the secret token value is set in the APM Integration policy, we need
# to extract it from there.
# Load it from secret_token_file as a sensitive variable.
data "local_sensitive_file" "secret_token" {
count = var.integrations_server ? 1 : 0
filename = local.secret_token_file
depends_on = [null_resource.secret_token]
}
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.cwd
}
}
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.cwd
}
}
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.cwd
}
}
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.cwd}/scripts/drop_pipeline.sh"
}