class RenderCFN::AutoScalingGroup

Public Class Methods

new( arguments) click to toggle source
# File lib/renderCFN/autoScalingGroup.rb, line 5
def initialize( arguments)
  @name = "#{arguments[:name]}AutoScalingGroup"
  @awsObject = { 
    @name => {
      'Type' => 'AWS::AutoScaling::AutoScalingGroup',
      'Properties' => {
        'TerminationPolicies' => [ 'OldestInstance' ],
        'HealthCheckType' => arguments[:healthCheckEmergencyOverride] || arguments[:healthCheck],
        'HealthCheckGracePeriod' => arguments[:healthCheckGracePeriod],
        'LaunchConfigurationName' => { 'Ref' => "#{arguments[:name]}LaunchConfiguration" },
        'VPCZoneIdentifier' => Array.new, 
        'MinSize' => arguments[:minSize],
        'MaxSize' => arguments[:maxSize],
        'Cooldown' => 300,
        'Tags' => [
          { 'Key' => 'Name', 'Value' => "#{arguments[:serviceTitle]}", 'PropagateAtLaunch' => true },
          { 'Key' => 'stack', 'Value' => "#{@@environmentType}", 'PropagateAtLaunch' => true },
          { 'Key' => 'application', 'Value' => "#{arguments[:serviceTitle]}", 'PropagateAtLaunch' => true },
          { 'Key' => 'StackName', 'Value' => "#{@@stackName}", 'PropagateAtLaunch' => true },
          { 'Key' => 'PMData', 'Value' => "#{arguments[:pmData]}", 'PropagateAtLaunch' => true }
        ]
      },
      'DependsOn' => []
    }
  }

    #I do not know why I have to do it this way... shrug
    arguments[:subnetList].each do |subnet|
      @awsObject[@name]['Properties']['VPCZoneIdentifier'].push( subnet)
    end

    unless arguments[:noelb] then
      @awsObject[@name]['Properties']['LoadBalancerNames'] = Array.new
      @awsObject[@name]['Properties']['LoadBalancerNames'].push( 'Ref' => "#{arguments[:name]}ElasticLoadBalancer" )
      @awsObject[@name]['DependsOn'].push( "#{arguments[:name]}ElasticLoadBalancer")
    end

    @awsObject[@name]['DependsOn'].push( "#{arguments[:name]}LaunchConfiguration")

    if arguments[:autoScalingRollingUpdateEnabled]
      @awsObject[@name]['UpdatePolicy'] = {
        'AutoScalingRollingUpdate' => { 
          'MinInstancesInService' => arguments[:minInstancesInService],
          'MaxBatchSize' => arguments[:maxBatchSize],
          'PauseTime' => "PT#{90 + arguments[:healthCheckGracePeriod]}S"
        }
      }
    end
end

Public Instance Methods

addCpuScaling( args) click to toggle source
# File lib/renderCFN/autoScalingGroup.rb, line 55
  def addCpuScaling( args)

    cpuMetrics = {'ExtendedStatistic' => args[:cpuPercentile] || 'p90'}

    if args[:cpuMetric] == 'Average' then
      cpuMetrics = {'Statistic' => 'Average'}
    end

    stuff = {
      "#{@name}ScaleUP" => {
        'Type' => 'AWS::AutoScaling::ScalingPolicy',
        'Properties' => {
          'AutoScalingGroupName' => { 
            'Ref' => @name,
          },
          'AdjustmentType' => 'ChangeInCapacity',
          'ScalingAdjustment' => args[:changeUP]
        }
      },
      "#{@name}ScaleDOWN" => {
        'Type' => 'AWS::AutoScaling::ScalingPolicy',
        'Properties' => {
          'AutoScalingGroupName' => { 
            'Ref' => @name,
          },
          'AdjustmentType' => 'ChangeInCapacity',
          'ScalingAdjustment' => args[:changeDOWN]
        }
      },
      "#{@name}AlarmUP" => {
        'Type' => 'AWS::CloudWatch::Alarm',
        'Properties' => {
          'ComparisonOperator' => 'GreaterThanOrEqualToThreshold',
          'EvaluationPeriods' => 2,
          'MetricName' => 'CPUUtilization',
          'Namespace' => 'AWS/EC2',
          'Period' => 300,
          'Threshold' => args[:cpuUP],
          'AlarmActions' => [
            'Ref' => "#{@name}ScaleUP"
          ],
          "Dimensions" =>  [{
            "Name" => "AutoScalingGroupName",
            "Value" => {
              "Ref" =>  @name
            }
          }]
          }.merge!(cpuMetrics)
        },
      "#{@name}AlarmDOWN" => {
        'Type' => 'AWS::CloudWatch::Alarm',
        'Properties' => {
          'ComparisonOperator' => 'LessThanOrEqualToThreshold',
          'EvaluationPeriods' => 8,
          'MetricName' => 'CPUUtilization',
          'Namespace' => 'AWS/EC2',
          'Period' => 300,
          'Threshold' => args[:cpuDOWN],
          'AlarmActions' => [
            'Ref' => "#{@name}ScaleDOWN"
          ],
          "Dimensions" =>  [{
            "Name" => "AutoScalingGroupName",
            "Value" => {
              "Ref" =>  @name
            }
          }]
          }.merge!(cpuMetrics)
        }
      }
  @awsObject.merge!( stuff)
end