Skip to content

Commit 9e07041

Browse files
authoredMar 3, 2022
Merge pull request #22451 from gypdtc/main
Support customized metric specification in autoscaling predictive scaling policy
2 parents ae123f7 + 44820ce commit 9e07041

File tree

4 files changed

+624
-83
lines changed

4 files changed

+624
-83
lines changed
 

‎.changelog/22451.txt

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
```release-note:enhancement
2+
resource/aws_autoscaling_policy: Add `customized_capacity_metric_specification`, `customized_load_metric_specification` and `customized_scaling_metric_specification` to the `predictive_scaling_configuration.metric_specification` argument

‎internal/service/autoscaling/policy.go

+333-49
Original file line numberDiff line numberDiff line change
@@ -87,21 +87,58 @@ func ResourcePolicy() *schema.Resource {
8787
MaxItems: 1,
8888
Elem: &schema.Resource{
8989
Schema: map[string]*schema.Schema{
90+
"customized_capacity_metric_specification": {
91+
Type: schema.TypeList,
92+
Optional: true,
93+
MaxItems: 1,
94+
ConflictsWith: []string{"predictive_scaling_configuration.0.metric_specification.0.predefined_load_metric_specification"},
95+
Elem: &schema.Resource{
96+
Schema: map[string]*schema.Schema{
97+
"metric_data_queries": func() *schema.Schema {
98+
schema := customizedMetricDataQuerySchema()
99+
return schema
100+
}(),
101+
},
102+
},
103+
},
104+
"customized_load_metric_specification": {
105+
Type: schema.TypeList,
106+
Optional: true,
107+
MaxItems: 1,
108+
ConflictsWith: []string{"predictive_scaling_configuration.0.metric_specification.0.predefined_load_metric_specification"},
109+
Elem: &schema.Resource{
110+
Schema: map[string]*schema.Schema{
111+
"metric_data_queries": func() *schema.Schema {
112+
schema := customizedMetricDataQuerySchema()
113+
return schema
114+
}(),
115+
},
116+
},
117+
},
118+
"customized_scaling_metric_specification": {
119+
Type: schema.TypeList,
120+
Optional: true,
121+
MaxItems: 1,
122+
ConflictsWith: []string{"predictive_scaling_configuration.0.metric_specification.0.predefined_scaling_metric_specification"},
123+
Elem: &schema.Resource{
124+
Schema: map[string]*schema.Schema{
125+
"metric_data_queries": func() *schema.Schema {
126+
schema := customizedMetricDataQuerySchema()
127+
return schema
128+
}(),
129+
},
130+
},
131+
},
90132
"predefined_metric_pair_specification": {
91133
Type: schema.TypeList,
92134
Optional: true,
93135
MaxItems: 1,
94136
Elem: &schema.Resource{
95137
Schema: map[string]*schema.Schema{
96138
"predefined_metric_type": {
97-
Type: schema.TypeString,
98-
Required: true,
99-
ValidateFunc: validation.StringInSlice([]string{
100-
"ASGCPUUtilization",
101-
"ASGNetworkIn",
102-
"ASGNetworkOut",
103-
"ALBRequestCount",
104-
}, false),
139+
Type: schema.TypeString,
140+
Required: true,
141+
ValidateFunc: validation.StringInSlice(autoscaling.PredefinedMetricPairType_Values(), false),
105142
},
106143
"resource_label": {
107144
Type: schema.TypeString,
@@ -111,20 +148,16 @@ func ResourcePolicy() *schema.Resource {
111148
},
112149
},
113150
"predefined_scaling_metric_specification": {
114-
Type: schema.TypeList,
115-
Optional: true,
116-
MaxItems: 1,
151+
Type: schema.TypeList,
152+
Optional: true,
153+
MaxItems: 1,
154+
ConflictsWith: []string{"predictive_scaling_configuration.0.metric_specification.0.customized_scaling_metric_specification"},
117155
Elem: &schema.Resource{
118156
Schema: map[string]*schema.Schema{
119157
"predefined_metric_type": {
120-
Type: schema.TypeString,
121-
Required: true,
122-
ValidateFunc: validation.StringInSlice([]string{
123-
"ASGAverageCPUUtilization",
124-
"ASGAverageNetworkIn",
125-
"ASGAverageNetworkOut",
126-
"ALBRequestCountPerTarget",
127-
}, false),
158+
Type: schema.TypeString,
159+
Required: true,
160+
ValidateFunc: validation.StringInSlice(autoscaling.PredefinedScalingMetricType_Values(), false),
128161
},
129162
"resource_label": {
130163
Type: schema.TypeString,
@@ -134,20 +167,16 @@ func ResourcePolicy() *schema.Resource {
134167
},
135168
},
136169
"predefined_load_metric_specification": {
137-
Type: schema.TypeList,
138-
Optional: true,
139-
MaxItems: 1,
170+
Type: schema.TypeList,
171+
Optional: true,
172+
MaxItems: 1,
173+
ConflictsWith: []string{"predictive_scaling_configuration.0.metric_specification.0.customized_load_metric_specification"},
140174
Elem: &schema.Resource{
141175
Schema: map[string]*schema.Schema{
142176
"predefined_metric_type": {
143-
Type: schema.TypeString,
144-
Required: true,
145-
ValidateFunc: validation.StringInSlice([]string{
146-
"ASGTotalCPUUtilization",
147-
"ASGTotalNetworkIn",
148-
"ASGTotalNetworkOut",
149-
"ALBTargetGroupRequestCount",
150-
}, false),
177+
Type: schema.TypeString,
178+
Required: true,
179+
ValidateFunc: validation.StringInSlice(autoscaling.PredefinedLoadMetricType_Values(), false),
151180
},
152181
"resource_label": {
153182
Type: schema.TypeString,
@@ -164,27 +193,21 @@ func ResourcePolicy() *schema.Resource {
164193
},
165194
},
166195
"max_capacity_breach_behavior": {
167-
Type: schema.TypeString,
168-
Optional: true,
169-
Default: "HonorMaxCapacity",
170-
ValidateFunc: validation.StringInSlice([]string{
171-
"HonorMaxCapacity",
172-
"IncreaseMaxCapacity",
173-
}, false),
196+
Type: schema.TypeString,
197+
Optional: true,
198+
Default: "HonorMaxCapacity",
199+
ValidateFunc: validation.StringInSlice(autoscaling.PredictiveScalingMaxCapacityBreachBehavior_Values(), false),
174200
},
175201
"max_capacity_buffer": {
176202
Type: nullable.TypeNullableInt,
177203
Optional: true,
178204
ValidateFunc: nullable.ValidateTypeStringNullableIntBetween(0, 100),
179205
},
180206
"mode": {
181-
Type: schema.TypeString,
182-
Optional: true,
183-
Default: "ForecastOnly",
184-
ValidateFunc: validation.StringInSlice([]string{
185-
"ForecastOnly",
186-
"ForecastAndScale",
187-
}, false),
207+
Type: schema.TypeString,
208+
Optional: true,
209+
Default: "ForecastOnly",
210+
ValidateFunc: validation.StringInSlice(autoscaling.PredictiveScalingMode_Values(), false),
188211
},
189212
"scheduling_buffer_time": {
190213
Type: nullable.TypeNullableInt,
@@ -303,6 +326,90 @@ func ResourcePolicy() *schema.Resource {
303326
}
304327
}
305328

329+
// All predictive scaling customized metrics shares same metric data query schema
330+
func customizedMetricDataQuerySchema() *schema.Schema {
331+
return &schema.Schema{
332+
Type: schema.TypeList,
333+
Required: true,
334+
MaxItems: 10,
335+
Elem: &schema.Resource{
336+
Schema: map[string]*schema.Schema{
337+
"expression": {
338+
Type: schema.TypeString,
339+
Optional: true,
340+
ValidateFunc: validation.StringLenBetween(1, 1023),
341+
},
342+
"id": {
343+
Type: schema.TypeString,
344+
Required: true,
345+
ValidateFunc: validation.StringLenBetween(1, 255),
346+
},
347+
"label": {
348+
Type: schema.TypeString,
349+
Optional: true,
350+
ValidateFunc: validation.StringLenBetween(1, 2047),
351+
},
352+
"metric_stat": {
353+
Type: schema.TypeList,
354+
Optional: true,
355+
MaxItems: 1,
356+
Elem: &schema.Resource{
357+
Schema: map[string]*schema.Schema{
358+
"metric": {
359+
Type: schema.TypeList,
360+
Required: true,
361+
MaxItems: 1,
362+
Elem: &schema.Resource{
363+
Schema: map[string]*schema.Schema{
364+
"dimensions": {
365+
Type: schema.TypeSet,
366+
Optional: true,
367+
Elem: &schema.Resource{
368+
Schema: map[string]*schema.Schema{
369+
"name": {
370+
Type: schema.TypeString,
371+
Required: true,
372+
},
373+
"value": {
374+
Type: schema.TypeString,
375+
Required: true,
376+
},
377+
},
378+
},
379+
},
380+
"metric_name": {
381+
Type: schema.TypeString,
382+
Required: true,
383+
},
384+
"namespace": {
385+
Type: schema.TypeString,
386+
Required: true,
387+
},
388+
},
389+
},
390+
},
391+
"stat": {
392+
Type: schema.TypeString,
393+
Required: true,
394+
ValidateFunc: validation.StringLenBetween(1, 100),
395+
},
396+
"unit": {
397+
Type: schema.TypeString,
398+
Optional: true,
399+
},
400+
},
401+
},
402+
},
403+
"return_data": {
404+
Type: schema.TypeBool,
405+
Optional: true,
406+
Default: true,
407+
},
408+
},
409+
},
410+
}
411+
}
412+
306413
func resourcePolicyCreate(d *schema.ResourceData, meta interface{}) error {
307414
conn := meta.(*conns.AWSClient).AutoScalingConn
308415

@@ -542,7 +649,6 @@ func getPolicy(d *schema.ResourceData, meta interface{}) (*autoscaling.ScalingPo
542649
return resp.ScalingPolicies[idx], nil
543650
}
544651
}
545-
546652
// policy not found
547653
return nil, nil
548654
}
@@ -637,10 +743,13 @@ func expandPredictiveScalingMetricSpecifications(metricSpecificationsSlice []int
637743
}
638744
metricSpecificationsFlat := metricSpecificationsSlice[0].(map[string]interface{})
639745
metricSpecification := &autoscaling.PredictiveScalingMetricSpecification{
640-
PredefinedLoadMetricSpecification: expandPredefinedLoadMetricSpecification(metricSpecificationsFlat["predefined_load_metric_specification"].([]interface{})),
641-
PredefinedMetricPairSpecification: expandPredefinedMetricPairSpecification(metricSpecificationsFlat["predefined_metric_pair_specification"].([]interface{})),
642-
PredefinedScalingMetricSpecification: expandPredefinedScalingMetricSpecification(metricSpecificationsFlat["predefined_scaling_metric_specification"].([]interface{})),
643-
TargetValue: aws.Float64(float64(metricSpecificationsFlat["target_value"].(int))),
746+
CustomizedCapacityMetricSpecification: expandCustomizedCapacityMetricSpecification(metricSpecificationsFlat["customized_capacity_metric_specification"].([]interface{})),
747+
CustomizedLoadMetricSpecification: expandCustomizedLoadMetricSpecification(metricSpecificationsFlat["customized_load_metric_specification"].([]interface{})),
748+
CustomizedScalingMetricSpecification: expandCustomizedScalingMetricSpecification(metricSpecificationsFlat["customized_scaling_metric_specification"].([]interface{})),
749+
PredefinedLoadMetricSpecification: expandPredefinedLoadMetricSpecification(metricSpecificationsFlat["predefined_load_metric_specification"].([]interface{})),
750+
PredefinedMetricPairSpecification: expandPredefinedMetricPairSpecification(metricSpecificationsFlat["predefined_metric_pair_specification"].([]interface{})),
751+
PredefinedScalingMetricSpecification: expandPredefinedScalingMetricSpecification(metricSpecificationsFlat["predefined_scaling_metric_specification"].([]interface{})),
752+
TargetValue: aws.Float64(float64(metricSpecificationsFlat["target_value"].(int))),
644753
}
645754
return []*autoscaling.PredictiveScalingMetricSpecification{metricSpecification}
646755
}
@@ -681,6 +790,94 @@ func expandPredefinedScalingMetricSpecification(predefinedScalingMetricSpecifica
681790
return predefinedScalingMetricSpecification
682791
}
683792

793+
func expandCustomizedScalingMetricSpecification(customizedScalingMetricSpecificationSlice []interface{}) *autoscaling.PredictiveScalingCustomizedScalingMetric {
794+
if customizedScalingMetricSpecificationSlice == nil || len(customizedScalingMetricSpecificationSlice) < 1 {
795+
return nil
796+
}
797+
customizedScalingMetricSpecificationFlat := customizedScalingMetricSpecificationSlice[0].(map[string]interface{})
798+
customizedScalingMetricSpecification := &autoscaling.PredictiveScalingCustomizedScalingMetric{
799+
MetricDataQueries: expandMetricDataQueries(customizedScalingMetricSpecificationFlat["metric_data_queries"].([]interface{})),
800+
}
801+
return customizedScalingMetricSpecification
802+
}
803+
804+
func expandCustomizedLoadMetricSpecification(customizedLoadMetricSpecificationSlice []interface{}) *autoscaling.PredictiveScalingCustomizedLoadMetric {
805+
if customizedLoadMetricSpecificationSlice == nil || len(customizedLoadMetricSpecificationSlice) < 1 {
806+
return nil
807+
}
808+
customizedLoadMetricSpecificationSliceFlat := customizedLoadMetricSpecificationSlice[0].(map[string]interface{})
809+
customizedLoadMetricSpecification := &autoscaling.PredictiveScalingCustomizedLoadMetric{
810+
MetricDataQueries: expandMetricDataQueries(customizedLoadMetricSpecificationSliceFlat["metric_data_queries"].([]interface{})),
811+
}
812+
return customizedLoadMetricSpecification
813+
}
814+
815+
func expandCustomizedCapacityMetricSpecification(customizedCapacityMetricSlice []interface{}) *autoscaling.PredictiveScalingCustomizedCapacityMetric {
816+
if customizedCapacityMetricSlice == nil || len(customizedCapacityMetricSlice) < 1 {
817+
return nil
818+
}
819+
customizedCapacityMetricSliceFlat := customizedCapacityMetricSlice[0].(map[string]interface{})
820+
customizedCapacityMetricSpecification := &autoscaling.PredictiveScalingCustomizedCapacityMetric{
821+
MetricDataQueries: expandMetricDataQueries(customizedCapacityMetricSliceFlat["metric_data_queries"].([]interface{})),
822+
}
823+
return customizedCapacityMetricSpecification
824+
}
825+
826+
func expandMetricDataQueries(metricDataQuerySlices []interface{}) []*autoscaling.MetricDataQuery {
827+
if metricDataQuerySlices == nil || len(metricDataQuerySlices) < 1 {
828+
return nil
829+
}
830+
metricDataQueries := make([]*autoscaling.MetricDataQuery, len(metricDataQuerySlices))
831+
832+
for i := range metricDataQueries {
833+
834+
metricDataQueryFlat := metricDataQuerySlices[i].(map[string]interface{})
835+
metricDataQuery := &autoscaling.MetricDataQuery{
836+
Id: aws.String(metricDataQueryFlat["id"].(string)),
837+
}
838+
if val, ok := metricDataQueryFlat["metric_stat"]; ok && len(val.([]interface{})) > 0 {
839+
metricStatSpec := val.([]interface{})[0].(map[string]interface{})
840+
metricSpec := metricStatSpec["metric"].([]interface{})[0].(map[string]interface{})
841+
metric := &autoscaling.Metric{
842+
MetricName: aws.String(metricSpec["metric_name"].(string)),
843+
Namespace: aws.String(metricSpec["namespace"].(string)),
844+
}
845+
if v, ok := metricSpec["dimensions"]; ok {
846+
dims := v.(*schema.Set).List()
847+
dimList := make([]*autoscaling.MetricDimension, len(dims))
848+
for i := range dimList {
849+
dim := dims[i].(map[string]interface{})
850+
md := &autoscaling.MetricDimension{
851+
Name: aws.String(dim["name"].(string)),
852+
Value: aws.String(dim["value"].(string)),
853+
}
854+
dimList[i] = md
855+
}
856+
metric.Dimensions = dimList
857+
}
858+
metricStat := &autoscaling.MetricStat{
859+
Metric: metric,
860+
Stat: aws.String(metricStatSpec["stat"].(string)),
861+
}
862+
if v, ok := metricStatSpec["unit"]; ok && len(v.(string)) > 0 {
863+
metricStat.Unit = aws.String(v.(string))
864+
}
865+
metricDataQuery.MetricStat = metricStat
866+
}
867+
if val, ok := metricDataQueryFlat["expression"]; ok && val.(string) != "" {
868+
metricDataQuery.Expression = aws.String(val.(string))
869+
}
870+
if val, ok := metricDataQueryFlat["label"]; ok && val.(string) != "" {
871+
metricDataQuery.Label = aws.String(val.(string))
872+
}
873+
if val, ok := metricDataQueryFlat["return_data"]; ok {
874+
metricDataQuery.ReturnData = aws.Bool(val.(bool))
875+
}
876+
metricDataQueries[i] = metricDataQuery
877+
}
878+
return metricDataQueries
879+
}
880+
684881
func flattenTargetTrackingConfiguration(config *autoscaling.TargetTrackingConfiguration) []interface{} {
685882
if config == nil {
686883
return []interface{}{}
@@ -752,6 +949,15 @@ func flattenPredictiveScalingMetricSpecifications(metricSpecification []*autosca
752949
if metricSpecification[0].TargetValue != nil {
753950
metricSpecificationFlat["target_value"] = aws.Float64Value(metricSpecification[0].TargetValue)
754951
}
952+
if metricSpecification[0].CustomizedCapacityMetricSpecification != nil {
953+
metricSpecificationFlat["customized_capacity_metric_specification"] = flattenCustomizedCapacityMetricSpecification(metricSpecification[0].CustomizedCapacityMetricSpecification)
954+
}
955+
if metricSpecification[0].CustomizedLoadMetricSpecification != nil {
956+
metricSpecificationFlat["customized_load_metric_specification"] = flattenCustomizedLoadMetricSpecification(metricSpecification[0].CustomizedLoadMetricSpecification)
957+
}
958+
if metricSpecification[0].CustomizedScalingMetricSpecification != nil {
959+
metricSpecificationFlat["customized_scaling_metric_specification"] = flattenCustomizedScalingMetricSpecification(metricSpecification[0].CustomizedScalingMetricSpecification)
960+
}
755961
if metricSpecification[0].PredefinedLoadMetricSpecification != nil {
756962
metricSpecificationFlat["predefined_load_metric_specification"] = flattenPredefinedLoadMetricSpecification(metricSpecification[0].PredefinedLoadMetricSpecification)
757963
}
@@ -793,3 +999,81 @@ func flattenPredefinedMetricPairSpecification(predefinedMetricPairSpecification
793999
predefinedMetricPairSpecificationFlat["resource_label"] = aws.StringValue(predefinedMetricPairSpecification.ResourceLabel)
7941000
return []map[string]interface{}{predefinedMetricPairSpecificationFlat}
7951001
}
1002+
1003+
func flattenCustomizedScalingMetricSpecification(customizedScalingMetricSpecification *autoscaling.PredictiveScalingCustomizedScalingMetric) []map[string]interface{} {
1004+
customizedScalingMetricSpecificationFlat := map[string]interface{}{}
1005+
if customizedScalingMetricSpecification == nil {
1006+
return []map[string]interface{}{customizedScalingMetricSpecificationFlat}
1007+
}
1008+
customizedScalingMetricSpecificationFlat["metric_data_queries"] = flattenMetricDataQueries(customizedScalingMetricSpecification.MetricDataQueries)
1009+
return []map[string]interface{}{customizedScalingMetricSpecificationFlat}
1010+
}
1011+
1012+
func flattenCustomizedLoadMetricSpecification(customizedLoadMetricSpecification *autoscaling.PredictiveScalingCustomizedLoadMetric) []map[string]interface{} {
1013+
customizedLoadMetricSpecificationFlat := map[string]interface{}{}
1014+
if customizedLoadMetricSpecification == nil {
1015+
return []map[string]interface{}{customizedLoadMetricSpecificationFlat}
1016+
}
1017+
customizedLoadMetricSpecificationFlat["metric_data_queries"] = flattenMetricDataQueries(customizedLoadMetricSpecification.MetricDataQueries)
1018+
return []map[string]interface{}{customizedLoadMetricSpecificationFlat}
1019+
}
1020+
1021+
func flattenCustomizedCapacityMetricSpecification(customizedCapacityMetricSpecification *autoscaling.PredictiveScalingCustomizedCapacityMetric) []map[string]interface{} {
1022+
customizedCapacityMetricSpecificationFlat := map[string]interface{}{}
1023+
if customizedCapacityMetricSpecification == nil {
1024+
return []map[string]interface{}{customizedCapacityMetricSpecificationFlat}
1025+
}
1026+
customizedCapacityMetricSpecificationFlat["metric_data_queries"] = flattenMetricDataQueries(customizedCapacityMetricSpecification.MetricDataQueries)
1027+
1028+
return []map[string]interface{}{customizedCapacityMetricSpecificationFlat}
1029+
}
1030+
1031+
func flattenMetricDataQueries(metricDataQueries []*autoscaling.MetricDataQuery) []interface{} {
1032+
metricDataQueriesFlat := map[string]interface{}{}
1033+
if metricDataQueriesFlat == nil {
1034+
return []interface{}{}
1035+
}
1036+
1037+
metricDataQueriesSpec := make([]interface{}, len(metricDataQueries))
1038+
for i := range metricDataQueriesSpec {
1039+
metricDataQuery := map[string]interface{}{}
1040+
rawMetricDataQuery := metricDataQueries[i]
1041+
metricDataQuery["id"] = aws.StringValue(rawMetricDataQuery.Id)
1042+
if rawMetricDataQuery.Expression != nil {
1043+
metricDataQuery["expression"] = aws.StringValue(rawMetricDataQuery.Expression)
1044+
}
1045+
if rawMetricDataQuery.Label != nil {
1046+
metricDataQuery["label"] = aws.StringValue(rawMetricDataQuery.Label)
1047+
}
1048+
if rawMetricDataQuery.MetricStat != nil {
1049+
metricStatSpec := map[string]interface{}{}
1050+
rawMetricStat := rawMetricDataQuery.MetricStat
1051+
rawMetric := rawMetricStat.Metric
1052+
metricSpec := map[string]interface{}{}
1053+
if rawMetric.Dimensions != nil {
1054+
dimSpec := make([]interface{}, len(rawMetric.Dimensions))
1055+
for i := range dimSpec {
1056+
dim := map[string]interface{}{}
1057+
rawDim := rawMetric.Dimensions[i]
1058+
dim["name"] = aws.StringValue(rawDim.Name)
1059+
dim["value"] = aws.StringValue(rawDim.Value)
1060+
dimSpec[i] = dim
1061+
}
1062+
metricSpec["dimensions"] = dimSpec
1063+
}
1064+
metricSpec["metric_name"] = aws.StringValue(rawMetric.MetricName)
1065+
metricSpec["namespace"] = aws.StringValue(rawMetric.Namespace)
1066+
metricStatSpec["metric"] = []map[string]interface{}{metricSpec}
1067+
metricStatSpec["stat"] = aws.StringValue(rawMetricStat.Stat)
1068+
if rawMetricStat.Unit != nil {
1069+
metricStatSpec["unit"] = aws.StringValue(rawMetricStat.Unit)
1070+
}
1071+
metricDataQuery["metric_stat"] = []map[string]interface{}{metricStatSpec}
1072+
}
1073+
if rawMetricDataQuery.ReturnData != nil {
1074+
metricDataQuery["return_data"] = aws.BoolValue(rawMetricDataQuery.ReturnData)
1075+
}
1076+
metricDataQueriesSpec[i] = metricDataQuery
1077+
}
1078+
return metricDataQueriesSpec
1079+
}

‎internal/service/autoscaling/policy_test.go

+152-32
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestAccAutoScalingPolicy_basic(t *testing.T) {
3131
CheckDestroy: testAccCheckPolicyDestroy,
3232
Steps: []resource.TestStep{
3333
{
34-
Config: testAccPolicyConfig_basic(name),
34+
Config: testAccPolicyConfigBasic(name),
3535
Check: resource.ComposeTestCheckFunc(
3636
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
3737
resource.TestCheckResourceAttr(resourceSimpleName, "adjustment_type", "ChangeInCapacity"),
@@ -105,11 +105,9 @@ func TestAccAutoScalingPolicy_basic(t *testing.T) {
105105
})
106106
}
107107

108-
func TestAccAutoScalingPolicy_predictiveScaling(t *testing.T) {
108+
func TestAccAutoScalingPolicy_predictiveScalingPredefined(t *testing.T) {
109109
var policy autoscaling.ScalingPolicy
110-
111110
resourceSimpleName := "aws_autoscaling_policy.test"
112-
113111
name := sdkacctest.RandomWithPrefix("terraform-testacc-asp")
114112

115113
resource.ParallelTest(t, resource.TestCase{
@@ -119,7 +117,7 @@ func TestAccAutoScalingPolicy_predictiveScaling(t *testing.T) {
119117
CheckDestroy: testAccCheckPolicyDestroy,
120118
Steps: []resource.TestStep{
121119
{
122-
Config: testAccPolicyConfig_predictiveScaling(name),
120+
Config: testAccPolicyConfigPredictiveScalingPredefined(name),
123121
Check: resource.ComposeTestCheckFunc(
124122
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
125123
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.mode", "ForecastAndScale"),
@@ -143,6 +141,58 @@ func TestAccAutoScalingPolicy_predictiveScaling(t *testing.T) {
143141
})
144142
}
145143

144+
func TestAccAutoScalingPolicy_predictiveScalingCustom(t *testing.T) {
145+
var policy autoscaling.ScalingPolicy
146+
resourceSimpleName := "aws_autoscaling_policy.test"
147+
name := sdkacctest.RandomWithPrefix("terraform-testacc-asp1")
148+
149+
resource.ParallelTest(t, resource.TestCase{
150+
PreCheck: func() { acctest.PreCheck(t) },
151+
ErrorCheck: acctest.ErrorCheck(t, autoscaling.EndpointsID),
152+
Providers: acctest.Providers,
153+
CheckDestroy: testAccCheckPolicyDestroy,
154+
Steps: []resource.TestStep{
155+
{
156+
Config: testAccPolicyConfigPredictiveScalingCustom(name),
157+
Check: resource.ComposeTestCheckFunc(
158+
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
159+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.max_capacity_breach_behavior", "IncreaseMaxCapacity"),
160+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.max_capacity_buffer", "0"),
161+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.0.id", "weighted_sum"),
162+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.0.metric_stat.0.metric.0.metric_name", "metric_name_foo"),
163+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.0.metric_stat.0.metric.0.namespace", "namespace_foo"),
164+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.0.metric_stat.0.stat", "Sum"),
165+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.0.return_data", "false"),
166+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.id", "capacity_sum"),
167+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.metric_stat.0.metric.0.dimensions.#", "2"),
168+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.metric_stat.0.metric.0.metric_name", "metric_name_bar"),
169+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.metric_stat.0.metric.0.namespace", "namespace_bar"),
170+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.metric_stat.0.unit", "Percent"),
171+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.metric_stat.0.stat", "Sum"),
172+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.1.return_data", "false"),
173+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.2.id", "capacity"),
174+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.2.expression", "weighted_sum / capacity_sum"),
175+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_capacity_metric_specification.0.metric_data_queries.2.return_data", "true"),
176+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_scaling_metric_specification.0.metric_data_queries.0.id", "scaling_metric"),
177+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_scaling_metric_specification.0.metric_data_queries.0.expression", "TIME_SERIES(1)"),
178+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_load_metric_specification.0.metric_data_queries.0.id", "load_metric"),
179+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_load_metric_specification.0.metric_data_queries.0.label", "fake_load_metric"),
180+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.customized_load_metric_specification.0.metric_data_queries.0.expression", "TIME_SERIES(100)"),
181+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.metric_specification.0.target_value", "32"),
182+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.mode", "ForecastOnly"),
183+
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.scheduling_buffer_time", "10"),
184+
),
185+
},
186+
{
187+
ResourceName: resourceSimpleName,
188+
ImportState: true,
189+
ImportStateIdFunc: testAccPolicyImportStateIdFunc(resourceSimpleName),
190+
ImportStateVerify: true,
191+
},
192+
},
193+
})
194+
}
195+
146196
func TestAccAutoScalingPolicy_predictiveScalingRemoved(t *testing.T) {
147197
var policy autoscaling.ScalingPolicy
148198

@@ -157,14 +207,14 @@ func TestAccAutoScalingPolicy_predictiveScalingRemoved(t *testing.T) {
157207
CheckDestroy: testAccCheckPolicyDestroy,
158208
Steps: []resource.TestStep{
159209
{
160-
Config: testAccPolicyConfig_predictiveScaling(name),
210+
Config: testAccPolicyConfigPredictiveScalingPredefined(name),
161211
Check: resource.ComposeTestCheckFunc(
162212
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
163213
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.#", "1"),
164214
),
165215
},
166216
{
167-
Config: testAccPolicyConfig_predictiveScalingRemoved(name),
217+
Config: testAccPolicyConfigPredictiveScalingRemoved(name),
168218
Check: resource.ComposeTestCheckFunc(
169219
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
170220
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.#", "0"),
@@ -194,7 +244,7 @@ func TestAccAutoScalingPolicy_predictiveScalingUpdated(t *testing.T) {
194244
CheckDestroy: testAccCheckPolicyDestroy,
195245
Steps: []resource.TestStep{
196246
{
197-
Config: testAccPolicyConfig_predictiveScaling(name),
247+
Config: testAccPolicyConfigPredictiveScalingPredefined(name),
198248
Check: resource.ComposeTestCheckFunc(
199249
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
200250
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.mode", "ForecastAndScale"),
@@ -209,7 +259,7 @@ func TestAccAutoScalingPolicy_predictiveScalingUpdated(t *testing.T) {
209259
),
210260
},
211261
{
212-
Config: testAccautoScalingpolicyconfigPredictivescalingUpdated(name),
262+
Config: testAccAutoScalingPolicyConfigPredictiveScalingUpdated(name),
213263
Check: resource.ComposeTestCheckFunc(
214264
testAccCheckScalingPolicyExists(resourceSimpleName, &policy),
215265
resource.TestCheckResourceAttr(resourceSimpleName, "predictive_scaling_configuration.0.mode", "ForecastOnly"),
@@ -247,7 +297,7 @@ func TestAccAutoScalingPolicy_disappears(t *testing.T) {
247297
CheckDestroy: testAccCheckPolicyDestroy,
248298
Steps: []resource.TestStep{
249299
{
250-
Config: testAccPolicyConfig_basic(name),
300+
Config: testAccPolicyConfigBasic(name),
251301
Check: resource.ComposeTestCheckFunc(
252302
testAccCheckScalingPolicyExists(resourceName, &policy),
253303
testAccCheckScalingPolicyDisappears(&policy),
@@ -309,7 +359,7 @@ func TestAccAutoScalingPolicy_simpleScalingStepAdjustment(t *testing.T) {
309359
CheckDestroy: testAccCheckPolicyDestroy,
310360
Steps: []resource.TestStep{
311361
{
312-
Config: testAccPolicyConfig_SimpleScalingStepAdjustment(name),
362+
Config: testAccPolicyConfigSimpleScalingStepAdjustment(name),
313363
Check: resource.ComposeTestCheckFunc(
314364
testAccCheckScalingPolicyExists(resourceName, &policy),
315365
resource.TestCheckResourceAttr(resourceName, "adjustment_type", "ExactCapacity"),
@@ -338,7 +388,7 @@ func TestAccAutoScalingPolicy_TargetTrack_predefined(t *testing.T) {
338388
CheckDestroy: testAccCheckPolicyDestroy,
339389
Steps: []resource.TestStep{
340390
{
341-
Config: testAccPolicyConfig_TargetTracking_Predefined(name),
391+
Config: testAccPolicyConfigTargetTrackingPredefined(name),
342392
Check: resource.ComposeTestCheckFunc(
343393
testAccCheckScalingPolicyExists("aws_autoscaling_policy.test", &policy),
344394
),
@@ -365,7 +415,7 @@ func TestAccAutoScalingPolicy_TargetTrack_custom(t *testing.T) {
365415
CheckDestroy: testAccCheckPolicyDestroy,
366416
Steps: []resource.TestStep{
367417
{
368-
Config: testAccPolicyConfig_TargetTracking_Custom(name),
418+
Config: testAccPolicyConfigTargetTrackingCustom(name),
369419
Check: resource.ComposeTestCheckFunc(
370420
testAccCheckScalingPolicyExists("aws_autoscaling_policy.test", &policy),
371421
),
@@ -394,7 +444,7 @@ func TestAccAutoScalingPolicy_zeroValue(t *testing.T) {
394444
CheckDestroy: testAccCheckPolicyDestroy,
395445
Steps: []resource.TestStep{
396446
{
397-
Config: testAccPolicyConfig_zerovalue(sdkacctest.RandString(5)),
447+
Config: testAccPolicyConfigZeroValue(sdkacctest.RandString(5)),
398448
Check: resource.ComposeTestCheckFunc(
399449
testAccCheckScalingPolicyExists(resourceSimpleName, &simplepolicy),
400450
testAccCheckScalingPolicyExists(resourceStepName, &steppolicy),
@@ -483,7 +533,7 @@ func testAccPolicyImportStateIdFunc(resourceName string) resource.ImportStateIdF
483533
}
484534
}
485535

486-
func testAccPolicyConfig_base(name string) string {
536+
func testAccPolicyConfigBase(name string) string {
487537
return fmt.Sprintf(`
488538
data "aws_ami" "amzn" {
489539
most_recent = true
@@ -521,8 +571,8 @@ resource "aws_autoscaling_group" "test" {
521571
`, name, name)
522572
}
523573

524-
func testAccPolicyConfig_basic(name string) string {
525-
return acctest.ConfigCompose(testAccPolicyConfig_base(name), fmt.Sprintf(`
574+
func testAccPolicyConfigBasic(name string) string {
575+
return acctest.ConfigCompose(testAccPolicyConfigBase(name), fmt.Sprintf(`
526576
resource "aws_autoscaling_policy" "foobar_simple" {
527577
name = "%s-foobar_simple"
528578
adjustment_type = "ChangeInCapacity"
@@ -563,8 +613,8 @@ resource "aws_autoscaling_policy" "foobar_target_tracking" {
563613
`, name, name, name))
564614
}
565615

566-
func testAccPolicyConfig_predictiveScaling(name string) string {
567-
return acctest.ConfigCompose(testAccPolicyConfig_base(name), fmt.Sprintf(`
616+
func testAccPolicyConfigPredictiveScalingPredefined(name string) string {
617+
return acctest.ConfigCompose(testAccPolicyConfigBase(name), fmt.Sprintf(`
568618
resource "aws_autoscaling_policy" "test" {
569619
name = "%[1]s-policy_predictive"
570620
policy_type = "PredictiveScaling"
@@ -590,8 +640,78 @@ resource "aws_autoscaling_policy" "test" {
590640
`, name))
591641
}
592642

593-
func testAccPolicyConfig_predictiveScalingRemoved(name string) string {
594-
return acctest.ConfigCompose(testAccPolicyConfig_base(name), fmt.Sprintf(`
643+
func testAccPolicyConfigPredictiveScalingCustom(name string) string {
644+
return acctest.ConfigCompose(testAccPolicyConfigBase(name), fmt.Sprintf(`
645+
resource "aws_autoscaling_policy" "test" {
646+
name = "%[1]s-policy_predictive"
647+
policy_type = "PredictiveScaling"
648+
autoscaling_group_name = aws_autoscaling_group.test.name
649+
predictive_scaling_configuration {
650+
metric_specification {
651+
target_value = 32
652+
customized_capacity_metric_specification {
653+
metric_data_queries {
654+
id = "weighted_sum"
655+
metric_stat {
656+
metric {
657+
namespace = "namespace_foo"
658+
metric_name = "metric_name_foo"
659+
}
660+
stat = "Sum"
661+
}
662+
return_data = false
663+
}
664+
metric_data_queries {
665+
id = "capacity_sum"
666+
metric_stat {
667+
metric {
668+
namespace = "namespace_bar"
669+
metric_name = "metric_name_bar"
670+
dimensions {
671+
name = "foo"
672+
value = "bar"
673+
}
674+
dimensions {
675+
name = "bar"
676+
value = "foo"
677+
}
678+
}
679+
unit = "Percent"
680+
stat = "Sum"
681+
}
682+
return_data = false
683+
}
684+
metric_data_queries {
685+
id = "capacity"
686+
expression = "weighted_sum / capacity_sum"
687+
return_data = true
688+
}
689+
}
690+
customized_load_metric_specification {
691+
metric_data_queries {
692+
id = "load_metric"
693+
label = "fake_load_metric"
694+
expression = "TIME_SERIES(100)"
695+
}
696+
}
697+
customized_scaling_metric_specification {
698+
metric_data_queries {
699+
id = "scaling_metric"
700+
expression = "TIME_SERIES(1)"
701+
}
702+
}
703+
}
704+
mode = "ForecastOnly"
705+
scheduling_buffer_time = 10
706+
max_capacity_breach_behavior = "IncreaseMaxCapacity"
707+
max_capacity_buffer = 0
708+
}
709+
}
710+
`, name))
711+
}
712+
713+
func testAccPolicyConfigPredictiveScalingRemoved(name string) string {
714+
return acctest.ConfigCompose(testAccPolicyConfigBase(name), fmt.Sprintf(`
595715
resource "aws_autoscaling_policy" "test" {
596716
name = "%[1]s-foobar_simple"
597717
adjustment_type = "ChangeInCapacity"
@@ -603,8 +723,8 @@ resource "aws_autoscaling_policy" "test" {
603723
`, name))
604724
}
605725

606-
func testAccautoScalingpolicyconfigPredictivescalingUpdated(name string) string {
607-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
726+
func testAccAutoScalingPolicyConfigPredictiveScalingUpdated(name string) string {
727+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
608728
resource "aws_autoscaling_policy" "test" {
609729
name = "%[1]s-policy_predictive"
610730
policy_type = "PredictiveScaling"
@@ -629,7 +749,7 @@ resource "aws_autoscaling_policy" "test" {
629749
}
630750

631751
func testAccPolicyConfig_basicUpdate(name string) string {
632-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
752+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
633753
resource "aws_autoscaling_policy" "foobar_simple" {
634754
name = "%s-foobar_simple"
635755
adjustment_type = "ChangeInCapacity"
@@ -677,8 +797,8 @@ resource "aws_autoscaling_policy" "foobar_target_tracking" {
677797
`, name, name, name)
678798
}
679799

680-
func testAccPolicyConfig_SimpleScalingStepAdjustment(name string) string {
681-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
800+
func testAccPolicyConfigSimpleScalingStepAdjustment(name string) string {
801+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
682802
resource "aws_autoscaling_policy" "foobar_simple" {
683803
name = "%s-foobar_simple"
684804
adjustment_type = "ExactCapacity"
@@ -690,8 +810,8 @@ resource "aws_autoscaling_policy" "foobar_simple" {
690810
`, name)
691811
}
692812

693-
func testAccPolicyConfig_TargetTracking_Predefined(name string) string {
694-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
813+
func testAccPolicyConfigTargetTrackingPredefined(name string) string {
814+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
695815
resource "aws_autoscaling_policy" "test" {
696816
name = "%s-test"
697817
policy_type = "TargetTrackingScaling"
@@ -708,8 +828,8 @@ resource "aws_autoscaling_policy" "test" {
708828
`, name)
709829
}
710830

711-
func testAccPolicyConfig_TargetTracking_Custom(name string) string {
712-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
831+
func testAccPolicyConfigTargetTrackingCustom(name string) string {
832+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
713833
resource "aws_autoscaling_policy" "test" {
714834
name = "%s-test"
715835
policy_type = "TargetTrackingScaling"
@@ -733,8 +853,8 @@ resource "aws_autoscaling_policy" "test" {
733853
`, name)
734854
}
735855

736-
func testAccPolicyConfig_zerovalue(name string) string {
737-
return testAccPolicyConfig_base(name) + fmt.Sprintf(`
856+
func testAccPolicyConfigZeroValue(name string) string {
857+
return testAccPolicyConfigBase(name) + fmt.Sprintf(`
738858
resource "aws_autoscaling_policy" "foobar_simple" {
739859
name = "%s-foobar_simple"
740860
adjustment_type = "ExactCapacity"

‎website/docs/r/autoscaling_policy.html.markdown

+137-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,94 @@ resource "aws_autoscaling_group" "bar" {
4141
}
4242
```
4343

44+
### Create predictive scaling policy using customized metrics
45+
46+
```terraform
47+
resource "aws_autoscaling_policy" "example" {
48+
autoscaling_group_name = "my-test-asg"
49+
name = "foo"
50+
policy_type = "PredictiveScaling"
51+
predictive_scaling_configuration {
52+
metric_specification {
53+
target_value = 10
54+
customized_load_metric_specification {
55+
metric_data_queries {
56+
id = "load_sum"
57+
expression = "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" my-test-asg', 'Sum', 3600))"
58+
}
59+
}
60+
customized_scaling_metric_specification {
61+
metric_data_queries {
62+
id = "scaling"
63+
metric_stat {
64+
metric {
65+
metric_name = "CPUUtilization"
66+
namespace = "AWS/EC2"
67+
dimensions {
68+
name = "AutoScalingGroupName"
69+
value = "my-test-asg"
70+
}
71+
}
72+
stat = "Average"
73+
}
74+
}
75+
}
76+
customized_capacity_metric_specification {
77+
metric_data_queries {
78+
id = "capacity_sum"
79+
expression = "SUM(SEARCH('{AWS/AutoScaling,AutoScalingGroupName} MetricName=\"GroupInServiceIntances\" my-test-asg', 'Average', 300))"
80+
return_data = false
81+
}
82+
metric_data_queries {
83+
id = "load_sum"
84+
expression = "SUM(SEARCH('{AWS/EC2,AutoScalingGroupName} MetricName=\"CPUUtilization\" my-test-asg', 'Sum', 300))"
85+
return_data = false
86+
}
87+
metric_data_queries {
88+
id = "weighted_average"
89+
expression = "load_sum / capacity_sum"
90+
}
91+
}
92+
}
93+
}
94+
}
95+
```
96+
97+
### Create predictive scaling policy using customized scaling and predefined load metric
98+
99+
```terraform
100+
resource "aws_autoscaling_policy" "example" {
101+
autoscaling_group_name = "my-test-asg"
102+
name = "foo"
103+
policy_type = "PredictiveScaling"
104+
predictive_scaling_configuration {
105+
metric_specification {
106+
target_value = 10
107+
predefined_load_metric_specification {
108+
predefined_metric_type = "ASGTotalCPUUtilization"
109+
resource_label = "testLabel"
110+
}
111+
customized_scaling_metric_specification {
112+
metric_data_queries {
113+
id = "scaling"
114+
metric_stat {
115+
metric {
116+
metric_name = "CPUUtilization"
117+
namespace = "AWS/EC2"
118+
dimensions {
119+
name = "AutoScalingGroupName"
120+
value = "my-test-asg"
121+
}
122+
}
123+
stat = "Average"
124+
}
125+
}
126+
}
127+
}
128+
}
129+
}
130+
```
131+
44132
## Argument Reference
45133

46134
* `name` - (Required) The name of the policy.
@@ -161,9 +249,12 @@ The following arguments are supported:
161249

162250
The following arguments are supported:
163251

164-
* `predefined_load_metric_specification` - (Optional) The load metric specification.
252+
* `customized_capacity_metric_specification` - (Optional) The customized capacity metric specification. The field is only valid when you use `customized_load_metric_specification`
253+
* `customized_load_metric_specification` - (Optional) The customized load metric specification.
254+
* `customized_scaling_metric_specification` - (Optional) The customized scaling metric specification.
255+
* `predefined_load_metric_specification` - (Optional) The predefined load metric specification.
165256
* `predefined_metric_pair_specification` - (Optional) The metric pair specification from which Amazon EC2 Auto Scaling determines the appropriate scaling metric and load metric to use.
166-
* `predefined_scaling_metric_specification` - (Optional) The scaling metric specification.
257+
* `predefined_scaling_metric_specification` - (Optional) The predefined scaling metric specification.
167258

168259
##### predefined_load_metric_specification
169260

@@ -186,6 +277,50 @@ The following arguments are supported:
186277
* `predefined_metric_type` - (Required) Describes a scaling metric for a predictive scaling policy. Valid values are `ASGAverageCPUUtilization`, `ASGAverageNetworkIn`, `ASGAverageNetworkOut`, or `ALBRequestCountPerTarget`.
187278
* `resource_label` - (Required) A label that uniquely identifies a specific Application Load Balancer target group from which to determine the request count served by your Auto Scaling group.
188279

280+
##### customized_scaling_metric_specification
281+
The following arguments are supported:
282+
283+
* `metric_data_queries` - (Required) A list of up to 10 structures that defines custom scaling metric in predictive scaling policy
284+
285+
##### customized_load_metric_specification
286+
The following arguments are supported:
287+
288+
* `metric_data_queries` - (Required) A list of up to 10 structures that defines custom load metric in predictive scaling policy
289+
290+
##### customized_capacity_metric_specification
291+
The following arguments are supported:
292+
293+
* `metric_data_queries` - (Required) A list of up to 10 structures that defines custom capacity metric in predictive scaling policy
294+
295+
##### metric_data_queries
296+
The following arguments are supported:
297+
298+
* `expression` - (Optional) The math expression used on the returned metric. You must specify either `expression` or `metric_stat`, but not both.
299+
* `id` - (Required) A short name for the metric used in predictive scaling policy.
300+
* `metric_stat` - (Optional) A structure that defines CloudWatch metric to be used in predictive scaling policy. You must specify either `expression` or `metric_stat`, but not both.
301+
* `label` - (Optional) A human-readable label for this metric or expression.
302+
* `return_data` - (Optional) A boolean that indicates whether to return the timestamps and raw data values of this metric, the default it true
303+
304+
##### metric_stat
305+
The following arguments are supported:
306+
307+
* `metric` - (Required) A structure that defines the CloudWatch metric to return, including the metric name, namespace, and dimensions.
308+
* `stat` - (Required) The statistic of the metrics to return.
309+
* `unit` - (Optional) The unit of the metrics to return.
310+
311+
##### metric
312+
The following arguments are supported:
313+
314+
* `dimensions` - (Optional) The dimensions of the metric.
315+
* `metric_name` - (Required) The name of the metric.
316+
* `namespace` - (Required) The namespace of the metric.
317+
318+
##### dimensions
319+
The following arguments are supported:
320+
321+
* `name` - (Required) The name of the dimension.
322+
* `value` - (Required) The value of the dimension.
323+
189324
## Attributes Reference
190325

191326
In addition to all arguments above, the following attributes are exported:

0 commit comments

Comments
 (0)
Please sign in to comment.