在Heat中完全使用aws的语法创建一套autoscaling的template。
流程:
Create
LaunchConfig (Create basic instance, send mem status to ALARM) ->
Create
ASGroup (Define instance num range) ->
Create
ScaleUpPolicy (+1 instance when mem_alarm_high) ->
Create
MEMAlarmHigh (Monitor mem status) ->
Create
ScaleDownPolicy (-1 instance when mem_alarm_low) ->
Create
MEMAlarmLow (monitor mem status)
Template模板:
"
ASGroup" : {
"Type" : "AWS::AutoScaling::AutoScalingGroup",
"Properties" : {
"AvailabilityZones" : ["nova"],
"LaunchConfigurationName" : { "Ref" : "
LaunchConfig" },
"MinSize" : "1",
"MaxSize" : "10"
}
},
"
ScaleUpPolicy" : {
"Type" : "AWS::AutoScaling::ScalingPolicy",
"Properties" : {
"AdjustmentType" : "ChangeInCapacity",
"AutoScalingGroupName" : { "Ref" : "
ASGroup" },
"Cooldown" : "60",
"ScalingAdjustment" : "1"
}
},
"
MEMAlarmHigh": {
"Type": "AWS::CloudWatch::Alarm",
"Properties": {
"AlarmDescription": "Scale-up if MEM > 70% for 1 minute",
"MetricName": "MemoryUtilization",
"Namespace": "system/linux",
"Statistic": "Average",
"Period": "60",
"EvaluationPeriods": "1",
"Threshold": "70",
"AlarmActions": [ { "Ref": "
ScaleUpPolicy" } ],
"Dimensions": [
{
"Name": "AutoScalingGroupName",
"Value": { "Ref": "
ASGroup" }
}
],
"ComparisonOperator": "GreaterThanThreshold"
}
},
"
ScaleDownPolicy" : {
"Type" : "AWS::AutoScaling::ScalingPolicy",
"Properties" : {
"AdjustmentType" : "ChangeInCapacity",
"AutoScalingGroupName" : { "Ref" : "
ASGroup" },
"Cooldown" : "60",
"ScalingAdjustment" : "-1"
}
},
"
MEMAlarmLow": {
"Type": "AWS::CloudWatch::Alarm",
"Properties": {
"AlarmDescription": "Scale-down if MEM < 30% for 1 minute",
"MetricName": "MemoryUtilization",
"Namespace": "system/linux",
"Statistic": "Average",
"Period": "60",
"EvaluationPeriods": "1",
"Threshold": "30",
"AlarmActions": [ { "Ref": "
ScaleDownPolicy" } ],
"Dimensions": [
{
"Name": "AutoScalingGroupName",
"Value": { "Ref": "
ASGroup" }
}
],
"ComparisonOperator": "LessThanThreshold"
}
},
"
LaunchConfig" : {
"Type" : "AWS::AutoScaling::LaunchConfiguration",
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"files" : {
"/etc/cfn/cfn-credentials" : {
"content" : { "Fn::Join" : ["", [
"AWSAccessKeyId=", { "Ref" : "LSFKeys" }, "\n",
"AWSSecretKey=", {"Fn::GetAtt": ["LSFKeys",
"SecretAccessKey"]}, "\n"
]]},
"mode" : "000400",
"owner" : "root",
"group" : "root"
},
"
/tmp/stats-crontab.txt" : {
"content" : { "Fn::Join" : ["", [
"MAIL=\"\"\n",
"\n",
"* * * * * /opt/aws/bin/cfn-push-stats --watch ",
{ "Ref" : "
MEMAlarmHigh" }, " --mem-util\n",
"* * * * * /opt/aws/bin/cfn-push-stats --watch ",
{ "Ref" : "
MEMAlarmLow" }, " --mem-util\n"
]]},
"mode" : "000600",
"owner" : "root",
"group" : "root"
}
}
}
}
},
"Properties": {
"ImageId": "rhel6u4",
"InstanceType": "m1.small",
"KeyName": "poc",
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -v\n",
"/opt/aws/bin/cfn-init -s ", { "Ref" : "AWS::StackName" },
" -r VMWARELaunchConfig ",
" --region ", { "Ref" : "AWS::Region" }, "\n",
"
crontab /tmp/stats-crontab.txt\n",
]]}}
}
}
},