From 1b8c269aceb8a5d7c70c29c533f05334c5ae637a Mon Sep 17 00:00:00 2001 From: qbart Date: Tue, 27 Aug 2024 00:46:00 +0200 Subject: [PATCH 1/2] feat: Add ECS discovery --- .../ecs-service-discovery/.terraform.lock.hcl | 89 ++++++++++++ .../ecs-service-discovery/README.cover.png | Bin 0 -> 116011 bytes examples/ecs-service-discovery/README.md | 46 ++++++ examples/ecs-service-discovery/main.tf | 133 ++++++++++++++++++ examples/ecs-service-discovery/versions.tf | 15 ++ modules/ecs-service/main.tf | 85 ++++++++++- modules/ecs-service/variables.tf | 23 ++- 7 files changed, 380 insertions(+), 11 deletions(-) create mode 100644 examples/ecs-service-discovery/.terraform.lock.hcl create mode 100644 examples/ecs-service-discovery/README.cover.png create mode 100644 examples/ecs-service-discovery/README.md create mode 100644 examples/ecs-service-discovery/main.tf create mode 100644 examples/ecs-service-discovery/versions.tf diff --git a/examples/ecs-service-discovery/.terraform.lock.hcl b/examples/ecs-service-discovery/.terraform.lock.hcl new file mode 100644 index 0000000..0a5bd22 --- /dev/null +++ b/examples/ecs-service-discovery/.terraform.lock.hcl @@ -0,0 +1,89 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "4.67.0" + constraints = "~> 4.0" + hashes = [ + "h1:P43vwcDPG99x5WBbmqwUPgfJrfXf6/ucAIbGlRb7k1w=", + "h1:dCRc4GqsyfqHEMjgtlM1EympBcgTmcTkWaJmtd91+KA=", + "zh:0843017ecc24385f2b45f2c5fce79dc25b258e50d516877b3affee3bef34f060", + "zh:19876066cfa60de91834ec569a6448dab8c2518b8a71b5ca870b2444febddac6", + "zh:24995686b2ad88c1ffaa242e36eee791fc6070e6144f418048c4ce24d0ba5183", + "zh:4a002990b9f4d6d225d82cb2fb8805789ffef791999ee5d9cb1fef579aeff8f1", + "zh:559a2b5ace06b878c6de3ecf19b94fbae3512562f7a51e930674b16c2f606e29", + "zh:6a07da13b86b9753b95d4d8218f6dae874cf34699bca1470d6effbb4dee7f4b7", + "zh:768b3bfd126c3b77dc975c7c0e5db3207e4f9997cf41aa3385c63206242ba043", + "zh:7be5177e698d4b547083cc738b977742d70ed68487ce6f49ecd0c94dbf9d1362", + "zh:8b562a818915fb0d85959257095251a05c76f3467caa3ba95c583ba5fe043f9b", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:9c385d03a958b54e2afd5279cd8c7cbdd2d6ca5c7d6a333e61092331f38af7cf", + "zh:b3ca45f2821a89af417787df8289cb4314b273d29555ad3b2a5ab98bb4816b3b", + "zh:da3c317f1db2469615ab40aa6baba63b5643bae7110ff855277a1fb9d8eb4f2c", + "zh:dc6430622a8dc5cdab359a8704aec81d3825ea1d305bbb3bbd032b1c6adfae0c", + "zh:fac0d2ddeadf9ec53da87922f666e1e73a603a611c57bcbc4b86ac2821619b1d", + ] +} + +provider "registry.terraform.io/hashicorp/cloudinit" { + version = "2.3.4" + constraints = "~> 2.0" + hashes = [ + "h1:/Ty/HXg0Bti5T+Zk6XvhwEHyKGiOV5LzCrbLiekjuLU=", + "h1:cVIIhnXweOHavu1uV2bdKScTjLbM1WnKM/25wqYBJWo=", + "zh:09f1f1e1d232da96fbf9513b0fb5263bc2fe9bee85697aa15d40bb93835efbeb", + "zh:381e74b90d7a038c3a8dcdcc2ce8c72d6b86da9f208a27f4b98cabe1a1032773", + "zh:398eb321949e28c4c5f7c52e9b1f922a10d0b2b073b7db04cb69318d24ffc5a9", + "zh:4a425679614a8f0fe440845828794e609b35af17db59134c4f9e56d61e979813", + "zh:4d955d8608ece4984c9f1dacda2a59fdb4ea6b0243872f049b388181aab8c80a", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:a48fbee1d58d55a1f4c92c2f38c83a37c8b2f2701ed1a3c926cefb0801fa446a", + "zh:b748fe6631b16a1dafd35a09377c3bffa89552af584cf95f47568b6cd31fc241", + "zh:d4b931f7a54603fa4692a2ec6e498b95464babd2be072bed5c7c2e140a280d99", + "zh:f1c9337fcfe3a7be39d179eb7986c22a979cfb2c587c05f1b3b83064f41785c5", + "zh:f58fc57edd1ee3250a28943cd84de3e4b744cdb52df0356a53403fc240240636", + "zh:f5f50de0923ff530b03e1bca0ac697534d61bb3e5fc7f60e13becb62229097a9", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.6.2" + constraints = "~> 3.0" + hashes = [ + "h1:R5qdQjKzOU16TziCN1vR3Exr/B+8WGK80glLTT4ZCPk=", + "h1:wmG0QFjQ2OfyPy6BB7mQ57WtoZZGGV07uAPQeDmIrAE=", + "zh:0ef01a4f81147b32c1bea3429974d4d104bbc4be2ba3cfa667031a8183ef88ec", + "zh:1bcd2d8161e89e39886119965ef0f37fcce2da9c1aca34263dd3002ba05fcb53", + "zh:37c75d15e9514556a5f4ed02e1548aaa95c0ecd6ff9af1119ac905144c70c114", + "zh:4210550a767226976bc7e57d988b9ce48f4411fa8a60cd74a6b246baf7589dad", + "zh:562007382520cd4baa7320f35e1370ffe84e46ed4e2071fdc7e4b1a9b1f8ae9b", + "zh:5efb9da90f665e43f22c2e13e0ce48e86cae2d960aaf1abf721b497f32025916", + "zh:6f71257a6b1218d02a573fc9bff0657410404fb2ef23bc66ae8cd968f98d5ff6", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:9647e18f221380a85f2f0ab387c68fdafd58af6193a932417299cdcae4710150", + "zh:bb6297ce412c3c2fa9fec726114e5e0508dd2638cad6a0cb433194930c97a544", + "zh:f83e925ed73ff8a5ef6e3608ad9225baa5376446349572c2449c0c0b3cf184b7", + "zh:fbef0781cb64de76b1df1ca11078aecba7800d82fd4a956302734999cfd9a4af", + ] +} + +provider "registry.terraform.io/hashicorp/tls" { + version = "4.0.5" + constraints = "~> 4.0" + hashes = [ + "h1:e4LBdJoZJNOQXPWgOAG0UuPBVhCStu98PieNlqJTmeU=", + "h1:yLqz+skP3+EbU3yyvw8JqzflQTKDQGsC9QyZAg+S4dg=", + "zh:01cfb11cb74654c003f6d4e32bbef8f5969ee2856394a96d127da4949c65153e", + "zh:0472ea1574026aa1e8ca82bb6df2c40cd0478e9336b7a8a64e652119a2fa4f32", + "zh:1a8ddba2b1550c5d02003ea5d6cdda2eef6870ece86c5619f33edd699c9dc14b", + "zh:1e3bb505c000adb12cdf60af5b08f0ed68bc3955b0d4d4a126db5ca4d429eb4a", + "zh:6636401b2463c25e03e68a6b786acf91a311c78444b1dc4f97c539f9f78de22a", + "zh:76858f9d8b460e7b2a338c477671d07286b0d287fd2d2e3214030ae8f61dd56e", + "zh:a13b69fb43cb8746793b3069c4d897bb18f454290b496f19d03c3387d1c9a2dc", + "zh:a90ca81bb9bb509063b736842250ecff0f886a91baae8de65c8430168001dad9", + "zh:c4de401395936e41234f1956ebadbd2ed9f414e6908f27d578614aaa529870d4", + "zh:c657e121af8fde19964482997f0de2d5173217274f6997e16389e7707ed8ece8", + "zh:d68b07a67fbd604c38ec9733069fbf23441436fecf554de6c75c032f82e1ef19", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/examples/ecs-service-discovery/README.cover.png b/examples/ecs-service-discovery/README.cover.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8ad50bbf06bc228d9d27d1038011f278d38d06 GIT binary patch literal 116011 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 Te)9LEzWA}W!NUs8S8x9hCBW +## Requirements + +| Name | Version | +|------|---------| +| [terraform](#requirement\_terraform) | ~> 1.0 | +| [aws](#requirement\_aws) | ~> 4.0 | + +## Providers + +| Name | Version | +|------|---------| +| [aws](#provider\_aws) | 4.67.0 | +| [random](#provider\_random) | 3.6.2 | + +## Modules + +| Name | Source | Version | +|------|--------|---------| +| [cluster](#module\_cluster) | ../../modules/ecs-cluster | n/a | +| [lb](#module\_lb) | Selleo/backend/aws//modules/load-balancer | 0.23.0 | +| [service](#module\_service) | ../../modules/ecs-service | n/a | +| [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 4.0 | + +## Resources + +| Name | Type | +|------|------| +| [aws_alb_listener.http](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/alb_listener) | resource | +| [random_id.example](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource | + +## Outputs + +| Name | Description | +|------|-------------| +| [lb\_dns](#output\_lb\_dns) | n/a | + \ No newline at end of file diff --git a/examples/ecs-service-discovery/main.tf b/examples/ecs-service-discovery/main.tf new file mode 100644 index 0000000..84ede86 --- /dev/null +++ b/examples/ecs-service-discovery/main.tf @@ -0,0 +1,133 @@ +locals { + context = { + namespace = "selleo" + stage = "dev" + name = "example" + } +} + +resource "random_id" "example" { + byte_length = 2 + + prefix = "discovery-" +} + +# network + +module "vpc" { + source = "../../modules/vpc" + + name = random_id.example.hex + cidr = "10.0.0.0/16" +} + +module "public_subnets" { + source = "../../modules/vpc-public-subnet" + + vpc_id = module.vpc.id + internet_gateway_id = module.vpc.internet_gateway_id + config = { + "a" = { + az = "eu-central-1a" + cidr = "10.0.1.0/24" + nat = false + } + "b" = { + az = "eu-central-1b" + cidr = "10.0.2.0/24" + nat = false + } + } +} + +module "lb" { + source = "../../modules/lb/alb" + + name = random_id.example.hex + vpc_id = module.vpc.id + subnet_ids = module.public_subnets.ids + force_https = false + + context = local.context +} + +resource "aws_service_discovery_http_namespace" "local" { + name = "local" + description = "Service discovery namespace for ECS services" + + tags = { + "context.namespace" = "selleo" + "context.stage" = "dev" + "context.name" = "app" + } +} + +# cluster + +module "cluster" { + source = "../../modules/ecs-cluster" + + context = { + namespace = "selleo" + stage = "dev" + name = "example" + } + + name_prefix = random_id.example.hex + vpc_id = module.vpc.id + subnet_ids = module.public_subnets.ids + instance_type = "t3.nano" + lb_security_group_id = module.lb.security_group_id + + autoscaling_group = { + min_size = 1 + max_size = 5 + desired_capacity = 1 + } +} + +module "service" { + source = "../../modules/ecs-service" + + context = { + namespace = "selleo" + stage = "dev" + name = "example" + } + + name = random_id.example.hex + vpc_id = module.vpc.id + subnet_ids = module.public_subnets.ids + cluster_id = module.cluster.id + desired_count = 1 + + tcp_ports = [ + { + name = "http" + host = 0 + container = 3000 + } + ] + + service_discovery = { + arn = aws_service_discovery_http_namespace.local.arn + name = "app" + } +} + +resource "aws_alb_listener" "http" { + load_balancer_arn = module.lb.id + port = 80 + protocol = "HTTP" + + default_action { + target_group_arn = module.service.lb_target_group_id + type = "forward" + } +} + +# outputs + +output "lb_dns" { + value = "http://${module.lb.dns_name}" +} diff --git a/examples/ecs-service-discovery/versions.tf b/examples/ecs-service-discovery/versions.tf new file mode 100644 index 0000000..51493ec --- /dev/null +++ b/examples/ecs-service-discovery/versions.tf @@ -0,0 +1,15 @@ +terraform { + required_version = "~> 1.0" + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.0" + } + } +} + +provider "aws" { + region = "eu-central-1" +} + diff --git a/modules/ecs-service/main.tf b/modules/ecs-service/main.tf index 2bcaa50..be59698 100644 --- a/modules/ecs-service/main.tf +++ b/modules/ecs-service/main.tf @@ -11,7 +11,7 @@ locals { }, var.tags) # when no ports are specified, we assume this is a worker - is_worker = var.port == null ? true : false + is_worker = var.tcp_ports == [] ? true : false # when LB is used ports must be specified needs_lb = var.create_alb_target_group && !local.is_worker @@ -63,13 +63,23 @@ resource "aws_ecs_task_definition" "this" { cpu = 64 name = var.name image = "qbart/go-http-server-noop:0.3.0" + mountPoints = var.efs == null ? [] : [ + { + sourceVolume = var.efs.volume + containerPath = var.efs.mount_path + readOnly = false + } + ], + volumesFrom = [], # workers do not need port mappings portMappings = local.is_worker ? [] : [ + for port in var.tcp_ports : { - containerPort = var.port, - hostPort = 0, + containerPort = port.container, + hostPort = port.host, # fargate port must match container port protocol = "tcp", - }, + name = port.name, + } ], environment = [ { @@ -78,7 +88,7 @@ resource "aws_ecs_task_definition" "this" { }, { name = "ADDR" - value = var.port == null ? ":3000" : ":${var.port}" + value = var.tcp_ports == [] ? ":3000" : ":${var.tcp_ports[0].container}" }, ], @@ -93,6 +103,21 @@ resource "aws_ecs_task_definition" "this" { } ]) + dynamic "volume" { + for_each = var.efs == null ? [] : [var.efs.volume] + + content { + name = var.efs.volume + + efs_volume_configuration { + file_system_id = var.efs.id + root_directory = "/" + # transit_encryption = "ENABLED" + # transit_encryption_port = 2999 + } + } + } + tags = merge(local.tags, { "resource.group" = "compute" }) } @@ -126,6 +151,21 @@ resource "aws_ecs_task_definition" "one_off" { } ]) + dynamic "volume" { + for_each = var.efs == null ? [] : [var.efs.volume] + + content { + name = var.efs.volume + + efs_volume_configuration { + file_system_id = var.efs.id + root_directory = "/" + # transit_encryption = "ENABLED" + # transit_encryption_port = 2999 + } + } + } + tags = merge(local.tags, { "resource.group" = "compute" }) } @@ -143,7 +183,7 @@ resource "aws_ecs_service" "this" { content { target_group_arn = aws_alb_target_group.this[0].arn container_name = var.name - container_port = var.port + container_port = var.tcp_ports[0].container } } @@ -160,6 +200,37 @@ resource "aws_ecs_service" "this" { } } + dynamic "service_connect_configuration" { + for_each = var.service_discovery == null ? [] : [var.service_discovery] + + content { + enabled = true + log_configuration { + log_driver = "awslogs" + options = { + awslogs-group = aws_cloudwatch_log_group.this.name, + awslogs-region = data.aws_region.this.name, + awslogs-stream-prefix = "ecs-connect", + } + } + namespace = service_connect_configuration.value.arn + + dynamic "service" { + for_each = var.tcp_ports + + content { + client_alias { + port = service.value.container + # dns_name = service_connect_configuration.value.name + } + discovery_name = "${service_connect_configuration.value.name}-${service.value.name}" + # ingress_port_override = "" # - (Optional) Port number for the Service Connect proxy to listen on. + port_name = service.value.name + } + } + } + } + tags = merge(local.tags, { "resource.group" = "compute" }) lifecycle { @@ -315,7 +386,7 @@ resource "aws_alb_target_group" "this" { count = local.needs_lb ? 1 : 0 name = random_id.prefix.hex - port = var.port + port = var.tcp_ports[0].container protocol = "HTTP" vpc_id = var.vpc_id deregistration_delay = var.deregistration_delay # draining time diff --git a/modules/ecs-service/variables.tf b/modules/ecs-service/variables.tf index 241fb0b..e400d91 100644 --- a/modules/ecs-service/variables.tf +++ b/modules/ecs-service/variables.tf @@ -37,10 +37,16 @@ variable "desired_count" { # optional -variable "port" { - description = "Container port" - type = number - default = null +variable "tcp_ports" { + description = "Port mapping. Use 0 for dynamic host mapping. Fargate requires ports to be the same." + type = list( + object({ + name = string + host = number + container = number + }) + ) + default = [] } variable "enable_execute_command" { @@ -136,4 +142,13 @@ variable "efs" { }) description = "EFS volume to mount to ECS" default = null +} + +variable "service_discovery" { + description = "Service discovery configuration." + type = object({ + arn = string + name = string + }) + default = null } \ No newline at end of file From aa5394409d4661ceeb5c937f98432b7b77359cfa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 26 Aug 2024 22:46:45 +0000 Subject: [PATCH 2/2] chore: Update terraform docs --- examples/ecs-service-discovery/README.md | 6 ++++-- modules/ecs-service/README.md | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/ecs-service-discovery/README.md b/examples/ecs-service-discovery/README.md index 610b986..01a424b 100644 --- a/examples/ecs-service-discovery/README.md +++ b/examples/ecs-service-discovery/README.md @@ -27,15 +27,17 @@ service_name-port_name:port | Name | Source | Version | |------|--------|---------| | [cluster](#module\_cluster) | ../../modules/ecs-cluster | n/a | -| [lb](#module\_lb) | Selleo/backend/aws//modules/load-balancer | 0.23.0 | +| [lb](#module\_lb) | ../../modules/lb/alb | n/a | +| [public\_subnets](#module\_public\_subnets) | ../../modules/vpc-public-subnet | n/a | | [service](#module\_service) | ../../modules/ecs-service | n/a | -| [vpc](#module\_vpc) | terraform-aws-modules/vpc/aws | ~> 4.0 | +| [vpc](#module\_vpc) | ../../modules/vpc | n/a | ## Resources | Name | Type | |------|------| | [aws_alb_listener.http](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/alb_listener) | resource | +| [aws_service_discovery_http_namespace.local](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/service_discovery_http_namespace) | resource | | [random_id.example](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource | ## Outputs diff --git a/modules/ecs-service/README.md b/modules/ecs-service/README.md index b8b8870..58c5228 100644 --- a/modules/ecs-service/README.md +++ b/modules/ecs-service/README.md @@ -68,10 +68,11 @@ | [log\_retention\_in\_days](#input\_log\_retention\_in\_days) | Log retention in days for Cloudwatch. | `string` | `60` | no | | [name](#input\_name) | ECS Service name. | `string` | n/a | yes | | [one\_off\_commands](#input\_one\_off\_commands) | Set of commands that the tasks are created for. | `set(string)` | `[]` | no | -| [port](#input\_port) | Container port | `number` | `null` | no | | [secrets](#input\_secrets) | Paths to secret. All secrets are read under the path. | `set(string)` | `[]` | no | +| [service\_discovery](#input\_service\_discovery) | Service discovery configuration. |
object({
arn = string
name = string
})
| `null` | no | | [subnet\_ids](#input\_subnet\_ids) | List of AWS subent IDs for service. | `list(string)` | n/a | yes | | [tags](#input\_tags) | Additional tags attached to resources. | `map(string)` | `{}` | no | +| [tcp\_ports](#input\_tcp\_ports) | Port mapping. Use 0 for dynamic host mapping. Fargate requires ports to be the same. |
list(
object({
name = string
host = number
container = number
})
)
| `[]` | no | | [vpc\_id](#input\_vpc\_id) | VPC id. | `string` | n/a | yes | ## Outputs