From 093abc491ab7fdbc1693d8360da3a386dd81f7fe Mon Sep 17 00:00:00 2001 From: Michael Barrientos Date: Tue, 8 Oct 2019 07:57:34 -0700 Subject: [PATCH] aws-ecs Add support for ordered_placement_strategy (#139) [feature] aws-ecs Add support for ordered_placement_strategy --- aws-ecs-job-fargate/README.md | 1 + aws-ecs-job-fargate/main.tf | 16 ++++++++++++++++ aws-ecs-job-fargate/variables.tf | 8 +++++++- aws-ecs-job/README.md | 1 + aws-ecs-job/main.tf | 16 ++++++++++++++++ aws-ecs-job/variables.tf | 8 +++++++- aws-ecs-service-fargate/README.md | 1 + aws-ecs-service-fargate/service.tf | 16 ++++++++++++++++ aws-ecs-service-fargate/variables.tf | 8 +++++++- aws-ecs-service/README.md | 1 + aws-ecs-service/service.tf | 16 ++++++++++++++++ aws-ecs-service/variables.tf | 8 +++++++- 12 files changed, 96 insertions(+), 4 deletions(-) diff --git a/aws-ecs-job-fargate/README.md b/aws-ecs-job-fargate/README.md index 7279eb79..9cb8b8fc 100644 --- a/aws-ecs-job-fargate/README.md +++ b/aws-ecs-job-fargate/README.md @@ -35,6 +35,7 @@ Since changing a service to use the new ARN requires destroying and recreating t | desired\_count | | number | n/a | yes | | env | Env for tagging and naming. See [doc](../README.md#consistent-tagging). | string | n/a | yes | | memory | Memory in megabytes for Fargate task. Used if task_definition provided, or for initial stub task if externally managed. | number | `512` | no | +| ordered\_placement\_strategy | Placement strategy for the task instances. | list | `[]` | no | | project | Project for tagging and naming. See [doc](../README.md#consistent-tagging) | string | n/a | yes | | registry\_secretsmanager\_arn | ARN for AWS Secrets Manager secret for credentials to private registry | string | `null` | no | | security\_group\_ids | Security group to use for the Fargate task. | list | `` | no | diff --git a/aws-ecs-job-fargate/main.tf b/aws-ecs-job-fargate/main.tf index 6cd5c770..b66b7216 100755 --- a/aws-ecs-job-fargate/main.tf +++ b/aws-ecs-job-fargate/main.tf @@ -33,6 +33,14 @@ resource "aws_ecs_service" "job" { security_groups = var.security_group_ids } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + tags = var.tag_service ? local.tags : {} } @@ -53,6 +61,14 @@ resource "aws_ecs_service" "unmanaged-job" { security_groups = var.security_group_ids } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + lifecycle { ignore_changes = [task_definition] } diff --git a/aws-ecs-job-fargate/variables.tf b/aws-ecs-job-fargate/variables.tf index 5a4621d1..7487835d 100755 --- a/aws-ecs-job-fargate/variables.tf +++ b/aws-ecs-job-fargate/variables.tf @@ -94,4 +94,10 @@ variable "tag_service" { description = "Apply cost tags to the ECS service. Only specify false for backwards compatibility with old ECS services." type = bool default = true -} \ No newline at end of file +} + +variable "ordered_placement_strategy" { + type = list(object({ type = string, field = string })) + default = [] + description = "Placement strategy for the task instances." +} diff --git a/aws-ecs-job/README.md b/aws-ecs-job/README.md index e35fa07b..a11636eb 100644 --- a/aws-ecs-job/README.md +++ b/aws-ecs-job/README.md @@ -34,6 +34,7 @@ service = false` argument can be removed. | deployment\_minimum\_healthy\_percent | (Optional) The lower limit (as a percentage of the service's desiredCount) of the number of running tasks that must remain running and healthy in a service during a deployment. | number | `100` | no | | desired\_count | | number | n/a | yes | | env | Env for tagging and naming. See [doc](../README.md#consistent-tagging). | string | n/a | yes | +| ordered\_placement\_strategy | Placement strategy for the task instances. | list | `[]` | no | | project | Project for tagging and naming. See [doc](../README.md#consistent-tagging) | string | n/a | yes | | scheduling\_strategy | Scheduling strategy for the service: REPLICA or DAEMON. | string | `"REPLICA"` | no | | service | Service for tagging and naming. See [doc](../README.md#consistent-tagging). | string | n/a | yes | diff --git a/aws-ecs-job/main.tf b/aws-ecs-job/main.tf index 6043d25b..cfad9526 100755 --- a/aws-ecs-job/main.tf +++ b/aws-ecs-job/main.tf @@ -27,6 +27,14 @@ resource "aws_ecs_service" "job" { deployment_minimum_healthy_percent = var.deployment_minimum_healthy_percent scheduling_strategy = var.scheduling_strategy + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + tags = var.tag_service ? local.tags : {} } @@ -41,6 +49,14 @@ resource "aws_ecs_service" "unmanaged-job" { deployment_minimum_healthy_percent = var.deployment_minimum_healthy_percent scheduling_strategy = var.scheduling_strategy + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + lifecycle { ignore_changes = [task_definition] } diff --git a/aws-ecs-job/variables.tf b/aws-ecs-job/variables.tf index 2d9cae23..58316b0f 100755 --- a/aws-ecs-job/variables.tf +++ b/aws-ecs-job/variables.tf @@ -75,4 +75,10 @@ variable "tag_service" { description = "Apply cost tags to the ECS service. Only specify false for backwards compatibility with old ECS services." type = bool default = true -} \ No newline at end of file +} + +variable "ordered_placement_strategy" { + type = list(object({ type = string, field = string })) + default = [] + description = "Placement strategy for the task instances." +} diff --git a/aws-ecs-service-fargate/README.md b/aws-ecs-service-fargate/README.md index 4fe68fd7..9920c48f 100644 --- a/aws-ecs-service-fargate/README.md +++ b/aws-ecs-service-fargate/README.md @@ -170,6 +170,7 @@ service = false` argument can be removed. | lb\_subnets | List of subnets in which to deploy the load balancer. | list | n/a | yes | | manage\_task\_definition | If false, Terraform will not touch the task definition for the ECS service after initial creation | bool | `true` | no | | memory | Memory in megabytes for Fargate task. Used if task_definition provided, or for initial stub task if externally managed. | number | `512` | no | +| ordered\_placement\_strategy | Placement strategy for the task instances. | list | `[]` | no | | owner | Owner for tagging and naming. See [doc](../README.md#consistent-tagging). | string | n/a | yes | | project | Project for tagging and naming. See [doc](../README.md#consistent-tagging) | string | n/a | yes | | registry\_secretsmanager\_arn | ARN for AWS Secrets Manager secret for credentials to private registry | string | `null` | no | diff --git a/aws-ecs-service-fargate/service.tf b/aws-ecs-service-fargate/service.tf index 2874c304..5b165ec6 100644 --- a/aws-ecs-service-fargate/service.tf +++ b/aws-ecs-service-fargate/service.tf @@ -66,6 +66,14 @@ resource "aws_ecs_service" "job" { } } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + tags = var.tag_service ? local.tags : {} depends_on = [aws_lb.service] @@ -99,6 +107,14 @@ resource "aws_ecs_service" "unmanaged-job" { } } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + # This lifecycle block is the only difference between job and unmanaged-job lifecycle { ignore_changes = [task_definition] diff --git a/aws-ecs-service-fargate/variables.tf b/aws-ecs-service-fargate/variables.tf index 24cfaae9..64ddd7c8 100755 --- a/aws-ecs-service-fargate/variables.tf +++ b/aws-ecs-service-fargate/variables.tf @@ -195,4 +195,10 @@ variable "tag_service" { description = "Apply cost tags to the ECS service. Only specify false for backwards compatibility with old ECS services." type = bool default = true -} \ No newline at end of file +} + +variable "ordered_placement_strategy" { + type = list(object({ type = string, field = string })) + default = [] + description = "Placement strategy for the task instances." +} diff --git a/aws-ecs-service/README.md b/aws-ecs-service/README.md index a68f056c..c363e7e7 100644 --- a/aws-ecs-service/README.md +++ b/aws-ecs-service/README.md @@ -160,6 +160,7 @@ service = false` argument can be removed. | lb\_ingress\_security\_group\_ids | | list | `` | no | | lb\_subnets | List of subnets in which to deploy the load balancer. | list | n/a | yes | | manage\_task\_definition | If false, Terraform will not touch the task definition for the ECS service after initial creation | bool | `true` | no | +| ordered\_placement\_strategy | Placement strategy for the task instances. | list | `[]` | no | | owner | Owner for tagging and naming. See [doc](../README.md#consistent-tagging). | string | n/a | yes | | project | Project for tagging and naming. See [doc](../README.md#consistent-tagging) | string | n/a | yes | | registry\_secretsmanager\_arn | ARN for AWS Secrets Manager secret for credentials to private registry | string | `null` | no | diff --git a/aws-ecs-service/service.tf b/aws-ecs-service/service.tf index 231a6edc..f71bd35f 100644 --- a/aws-ecs-service/service.tf +++ b/aws-ecs-service/service.tf @@ -69,6 +69,14 @@ resource "aws_ecs_service" "job" { } } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + tags = var.tag_service ? local.tags : {} depends_on = [aws_lb.service] @@ -104,6 +112,14 @@ resource "aws_ecs_service" "unmanaged-job" { } } + dynamic "ordered_placement_strategy" { + for_each = var.ordered_placement_strategy + content { + type = ordered_placement_strategy.value.type + field = ordered_placement_strategy.value.field + } + } + # This lifecycle block is the only difference between job and unmanaged-job lifecycle { ignore_changes = [task_definition] diff --git a/aws-ecs-service/variables.tf b/aws-ecs-service/variables.tf index 19f47b37..1090a2b8 100755 --- a/aws-ecs-service/variables.tf +++ b/aws-ecs-service/variables.tf @@ -189,4 +189,10 @@ variable "tag_service" { description = "Apply cost tags to the ECS service. Only specify false for backwards compatibility with old ECS services." type = bool default = true -} \ No newline at end of file +} + +variable "ordered_placement_strategy" { + type = list(object({ type = string, field = string })) + default = [] + description = "Placement strategy for the task instances." +}