class CfnGuardian::Stacks::Resources

Attributes

template[R]

Public Class Methods

new(parameters,stack_id) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 12
def initialize(parameters,stack_id)
  @stack_id = stack_id

  @template = CloudFormation("Guardian nested - stack-id:stk#{@stack_id}")
  parameters.each do |name|
    parameter = @template.Parameter(name)
    parameter.Type 'String'
  end
end

Public Instance Methods

add_alarm(alarm) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 41
def add_alarm(alarm)
  actions = alarm.alarm_action.kind_of?(Array) ? alarm.alarm_action.map{|action| Ref(action)} : [Ref(alarm.alarm_action)]
  actions.concat alarm.maintenance_groups.map {|mg| Ref(mg)} if alarm.maintenance_groups.any?
  stack_id = @stack_id

  @template.declare do
    CloudWatch_Alarm("#{alarm.resource_hash}#{alarm.group}#{alarm.name.gsub(/[^0-9a-zA-Z]/i, '')}#{alarm.type}"[0..255]) do
      ActionsEnabled true
      AlarmDescription "Guardian alarm #{alarm.name} for the resource #{alarm.resource_id} in alarm group #{alarm.group}"
      AlarmName CfnGuardian::CloudWatch.get_alarm_name(alarm) + "-stk#{stack_id}"
      ComparisonOperator alarm.comparison_operator
      Dimensions alarm.dimensions.map {|k,v| {Name: k, Value: v}} unless alarm.dimensions.nil?
      EvaluationPeriods alarm.evaluation_periods
      Statistic alarm.statistic if alarm.extended_statistic.nil?
      Period alarm.period
      Threshold alarm.threshold
      MetricName alarm.metric_name
      Namespace alarm.namespace
      AlarmActions actions
      OKActions actions
      TreatMissingData alarm.treat_missing_data unless alarm.treat_missing_data.nil?
      DatapointsToAlarm alarm.datapoints_to_alarm unless alarm.datapoints_to_alarm.nil?
      ExtendedStatistic alarm.extended_statistic unless alarm.extended_statistic.nil?
      EvaluateLowSampleCountPercentile alarm.evaluate_low_sample_count_percentile unless alarm.evaluate_low_sample_count_percentile.nil?
      Unit alarm.unit unless alarm.unit.nil?
    end
  end
end
add_composite_alarm(alarm) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 87
def add_composite_alarm(alarm)
  stack_id = @stack_id

  @template.declare do
    CloudWatch_CompositeAlarm(alarm.name.gsub(/[^0-9a-zA-Z]/i, '')) do
      
      AlarmDescription alarm.description
      AlarmName "guardian-#{alarm.name}-stk#{stack_id}"
      AlarmRule alarm.rule
      
      unless alarm.alarm_action.nil?
        ActionsEnabled true
        AlarmActions [Ref(alarm.alarm_action)]
        # InsufficientDataActions [Ref(alarm.alarm_action)]
        # OKActions [Ref(alarm.alarm_action)]
      end
      
    end
  end
end
add_event(event) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 70
def add_event(event)
  @template.declare do          
    Events_Rule("#{event.group}#{event.type}#{event.hash}"[0..255]) do
      State 'ENABLED'
      Description "Guardian scheduled #{event.group} #{event.type}"
      ScheduleExpression "cron(#{event.cron})"
      Targets([
        { 
          Arn: Ref(event.target),
          Id: event.hash,
          Input: FnSub(event.payload)
        }
      ])
    end
  end
end
add_event_subscription(subscription) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 124
def add_event_subscription(subscription)
  event_pattern = {}
  event_pattern['detail-type'] = [subscription.detail_type]
  event_pattern['source'] = [subscription.source]
  event_pattern['resources'] = [subscription.resource_arn] unless subscription.resource_arn.empty?
  event_pattern['detail'] = subscription.detail unless subscription.detail.empty?

  @template.declare do
    Events_Rule("#{subscription.group}#{subscription.name}#{subscription.hash}"[0..255]) do
      State subscription.enabled ? 'ENABLED' : 'DISABLED'
      Description "Guardian event subscription #{subscription.group} #{subscription.name} for resource #{subscription.resource_id}"
      EventPattern FnSub(event_pattern.to_json)
      Targets [
        {
          Arn: Ref(subscription.topic),
          Id: "#{subscription.topic}Notifier"
        }
      ]
    end
  end
end
add_metric_filter(filter) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 108
def add_metric_filter(filter)
  @template.declare do
    Logs_MetricFilter("#{filter.name.gsub(/[^0-9a-zA-Z]/i, '')}#{filter.type}") do
      LogGroupName filter.log_group
      FilterPattern filter.pattern
      MetricTransformations([
        {
          MetricValue: filter.metric_value,
          MetricName: filter.metric_name,
          MetricNamespace: filter.metric_namespace
        }
      ])
    end
  end
end
build_template(resources) click to toggle source
# File lib/cfnguardian/stacks/resources.rb, line 22
def build_template(resources)
  resources.each do |resource|
    case resource.type
    when 'Alarm'
      add_alarm(resource)
    when 'Event'
      add_event(resource)
    when 'Composite'
      add_composite_alarm(resource)
    when 'MetricFilter'
      add_metric_filter(resource)
    when 'EventSubscription'
      add_event_subscription(resource)
    else
      puts "Warn: #{resource.type} is a unsuported resource type"
    end
  end
end