Skip to content

Commit ba34aa7

Browse files
feat: Add support of suspended_state block in aws_appautoscaling_target of ECS service (#373)
* feat: Add support of suspended_state block in aws_appautoscaling_target of ECS service * fix: Execute `pre-commit run -a` to pass CI --------- Co-authored-by: Bryant Biggs <[email protected]>
1 parent e442fa4 commit ba34aa7

File tree

8 files changed

+32
-3
lines changed

8 files changed

+32
-3
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
repos:
22
- repo: https://github.com/antonbabenko/pre-commit-terraform
3-
rev: v1.103.0
3+
rev: v1.104.0
44
hooks:
55
- id: terraform_wrapper_module_for_each
66
- id: terraform_fmt

README.md

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

main.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ module "service" {
171171
autoscaling_max_capacity = each.value.autoscaling_max_capacity
172172
autoscaling_policies = each.value.autoscaling_policies
173173
autoscaling_scheduled_actions = each.value.autoscaling_scheduled_actions
174+
autoscaling_suspended_state = each.value.autoscaling_suspended_state
174175

175176
# Security Group
176177
create_security_group = each.value.create_security_group

modules/service/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ module "ecs_service" {
235235
| <a name="input_autoscaling_min_capacity"></a> [autoscaling\_min\_capacity](#input\_autoscaling\_min\_capacity) | Minimum number of tasks to run in your service | `number` | `1` | no |
236236
| <a name="input_autoscaling_policies"></a> [autoscaling\_policies](#input\_autoscaling\_policies) | Map of autoscaling policies to create for the service | <pre>map(object({<br/> name = optional(string) # Will fall back to the key name if not provided<br/> policy_type = optional(string, "TargetTrackingScaling")<br/> predictive_scaling_policy_configuration = optional(object({<br/> max_capacity_breach_behavior = optional(string)<br/> max_capacity_buffer = optional(number)<br/> metric_specification = list(object({<br/> customized_capacity_metric_specification = optional(object({<br/> metric_data_query = list(object({<br/> expression = optional(string)<br/> id = string<br/> label = optional(string)<br/> metric_stat = optional(object({<br/> metric = object({<br/> dimension = optional(list(object({<br/> name = string<br/> value = string<br/> })))<br/> metric_name = optional(string)<br/> namespace = optional(string)<br/> })<br/> stat = string<br/> unit = optional(string)<br/> }))<br/> return_data = optional(bool)<br/> }))<br/> }))<br/> customized_load_metric_specification = optional(object({<br/> metric_data_query = list(object({<br/> expression = optional(string)<br/> id = string<br/> label = optional(string)<br/> metric_stat = optional(object({<br/> metric = object({<br/> dimension = optional(list(object({<br/> name = string<br/> value = string<br/> })))<br/> metric_name = optional(string)<br/> namespace = optional(string)<br/> })<br/> stat = string<br/> unit = optional(string)<br/> }))<br/> return_data = optional(bool)<br/> }))<br/> }))<br/> customized_scaling_metric_specification = optional(object({<br/> metric_data_query = list(object({<br/> expression = optional(string)<br/> id = string<br/> label = optional(string)<br/> metric_stat = optional(object({<br/> metric = object({<br/> dimension = optional(list(object({<br/> name = string<br/> value = string<br/> })))<br/> metric_name = optional(string)<br/> namespace = optional(string)<br/> })<br/> stat = string<br/> unit = optional(string)<br/> }))<br/> return_data = optional(bool)<br/> }))<br/> }))<br/> predefined_load_metric_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<br/> }))<br/> predefined_metric_pair_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<br/> }))<br/> predefined_scaling_metric_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<br/> }))<br/> target_value = number<br/> }))<br/> mode = optional(string)<br/> scheduling_buffer_time = optional(number)<br/> }))<br/> step_scaling_policy_configuration = optional(object({<br/> adjustment_type = optional(string)<br/> cooldown = optional(number)<br/> metric_aggregation_type = optional(string)<br/> min_adjustment_magnitude = optional(number)<br/> step_adjustment = optional(list(object({<br/> metric_interval_lower_bound = optional(string)<br/> metric_interval_upper_bound = optional(string)<br/> scaling_adjustment = number<br/> })))<br/> }))<br/> target_tracking_scaling_policy_configuration = optional(object({<br/> customized_metric_specification = optional(object({<br/> dimensions = optional(list(object({<br/> name = string<br/> value = string<br/> })))<br/> metric_name = optional(string)<br/> metrics = optional(list(object({<br/> expression = optional(string)<br/> id = string<br/> label = optional(string)<br/> metric_stat = optional(object({<br/> metric = object({<br/> dimensions = optional(list(object({<br/> name = string<br/> value = string<br/> })))<br/> metric_name = string<br/> namespace = string<br/> })<br/> stat = string<br/> unit = optional(string)<br/> }))<br/> return_data = optional(bool)<br/> })))<br/> namespace = optional(string)<br/> statistic = optional(string)<br/> unit = optional(string)<br/> }))<br/> disable_scale_in = optional(bool)<br/> predefined_metric_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<br/> }))<br/> scale_in_cooldown = optional(number, 300)<br/> scale_out_cooldown = optional(number, 60)<br/> target_value = optional(number, 75)<br/> }))<br/> }))</pre> | <pre>{<br/> "cpu": {<br/> "policy_type": "TargetTrackingScaling",<br/> "target_tracking_scaling_policy_configuration": {<br/> "predefined_metric_specification": {<br/> "predefined_metric_type": "ECSServiceAverageCPUUtilization"<br/> }<br/> }<br/> },<br/> "memory": {<br/> "policy_type": "TargetTrackingScaling",<br/> "target_tracking_scaling_policy_configuration": {<br/> "predefined_metric_specification": {<br/> "predefined_metric_type": "ECSServiceAverageMemoryUtilization"<br/> }<br/> }<br/> }<br/>}</pre> | no |
237237
| <a name="input_autoscaling_scheduled_actions"></a> [autoscaling\_scheduled\_actions](#input\_autoscaling\_scheduled\_actions) | Map of autoscaling scheduled actions to create for the service | <pre>map(object({<br/> name = optional(string)<br/> min_capacity = number<br/> max_capacity = number<br/> schedule = string<br/> start_time = optional(string)<br/> end_time = optional(string)<br/> timezone = optional(string)<br/> }))</pre> | `null` | no |
238+
| <a name="input_autoscaling_suspended_state"></a> [autoscaling\_suspended\_state](#input\_autoscaling\_suspended\_state) | Configuration block that specifies whether the scaling activities for the service are in a suspended state | <pre>object({<br/> dynamic_scaling_in_suspended = optional(bool, false)<br/> dynamic_scaling_out_suspended = optional(bool, false)<br/> scheduled_scaling_suspended = optional(bool, false)<br/> })</pre> | `null` | no |
238239
| <a name="input_availability_zone_rebalancing"></a> [availability\_zone\_rebalancing](#input\_availability\_zone\_rebalancing) | ECS automatically redistributes tasks within a service across Availability Zones (AZs) to mitigate the risk of impaired application availability due to underlying infrastructure failures and task lifecycle activities. The valid values are `ENABLED` and `DISABLED`. Defaults to `DISABLED` | `string` | `null` | no |
239240
| <a name="input_capacity_provider_strategy"></a> [capacity\_provider\_strategy](#input\_capacity\_provider\_strategy) | Capacity provider strategies to use for the service. Can be one or more | <pre>map(object({<br/> base = optional(number)<br/> capacity_provider = string<br/> weight = optional(number)<br/> }))</pre> | `null` | no |
240241
| <a name="input_cluster_arn"></a> [cluster\_arn](#input\_cluster\_arn) | ARN of the ECS cluster where the resources will be provisioned | `string` | `""` | no |

modules/service/main.tf

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1527,7 +1527,18 @@ resource "aws_appautoscaling_target" "this" {
15271527
resource_id = "service/${local.cluster_name}/${try(aws_ecs_service.this[0].name, aws_ecs_service.ignore_task_definition[0].name)}"
15281528
scalable_dimension = "ecs:service:DesiredCount"
15291529
service_namespace = "ecs"
1530-
tags = var.tags
1530+
1531+
dynamic "suspended_state" {
1532+
for_each = local.enable_autoscaling && var.autoscaling_suspended_state != null ? [var.autoscaling_suspended_state] : []
1533+
1534+
content {
1535+
dynamic_scaling_in_suspended = suspended_state.value.dynamic_scaling_in_suspended
1536+
dynamic_scaling_out_suspended = suspended_state.value.dynamic_scaling_out_suspended
1537+
scheduled_scaling_suspended = suspended_state.value.scheduled_scaling_suspended
1538+
}
1539+
}
1540+
1541+
tags = var.tags
15311542
}
15321543

15331544
resource "aws_appautoscaling_policy" "this" {

modules/service/variables.tf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,6 +1206,16 @@ variable "autoscaling_scheduled_actions" {
12061206
default = null
12071207
}
12081208

1209+
variable "autoscaling_suspended_state" {
1210+
description = "Configuration block that specifies whether the scaling activities for the service are in a suspended state"
1211+
type = object({
1212+
dynamic_scaling_in_suspended = optional(bool, false)
1213+
dynamic_scaling_out_suspended = optional(bool, false)
1214+
scheduled_scaling_suspended = optional(bool, false)
1215+
})
1216+
default = null
1217+
}
1218+
12091219
################################################################################
12101220
# Security Group
12111221
################################################################################

variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,11 @@ variable "services" {
867867
end_time = optional(string)
868868
timezone = optional(string)
869869
})))
870+
autoscaling_suspended_state = optional(object({
871+
dynamic_scaling_in_suspended = optional(bool)
872+
dynamic_scaling_out_suspended = optional(bool)
873+
scheduled_scaling_suspended = optional(bool)
874+
}))
870875
# Security Group
871876
create_security_group = optional(bool)
872877
vpc_id = optional(string)

wrappers/service/main.tf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ module "wrapper" {
2828
}
2929
})
3030
autoscaling_scheduled_actions = try(each.value.autoscaling_scheduled_actions, var.defaults.autoscaling_scheduled_actions, null)
31+
autoscaling_suspended_state = try(each.value.autoscaling_suspended_state, var.defaults.autoscaling_suspended_state, null)
3132
availability_zone_rebalancing = try(each.value.availability_zone_rebalancing, var.defaults.availability_zone_rebalancing, null)
3233
capacity_provider_strategy = try(each.value.capacity_provider_strategy, var.defaults.capacity_provider_strategy, null)
3334
cluster_arn = try(each.value.cluster_arn, var.defaults.cluster_arn, "")

0 commit comments

Comments
 (0)