Check out this.
- Ensure that you have AWS CLI installed in your workstation wherever you run Terraform and is in path. Just type aws and you should be able to see something
- The command creates Scaleout and Scalein policies along with CloudWatch alarms. You need an SNS Topic for alarm.
- The command creates few transient files to process in next stage after each command. You can clean up those files as needed, doesn't hurt to leave them there.
- I only used CPU metrics, feel free to extend it to other metrics
Let me know if this helps.
Thx
Sathiya
provisioner "local-exec" {
command = "aws autoscaling put-scaling-policy --auto-scaling-group-name ${
aws_autoscaling_group.oupf-app-as.name} --policy-name ScaleIn --scaling-adjustment ${var.scalein_adjustment} --adjustment-type ChangeInCapacity > ScaleIn.json;aws autoscaling put-scaling-policy --auto-scaling-group-name ${
aws_autoscaling_group.oupf-app-as.name} --policy-name ScaleOut --scaling-adjustment ${var.scaleout_adjustment} --adjustment-type ChangeInCapacity > ScaleOut.json;export SCALEOUT_POLICY=$(cat ScaleOut.json | grep PolicyARN | awk -F'\"PolicyARN\": \"' '{print $2}' | awk -F'\"' '{print $1}');export SCALEIN_POLICY=$(cat ScaleIn.json | grep PolicyARN | awk -F'\"PolicyARN\": \"' '{print $2}' | awk -F'\"' '{print $1}');echo $SCALEOUT_POLICY > scaleout_policy ;echo $SCALEIN_POLICY > scalein_policy;aws cloudwatch put-metric-alarm --alarm-name ${
aws_autoscaling_group.oupf-app-as.name}-scaleout --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average --period ${var.scaleout_alarm_cpu_interval_secs} --threshold ${var.scaleout_cpu_percent} --comparison-operator GreaterThanOrEqualToThreshold --dimensions \"Name=AutoScalingGroupName,Value=${
aws_autoscaling_group.oupf-app-as.name}\" --evaluation-periods ${var.scaleout_evaluation_periods} --alarm-actions $SCALEOUT_POLICY ${var.sns_topic};aws cloudwatch put-metric-alarm --alarm-name ${
aws_autoscaling_group.oupf-app-as.name}-scalein --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average --period ${var.scalein_alarm_cpu_interval_secs} --threshold ${var.scalein_cpu_percent} --comparison-operator LessThanOrEqualToThreshold --dimensions \"Name=AutoScalingGroupName,Value=${
aws_autoscaling_group.oupf-app-as.name}\" --evaluation-periods ${var.scalein_evaluation_periods} --alarm-actions $SCALEIN_POLICY ${var.sns_topic}}"
}
variable "sns_topic" {
description = "SNS Topic ID"
default = "arn:aws:sns:us-east-1:XXXXXXXXXXX"
}
variable "scaleout_cpu_percent" {
description = "scaleout_cpu_percent"
default = "80"
}
variable "scalein_cpu_percent" {
description = "scaleout_cpu_percent"
default = "5"
}
variable "scaleout_alarm_cpu_interval_secs" {
description = "scaleout_cpu_percent"
default = "3600"
}
variable "scalein_alarm_cpu_interval_secs" {
description = "scaleout_cpu_percent"
default = "3600"
}
variable "scaleout_evaluation_periods" {
description = "scaleout_cpu_percent"
default = "23"
}
variable "scalein_evaluation_periods" {
description = "scaleout_cpu_percent"
default = "23"
}
variable "scalein_adjustment" {
description = "scalein_adjustment"
default = "-1"
}
variable "scaleout_adjustment" {
description = "scalein_adjustment"
default = "1"