Skip to content

Commit 78a8bd6

Browse files
committed
add predefined metrics
1 parent 84bf38e commit 78a8bd6

File tree

6 files changed

+78
-83
lines changed

6 files changed

+78
-83
lines changed

README.md

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

examples/complete/main.tf

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,27 @@ module "ecs" {
6161
cpu = 1024
6262
memory = 4096
6363

64+
autoscaling_policies = {
65+
predictive = {
66+
policy_type = "PredictiveScaling"
67+
predictive_scaling_policy_configuration = {
68+
mode = "ForecastOnly"
69+
metric_specification = {
70+
target_value = 60
71+
# predefined_scaling_metric_specification = {
72+
# predefined_metric_type = "ECSServiceAverageMemoryUtilization"
73+
# }
74+
# predefined_load_metric_specification = {
75+
# predefined_metric_type = "ECSServiceTotalMemoryUtilization"
76+
# }
77+
predefined_metric_pair_specification = {
78+
predefined_metric_type = "ECSServiceMemoryUtilization"
79+
}
80+
}
81+
}
82+
}
83+
}
84+
6485
# Container definition(s)
6586
container_definitions = {
6687

modules/service/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ module "ecs_service" {
233233
| <a name="input_assign_public_ip"></a> [assign\_public\_ip](#input\_assign\_public\_ip) | Assign a public IP address to the ENI (Fargate launch type only) | `bool` | `false` | no |
234234
| <a name="input_autoscaling_max_capacity"></a> [autoscaling\_max\_capacity](#input\_autoscaling\_max\_capacity) | Maximum number of tasks to run in your service | `number` | `10` | no |
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 |
236-
| <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/> 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/> predictive_scaling_policy_configuration = optional(object({<br/> mode = optional(string, "ForecastAndScale")<br/> max_capacity_buffer = optional(number)<br/> max_capacity_breach_behavior = optional(string)<br/> scheduling_buffer_time = optional(number)<br/> metric_specifications = list(object({<br/> target_value = number<br/> predefined_metric_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<br/> }))<br/> customized_capacity_metric_specification = optional(object({<br/> metric_data_queries = 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/> }))<br/> customized_load_metric_specification = optional(object({<br/> metric_data_queries = 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/> }))<br/> customized_scaling_metric_specification = optional(object({<br/> metric_data_queries = 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/> }))<br/> }))<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 |
236+
| <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/> 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/> predictive_scaling_policy_configuration = optional(object({<br/> mode = optional(string, "ForecastAndScale")<br/> max_capacity_buffer = optional(number)<br/> max_capacity_breach_behavior = optional(string)<br/> scheduling_buffer_time = optional(number)<br/> metric_specification = object({<br/> target_value = number<br/> predefined_scaling_metric_specification = optional(object({<br/> predefined_metric_type = string<br/> resource_label = optional(string)<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/> })<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 |
238238
| <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 |
239239
| <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 |

modules/service/main.tf

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,30 +1616,35 @@ resource "aws_appautoscaling_policy" "this" {
16161616
max_capacity_breach_behavior = try(predictive_scaling_policy_configuration.value.max_capacity_breach_behavior, null)
16171617

16181618
dynamic "metric_specification" {
1619-
for_each = predictive_scaling_policy_configuration.value.metric_specification != null ? [predictive_scaling_policy_configuration.value.metric_specification] : []
1620-
1621-
target_value = predictive_scaling_policy_configuration.value.metric_specification.target_value
1619+
for_each = [predictive_scaling_policy_configuration.value.metric_specification]
16221620

16231621
content {
1624-
dynamic "customized_capacity_metric_specification" {
1625-
for_each = predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification != null ? [predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification] : []
1622+
target_value = metric_specification.value.target_value
1623+
1624+
dynamic "predefined_scaling_metric_specification" {
1625+
for_each = metric_specification.value.predefined_scaling_metric_specification != null ? [metric_specification.value.predefined_scaling_metric_specification] : []
16261626

16271627
content {
1628-
metric_data_query {
1629-
id = predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.id
1630-
expression = try(predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.expression, null)
1631-
label = try(predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.label, null)
1632-
1633-
dynamic "metric_stat" {
1634-
for_each = predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.metric_stat != null ? [predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.metric_stat] : []
1635-
1636-
content {
1637-
metric = predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.metric_stat.metric
1638-
stat = predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.metric_stat.stat
1639-
unit = try(predictive_scaling_policy_configuration.value.metric_specification.customized_capacity_metric_specification.metric_stat.unit, null)
1640-
}
1641-
}
1642-
}
1628+
predefined_metric_type = predefined_scaling_metric_specification.value.predefined_metric_type
1629+
resource_label = predefined_scaling_metric_specification.value.resource_label
1630+
}
1631+
}
1632+
1633+
dynamic "predefined_load_metric_specification" {
1634+
for_each = metric_specification.value.predefined_load_metric_specification != null ? [metric_specification.value.predefined_load_metric_specification] : []
1635+
1636+
content {
1637+
predefined_metric_type = predefined_load_metric_specification.value.predefined_metric_type
1638+
resource_label = predefined_load_metric_specification.value.resource_label
1639+
}
1640+
}
1641+
1642+
dynamic "predefined_metric_pair_specification" {
1643+
for_each = metric_specification.value.predefined_metric_pair_specification != null ? [metric_specification.value.predefined_metric_pair_specification] : []
1644+
1645+
content {
1646+
predefined_metric_type = predefined_metric_pair_specification.value.predefined_metric_type
1647+
resource_label = predefined_metric_pair_specification.value.resource_label
16431648
}
16441649
}
16451650
}

modules/service/variables.tf

Lines changed: 9 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,73 +1083,21 @@ variable "autoscaling_policies" {
10831083
max_capacity_buffer = optional(number)
10841084
max_capacity_breach_behavior = optional(string)
10851085
scheduling_buffer_time = optional(number)
1086-
metric_specifications = list(object({
1086+
metric_specification = object({
10871087
target_value = number
1088-
predefined_metric_specification = optional(object({
1088+
predefined_scaling_metric_specification = optional(object({
10891089
predefined_metric_type = string
10901090
resource_label = optional(string)
10911091
}))
1092-
customized_capacity_metric_specification = optional(object({
1093-
metric_data_queries = list(object({
1094-
expression = optional(string)
1095-
id = string
1096-
label = optional(string)
1097-
metric_stat = optional(object({
1098-
metric = object({
1099-
dimensions = optional(list(object({
1100-
name = string
1101-
value = string
1102-
})))
1103-
metric_name = string
1104-
namespace = string
1105-
})
1106-
stat = string
1107-
unit = optional(string)
1108-
}))
1109-
return_data = optional(bool)
1110-
}))
1111-
}))
1112-
customized_load_metric_specification = optional(object({
1113-
metric_data_queries = list(object({
1114-
expression = optional(string)
1115-
id = string
1116-
label = optional(string)
1117-
metric_stat = optional(object({
1118-
metric = object({
1119-
dimensions = optional(list(object({
1120-
name = string
1121-
value = string
1122-
})))
1123-
metric_name = string
1124-
namespace = string
1125-
})
1126-
stat = string
1127-
unit = optional(string)
1128-
}))
1129-
return_data = optional(bool)
1130-
}))
1092+
predefined_load_metric_specification = optional(object({
1093+
predefined_metric_type = string
1094+
resource_label = optional(string)
11311095
}))
1132-
customized_scaling_metric_specification = optional(object({
1133-
metric_data_queries = list(object({
1134-
expression = optional(string)
1135-
id = string
1136-
label = optional(string)
1137-
metric_stat = optional(object({
1138-
metric = object({
1139-
dimensions = optional(list(object({
1140-
name = string
1141-
value = string
1142-
})))
1143-
metric_name = string
1144-
namespace = string
1145-
})
1146-
stat = string
1147-
unit = optional(string)
1148-
}))
1149-
return_data = optional(bool)
1150-
}))
1096+
predefined_metric_pair_specification = optional(object({
1097+
predefined_metric_type = string
1098+
resource_label = optional(string)
11511099
}))
1152-
}))
1100+
})
11531101
}))
11541102
}))
11551103
default = {

0 commit comments

Comments
 (0)