Skip to content

Commit 42c9438

Browse files
committed
feat: root module to provision ecs service and task definition
1 parent 1c4a94a commit 42c9438

File tree

4 files changed

+314
-4
lines changed

4 files changed

+314
-4
lines changed

README.md

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,34 @@
1010

1111
## Providers
1212

13-
No providers.
13+
| Name | Version |
14+
|------|---------|
15+
| <a name="provider_aws"></a> [aws](#provider\_aws) | 5.58.0 |
1416

1517
## Modules
1618

1719
No modules.
1820

1921
## Resources
2022

21-
No resources.
23+
| Name | Type |
24+
|------|------|
25+
| [aws_ecs_service.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service) | resource |
26+
| [aws_ecs_task_definition.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition) | resource |
2227

2328
## Inputs
2429

25-
No inputs.
30+
| Name | Description | Type | Default | Required |
31+
|------|-------------|------|---------|:--------:|
32+
| <a name="input_service"></a> [service](#input\_service) | Configuration for ECS Service | `any` | n/a | yes |
33+
| <a name="input_task_definition"></a> [task\_definition](#input\_task\_definition) | ECS Task Definition to use for running tasks | `any` | n/a | yes |
2634

2735
## Outputs
2836

29-
No outputs.
37+
| Name | Description |
38+
|------|-------------|
39+
| <a name="output_ecs_service_arn"></a> [ecs\_service\_arn](#output\_ecs\_service\_arn) | ARN of the ECS Service |
40+
| <a name="output_ecs_service_id"></a> [ecs\_service\_id](#output\_ecs\_service\_id) | Identifier of the ECS Service |
41+
| <a name="output_ecs_task_definition_arn"></a> [ecs\_task\_definition\_arn](#output\_ecs\_task\_definition\_arn) | ARN of the ECS Task Definition |
42+
| <a name="output_ecs_task_definition_id"></a> [ecs\_task\_definition\_id](#output\_ecs\_task\_definition\_id) | Identifier of the ECS Task Definition |
3043
<!-- END_TF_DOCS -->

main.tf

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
################################################################################
2+
# ECS Service
3+
################################################################################
4+
5+
resource "aws_ecs_service" "this" {
6+
name = var.service.name
7+
cluster = var.service.cluster
8+
9+
deployment_maximum_percent = try(var.service.deployment_maximum_percent, null)
10+
deployment_minimum_healthy_percent = try(var.service.deployment_minimum_healthy_percent, null)
11+
desired_count = var.service.desired_count
12+
enable_ecs_managed_tags = try(var.service.enable_ecs_managed_tags, true)
13+
enable_execute_command = try(var.service.enable_execute_command, null)
14+
force_new_deployment = try(var.service.force_new_deployment, null)
15+
health_check_grace_period_seconds = try(var.service.health_check_grace_period_seconds, null)
16+
iam_role = try(var.service.iam_role, null)
17+
launch_type = "EC2"
18+
propagate_tags = try(var.service.propagate_tags, null)
19+
scheduling_strategy = try(var.service.scheduling_strategy, null)
20+
task_definition = aws_ecs_task_definition.this.id
21+
triggers = try(var.service.triggers, null)
22+
wait_for_steady_state = try(var.service.wait_for_steady_state, null)
23+
24+
dynamic "load_balancer" {
25+
for_each = try(var.service.load_balancer, [])
26+
iterator = load_balancer
27+
28+
content {
29+
elb_name = try(load_balancer.value.elb_name, null)
30+
target_group_arn = try(load_balancer.value.target_group_arn, null)
31+
container_name = load_balancer.value.container_name
32+
container_port = load_balancer.value.container_port
33+
}
34+
}
35+
36+
dynamic "network_configuration" {
37+
for_each = length(try(var.service.network_configuration, {})) > 0 ? [1] : []
38+
39+
content {
40+
subnets = var.service.network_configuration.subnets
41+
security_groups = try(var.service.network_configuration.security_groups, [])
42+
assign_public_ip = try(var.service.network_configuration.assign_public_ip, false)
43+
}
44+
}
45+
46+
dynamic "service_connect_configuration" {
47+
for_each = length(try(var.service.service_connect_configuration, {})) > 0 ? [1] : []
48+
49+
content {
50+
enabled = var.service.service_connect_configuration.enabled
51+
namespace = try(var.service.service_connect_configuration.namespace, null)
52+
53+
dynamic "log_configuration" {
54+
for_each = length(try(var.service.service_connect_configuration.log_configuration, {})) > 0 ? [1] : []
55+
56+
content {
57+
log_driver = var.service.service_connect_configuration.log_configuration.log_driver
58+
options = try(var.service.service_connect_configuration.log_configuration.options, null)
59+
60+
dynamic "secret_option" {
61+
for_each = try(var.service.service_connect_configuration.log_configuration.secret_option, [])
62+
iterator = secret_option
63+
64+
content {
65+
name = secret_option.value.name
66+
value_from = secret_option.value.value_from
67+
}
68+
}
69+
}
70+
}
71+
72+
dynamic "service" {
73+
for_each = try(var.service.service_connect_configuration.service, [])
74+
iterator = service
75+
76+
content {
77+
port_name = service.value.port_name
78+
discovery_name = try(service.value.discovery_name, null)
79+
ingress_port_override = try(service.value.ingress_port_override, null)
80+
81+
dynamic "client_alias" {
82+
for_each = length(try(service.client_alias, {})) > 0 ? [1] : []
83+
84+
content {
85+
port = service.client_alias.port
86+
dns_name = try(service.client_alias.dns_name, null)
87+
}
88+
}
89+
90+
dynamic "timeout" {
91+
for_each = length(try(service.value.timeout, {})) > 0 ? [1] : []
92+
93+
content {
94+
idle_timeout_seconds = try(service.value.timeout.idle_timeout_seconds, null)
95+
per_request_timeout_seconds = try(service.value.timeout.per_request_timeout_seconds, null)
96+
}
97+
}
98+
99+
dynamic "tls" {
100+
for_each = length(try(service.value.tls, {})) > 0 ? [1] : []
101+
102+
content {
103+
kms_key = try(service.value.tls.kms_key, null)
104+
role_arn = try(service.value.tls.role_arn, null)
105+
106+
issuer_cert_authority {
107+
aws_pca_authority_arn = try(service.value.tls.issuer_cert_authority.aws_pca_authority_arn, null)
108+
}
109+
}
110+
}
111+
}
112+
}
113+
}
114+
}
115+
116+
dynamic "volume_configuration" {
117+
for_each = length(try(var.service.volume_configuration, {})) > 0 ? [1] : []
118+
119+
content {
120+
name = var.service.volume_configuration.name
121+
122+
managed_ebs_volume {
123+
role_arn = var.service.volume_configuration.managed_ebs_volume.role_arn
124+
encrypted = try(var.service.volume_configuration.managed_ebs_volume.encrypted, null)
125+
file_system_type = try(var.service.volume_configuration.managed_ebs_volume.file_system_type, null)
126+
iops = try(var.service.volume_configuration.managed_ebs_volume.iops, null)
127+
kms_key_id = try(var.service.volume_configuration.managed_ebs_volume.kms_key_id, null)
128+
size_in_gb = try(var.service.volume_configuration.managed_ebs_volume.size_in_gb, null)
129+
snapshot_id = try(var.service.volume_configuration.managed_ebs_volume.snapshot_id, null)
130+
throughput = try(var.service.volume_configuration.managed_ebs_volume.throughput, null)
131+
volume_type = try(var.service.volume_configuration.managed_ebs_volume.volume_type, null)
132+
}
133+
}
134+
}
135+
136+
tags = try(var.service.tags, {})
137+
}
138+
139+
################################################################################
140+
# ECS Task Definition
141+
################################################################################
142+
143+
resource "aws_ecs_task_definition" "this" {
144+
container_definitions = jsonencode(var.task_definition.container_definitions)
145+
family = var.task_definition.family
146+
147+
cpu = try(var.task_definition.cpu, null)
148+
execution_role_arn = try(var.task_definition.execution_role_arn, null)
149+
ipc_mode = try(var.task_definition.ipc_mode, null)
150+
memory = try(var.task_definition.memory, null)
151+
network_mode = try(var.task_definition.network_mode, null)
152+
pid_mode = try(var.task_definition.pid_mode, null)
153+
requires_compatibilities = ["EC2"]
154+
skip_destroy = try(var.task_definition.skip_destroy, null)
155+
task_role_arn = try(var.task_definition.task_role_arn, null)
156+
track_latest = try(var.task_definition.track_latest, null)
157+
158+
dynamic "inference_accelerator" {
159+
for_each = try(var.task_definition.inference_accelerator, [])
160+
iterator = inference_accelerator
161+
162+
content {
163+
device_name = inference_accelerator.value.device_name
164+
device_type = inference_accelerator.value.device_type
165+
}
166+
}
167+
168+
dynamic "runtime_platform" {
169+
for_each = length(try(var.task_definition.runtime_platform, {})) > 0 ? [1] : []
170+
171+
content {
172+
operating_system_family = try(var.task_definition.runtime_platform.operating_system_family, null)
173+
cpu_architecture = try(var.task_definition.runtime_platform.cpu_architecture, null)
174+
}
175+
}
176+
177+
dynamic "placement_constraints" {
178+
for_each = try(var.task_definition.placement_constraints, [])
179+
iterator = placement_constraints
180+
181+
content {
182+
expression = try(placement_constraints.value.expression, null)
183+
type = placement_constraints.value.type
184+
}
185+
}
186+
187+
dynamic "proxy_configuration" {
188+
for_each = length(try(var.task_definition.proxy_configuration, {})) > 0 ? [1] : []
189+
190+
content {
191+
container_name = var.task_definition.proxy_configuration.container_name
192+
properties = var.task_definition.proxy_configuration.properties
193+
type = try(var.task_definition.proxy_configuration.type, null)
194+
}
195+
}
196+
197+
dynamic "ephemeral_storage" {
198+
for_each = length(try(var.task_definition.ephemeral_storage, {})) > 0 ? [1] : []
199+
200+
content {
201+
size_in_gib = var.task_definition.ephemeral_storage.size_in_gib
202+
}
203+
}
204+
205+
dynamic "volume" {
206+
for_each = try(var.task_definition.volume, [])
207+
iterator = volume
208+
209+
content {
210+
name = volume.value.name
211+
configure_at_launch = try(volume.value.configure_at_launch, null)
212+
host_path = try(volume.value.host_path, null)
213+
214+
dynamic "docker_volume_configuration" {
215+
for_each = length(try(volume.value.docker_volume_configuration, {})) > 0 ? [1] : []
216+
217+
content {
218+
autoprovision = try(volume.value.docker_volume_configuration.autoprovision, null)
219+
driver_opts = try(volume.value.docker_volume_configuration.driver_opts, null)
220+
driver = try(volume.value.docker_volume_configuration.driver, null)
221+
labels = try(volume.value.docker_volume_configuration.labels, null)
222+
scope = try(volume.value.docker_volume_configuration.scope, null)
223+
}
224+
}
225+
226+
dynamic "efs_volume_configuration" {
227+
for_each = length(try(volume.value.efs_volume_configuration, {})) > 0 ? [1] : []
228+
229+
content {
230+
file_system_id = volume.value.efs_volume_configuration.file_system_id
231+
root_directory = try(volume.value.efs_volume_configuration.root_directory, null)
232+
transit_encryption = try(volume.value.efs_volume_configuration.transit_encryption, null)
233+
transit_encryption_port = try(volume.value.efs_volume_configuration.transit_encryption_port, null)
234+
235+
dynamic "authorization_config" {
236+
for_each = length(try(volume.value.efs_volume_configuration.authorization_config, {})) > 0 ? [1] : []
237+
238+
content {
239+
access_point_id = try(volume.value.efs_volume_configuration.authorization_config.access_point_id, null)
240+
iam = try(volume.value.efs_volume_configuration.authorization_config.iam, null)
241+
}
242+
}
243+
}
244+
}
245+
246+
dynamic "fsx_windows_file_server_volume_configuration" {
247+
for_each = length(try(volume.value.fsx_windows_file_server_volume_configuration, {})) > 0 ? [1] : []
248+
249+
content {
250+
file_system_id = volume.value.fsx_windows_file_server_volume_configuration.file_system_id
251+
root_directory = volume.value.fsx_windows_file_server_volume_configuration.root_directory
252+
253+
authorization_config {
254+
credentials_parameter = volume.value.fsx_windows_file_server_volume_configuration.credentials_parameter
255+
domain = volume.value.fsx_windows_file_server_volume_configuration.domain
256+
}
257+
}
258+
}
259+
}
260+
}
261+
262+
tags = try(var.task_definition.tags, {})
263+
}

outputs.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
################################################################################
2+
# ECS Service
3+
################################################################################
4+
5+
output "ecs_service_arn" {
6+
description = "ARN of the ECS Service"
7+
value = aws_ecs_service.this.id
8+
}
9+
10+
################################################################################
11+
# ECS Task Definition
12+
################################################################################
13+
14+
output "ecs_task_definition_arn" {
15+
description = "ARN of the ECS Task Definition"
16+
value = aws_ecs_task_definition.this.arn
17+
}

variables.tf

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
################################################################################
2+
# ECS Task Definition
3+
################################################################################
4+
5+
variable "task_definition" {
6+
description = "ECS Task Definition to use for running tasks"
7+
type = any
8+
}
9+
10+
################################################################################
11+
# ECS Service
12+
################################################################################
13+
14+
variable "service" {
15+
description = "Configuration for ECS Service"
16+
type = any
17+
}

0 commit comments

Comments
 (0)