Skip to content

Commit dd623d7

Browse files
committed
feat: root module to provision optional ecs cluster and an ecs service, and add basic tests
1 parent 26533ee commit dd623d7

File tree

5 files changed

+237
-0
lines changed

5 files changed

+237
-0
lines changed

main.tf

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
################################################################################
2+
# ECS Cluster
3+
################################################################################
4+
5+
module "ecs_cluster" {
6+
source = "terraform-aws-modules/ecs/aws//modules/cluster"
7+
version = "~> 5.11.3"
8+
9+
count = var.create_cluster ? 1 : 0
10+
11+
cluster_name = var.cluster_name
12+
default_capacity_provider_use_fargate = false
13+
14+
tags = var.cluster_tags
15+
}
16+
17+
################################################################################
18+
# ECS Service
19+
################################################################################
20+
21+
module "ecs_service" {
22+
source = "terraform-aws-modules/ecs/aws//modules/service"
23+
version = "~> 5.11.3"
24+
25+
name = var.service_name
26+
cluster_arn = var.create_cluster ? module.ecs_cluster[0].arn : var.cluster_arn
27+
subnet_ids = var.service_subnet_ids
28+
29+
cpu = var.service_cpu
30+
memory = var.service_memory
31+
32+
launch_type = "EC2"
33+
requires_compatibilities = ["EC2"]
34+
35+
tags = var.service_tags
36+
}

outputs.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
##############################
2+
# ECS Cluster Outputs
3+
##############################
4+
5+
output "cluster_arn" {
6+
description = "ARN of the ECS Cluster"
7+
value = var.create_cluster ? module.ecs_cluster[0].arn : var.cluster_arn
8+
}
9+
10+
##############################
11+
# ECS Service Outputs
12+
##############################
13+
14+
output "service_id" {
15+
description = "Identifier of the ECS Service"
16+
value = module.ecs_service.id
17+
}

tests/unit_tests.tftest.hcl

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
###########################################################
2+
# ECS Cluster Tests
3+
###########################################################
4+
5+
run "do_not_create_cluster_when_false" {
6+
command = plan
7+
8+
module {
9+
source = "./"
10+
}
11+
12+
variables {
13+
create_cluster = false
14+
15+
service_name = "test-service"
16+
cluster_arn = "arn:aws:ecs:ap-south-1:471112575944:cluster/default"
17+
service_subnet_ids = ["subnet-0ba38303b254c0785"]
18+
service_cpu = 128
19+
service_memory = 256
20+
}
21+
22+
assert {
23+
condition = length(module.ecs_cluster) == 0
24+
error_message = "ECS cluster was created even after setting `create_cluster` to `false`"
25+
}
26+
}
27+
28+
run "create_cluster_when_true" {
29+
command = plan
30+
31+
module {
32+
source = "./"
33+
}
34+
35+
variables {
36+
create_cluster = true
37+
cluster_name = "test-cluster"
38+
39+
service_name = "test-service"
40+
service_subnet_ids = ["subnet-0ba38303b254c0785"]
41+
service_cpu = 128
42+
service_memory = 256
43+
}
44+
45+
assert {
46+
condition = length(module.ecs_cluster) == 1
47+
error_message = "ECS cluster was not created even after setting `create_cluster` to `true`"
48+
}
49+
}
50+
51+
run "cluster_name_match" {
52+
command = plan
53+
54+
module {
55+
source = "./"
56+
}
57+
58+
variables {
59+
create_cluster = true
60+
cluster_name = "test-cluster"
61+
62+
service_name = "test-service"
63+
service_subnet_ids = ["subnet-0ba38303b254c0785"]
64+
service_cpu = 128
65+
service_memory = 256
66+
}
67+
68+
assert {
69+
condition = module.ecs_cluster[0].name == var.cluster_name
70+
error_message = "ECS Cluster name mismatch after creation"
71+
}
72+
}
73+
74+
###########################################################
75+
# ECS Service Tests
76+
###########################################################
77+
78+
run "service_name_match" {
79+
command = plan
80+
81+
module {
82+
source = "./"
83+
}
84+
85+
variables {
86+
create_cluster = true
87+
cluster_name = "test-cluster"
88+
89+
service_name = "test-service"
90+
service_subnet_ids = ["subnet-0ba38303b254c0785"]
91+
service_cpu = 128
92+
service_memory = 256
93+
}
94+
95+
assert {
96+
condition = module.ecs_service.name == var.service_name
97+
error_message = "ECS Cluster name mismatch after creation"
98+
}
99+
}

variables.tf

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#######################
2+
# ECS Cluster Variables
3+
#######################
4+
5+
variable "create_cluster" {
6+
description = "Creates an ECS cluster"
7+
type = bool
8+
default = true
9+
}
10+
11+
variable "cluster_name" {
12+
description = "Name of the ECS Cluster to create"
13+
type = string
14+
default = ""
15+
}
16+
17+
variable "cluster_tags" {
18+
description = "Resource Tags for ECS Cluster"
19+
type = map(any)
20+
default = {}
21+
}
22+
23+
#######################
24+
# ECS Service Variables
25+
#######################
26+
27+
variable "service_name" {
28+
description = "Name of the ECS Service"
29+
type = string
30+
}
31+
32+
variable "cluster_arn" {
33+
description = "ARN of the ECS cluster under which the service will be created"
34+
type = string
35+
default = null
36+
37+
validation {
38+
condition = var.create_cluster == true || startswith(var.cluster_arn != null ? var.cluster_arn : "", "arn:")
39+
error_message = "Specified Cluster ARN must be a valid ARN starting with \"arn:\"."
40+
}
41+
}
42+
43+
variable "service_subnet_ids" {
44+
description = "VPC subnet ids where the ECS services will be deployed"
45+
type = list(string)
46+
47+
validation {
48+
condition = length(var.service_subnet_ids) > 0
49+
error_message = "Specified subnet ids must contain at least one valid subnet identifier."
50+
}
51+
52+
validation {
53+
condition = alltrue([for subnet_id in var.service_subnet_ids : startswith(subnet_id, "subnet-")])
54+
error_message = "Specified subnet ids must be valid subnet identifiers starting with \"subnet-\"."
55+
}
56+
}
57+
58+
variable "service_cpu" {
59+
description = "CPU allocation for ECS task definitions"
60+
type = number
61+
62+
validation {
63+
condition = var.service_cpu > 0
64+
error_message = "Specified CPU allocation must be a positive number."
65+
}
66+
}
67+
68+
variable "service_memory" {
69+
description = "Memory allocation for ECS task definitions"
70+
type = number
71+
72+
validation {
73+
condition = var.service_memory > 0
74+
error_message = "Specified Memory allocation must be a positive number."
75+
}
76+
}
77+
78+
variable "service_tags" {
79+
description = "Resource Tags for ECS Service"
80+
type = map(any)
81+
default = {}
82+
}

versions.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
terraform {
2+
required_version = ">= 1.4.6"
3+
}

0 commit comments

Comments
 (0)