cfn-guardian 0.6.13 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/docs/maintenance_mode.md +12 -4
 - data/lib/cfnguardian/compile.rb +5 -3
 - data/lib/cfnguardian/models/check.rb +11 -0
 - data/lib/cfnguardian/resources/elastic_search.rb +1 -0
 - data/lib/cfnguardian/stacks/main.rb +47 -7
 - data/lib/cfnguardian/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: cd1284d70e2862cb14e2aa9f3c97e582ef6776bc54d80f47af8d8bfb561a9386
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 6df131dc0d56bb00041f808617dbd856501d6a131d42ab1311a53d8fb3a3e02d
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3f63a7f508b3b2b235138840ddcf9fbdf4512b646711cc7422da94727bde967e49f7da23e7dff94f10134d15c39e661a8da6e356b1fe60c514897f4bfd7176dc
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 9ff94d8f5eeec75778f4b13da7fccd853fd85ff3669966de381c3147a94769b2dc916644069b764d05f560ad9e0f61024c6d776bd60e355cd6a2dbe89d579e04
         
     | 
    
        data/docs/maintenance_mode.md
    CHANGED
    
    | 
         @@ -8,8 +8,8 @@ Alarms can be provided to the function the following ways 
     | 
|
| 
       8 
8 
     | 
    
         
             
            Alarm names be provided by a space delimited list using the `--alarms` switch.
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
            ```bash
         
     | 
| 
       11 
     | 
    
         
            -
            cfn-guardian disable-alarms -- 
     | 
| 
       12 
     | 
    
         
            -
            cfn-guardian enable-alarms -- 
     | 
| 
      
 11 
     | 
    
         
            +
            cfn-guardian disable-alarms --alarms alarm-1 alarm-2
         
     | 
| 
      
 12 
     | 
    
         
            +
            cfn-guardian enable-alarms --alarms alarm-1 alarm-2
         
     | 
| 
       13 
13 
     | 
    
         
             
            ```
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            ## Alarm Name Prefix
         
     | 
| 
         @@ -60,10 +60,16 @@ Resources: 
     | 
|
| 
       60 
60 
     | 
    
         
             
                StatusCode: 200
         
     | 
| 
       61 
61 
     | 
    
         | 
| 
       62 
62 
     | 
    
         
             
            # Define the top level key
         
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 63 
     | 
    
         
            +
            MaintenanceGroups:
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
65 
     | 
    
         
             
              # Define the group name
         
     | 
| 
       66 
66 
     | 
    
         
             
              AppUpdate:
         
     | 
| 
      
 67 
     | 
    
         
            +
                # Optionally set a schedule for enabling/disabling
         
     | 
| 
      
 68 
     | 
    
         
            +
                Schedules:
         
     | 
| 
      
 69 
     | 
    
         
            +
                  Disable: '30 0 * * ? *'
         
     | 
| 
      
 70 
     | 
    
         
            +
                  Enable: '00 1 * * ? *'
         
     | 
| 
      
 71 
     | 
    
         
            +
                  #Optionally specify and set to true to enable logging on lambda
         
     | 
| 
      
 72 
     | 
    
         
            +
                  Debug: true
         
     | 
| 
       67 
73 
     | 
    
         
             
                # Define the resource group
         
     | 
| 
       68 
74 
     | 
    
         
             
                ECSService:
         
     | 
| 
       69 
75 
     | 
    
         
             
                  # define the alarms in the resource group
         
     | 
| 
         @@ -82,4 +88,6 @@ MaintenaceGroups: 
     | 
|
| 
       82 
88 
     | 
    
         
             
            ```bash
         
     | 
| 
       83 
89 
     | 
    
         
             
            cfn-guardian disable-alarms --group AppUpdate
         
     | 
| 
       84 
90 
     | 
    
         
             
            cfn-guardian enable-alarms --group AppUpdate
         
     | 
| 
       85 
     | 
    
         
            -
            ```
         
     | 
| 
      
 91 
     | 
    
         
            +
            ```
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            Optionally add a Schedule for disabling and enabling alarm actions as shown in the example above to deploy a lambda function that will be invoked by event rules created with the given cron expressions.
         
     | 
    
        data/lib/cfnguardian/compile.rb
    CHANGED
    
    | 
         @@ -61,7 +61,7 @@ module CfnGuardian 
     | 
|
| 
       61 
61 
     | 
    
         
             
                  @composites = config.fetch('Composites',{})
         
     | 
| 
       62 
62 
     | 
    
         
             
                  @templates = config.fetch('Templates',{})
         
     | 
| 
       63 
63 
     | 
    
         
             
                  @topics = config.fetch('Topics',{})
         
     | 
| 
       64 
     | 
    
         
            -
                  @maintenance_groups = config.fetch(' 
     | 
| 
      
 64 
     | 
    
         
            +
                  @maintenance_groups = config.fetch('MaintenanceGroups', {})
         
     | 
| 
       65 
65 
     | 
    
         
             
                  @event_subscriptions = config.fetch('EventSubscriptions', {})
         
     | 
| 
       66 
66 
     | 
    
         | 
| 
       67 
67 
     | 
    
         
             
                  # Make sure the default topics exist if they aren't supplied in the alarms.yaml
         
     | 
| 
         @@ -69,7 +69,6 @@ module CfnGuardian 
     | 
|
| 
       69 
69 
     | 
    
         
             
                    @topics[topic] = '' unless @topics.has_key?(topic)
         
     | 
| 
       70 
70 
     | 
    
         
             
                  end
         
     | 
| 
       71 
71 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
                  @maintenance_group_list = @maintenance_groups.keys.map {|group| "#{group}MaintenanceGroup"}
         
     | 
| 
       73 
72 
     | 
    
         
             
                  @resources = []
         
     | 
| 
       74 
73 
     | 
    
         
             
                  @stacks = []
         
     | 
| 
       75 
74 
     | 
    
         
             
                  @checks = []
         
     | 
| 
         @@ -116,6 +115,9 @@ module CfnGuardian 
     | 
|
| 
       116 
115 
     | 
    
         | 
| 
       117 
116 
     | 
    
         
             
                  @maintenance_groups.each do |maintenance_group,resource_groups|
         
     | 
| 
       118 
117 
     | 
    
         
             
                    resource_groups.each do |group, alarms|
         
     | 
| 
      
 118 
     | 
    
         
            +
                      if group == 'Schedules' 
         
     | 
| 
      
 119 
     | 
    
         
            +
                        next
         
     | 
| 
      
 120 
     | 
    
         
            +
                      end
         
     | 
| 
       119 
121 
     | 
    
         
             
                      alarms.each do |alarm, resources|
         
     | 
| 
       120 
122 
     | 
    
         
             
                        resources.each do |resource|
         
     | 
| 
       121 
123 
     | 
    
         | 
| 
         @@ -190,7 +192,7 @@ module CfnGuardian 
     | 
|
| 
       190 
192 
     | 
    
         
             
                  resources = split_resources(bucket,path)
         
     | 
| 
       191 
193 
     | 
    
         | 
| 
       192 
194 
     | 
    
         
             
                  main_stack = CfnGuardian::Stacks::Main.new()
         
     | 
| 
       193 
     | 
    
         
            -
                  main_stack.build_template(@stacks,@checks,@topics,@ 
     | 
| 
      
 195 
     | 
    
         
            +
                  main_stack.build_template(@stacks,@checks,@topics,@maintenance_groups,@ssm_parameters)
         
     | 
| 
       194 
196 
     | 
    
         
             
                  valid = main_stack.template.validate
         
     | 
| 
       195 
197 
     | 
    
         
             
                  FileUtils.mkdir_p 'out'
         
     | 
| 
       196 
198 
     | 
    
         
             
                  File.write("out/guardian.compiled.yaml", JSON.parse(valid.to_json).to_yaml)
         
     | 
| 
         @@ -205,5 +205,16 @@ module CfnGuardian 
     | 
|
| 
       205 
205 
     | 
    
         
             
                  end
         
     | 
| 
       206 
206 
     | 
    
         
             
                end
         
     | 
| 
       207 
207 
     | 
    
         | 
| 
      
 208 
     | 
    
         
            +
                class MaintenanceGroupCheck < BaseCheck
         
     | 
| 
      
 209 
     | 
    
         
            +
                  def initialize(resource)
         
     | 
| 
      
 210 
     | 
    
         
            +
                    super(resource)
         
     | 
| 
      
 211 
     | 
    
         
            +
                    @name = 'MaintenanceGroupCheck'
         
     | 
| 
      
 212 
     | 
    
         
            +
                    @package = 'maintenance-group-check'
         
     | 
| 
      
 213 
     | 
    
         
            +
                    @handler = 'handler.maintenance_group_check'
         
     | 
| 
      
 214 
     | 
    
         
            +
                    @version = '5b795e6509068d1767e4be80f2e6868cbeb3b425'
         
     | 
| 
      
 215 
     | 
    
         
            +
                    @runtime = 'python3.7'
         
     | 
| 
      
 216 
     | 
    
         
            +
                  end 
         
     | 
| 
      
 217 
     | 
    
         
            +
                end
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
       208 
219 
     | 
    
         
             
              end
         
     | 
| 
       209 
220 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,6 +4,7 @@ module CfnGuardian 
     | 
|
| 
       4 
4 
     | 
    
         
             
              module Stacks
         
     | 
| 
       5 
5 
     | 
    
         
             
                class Main
         
     | 
| 
       6 
6 
     | 
    
         
             
                  include CfnDsl::CloudFormation
         
     | 
| 
      
 7 
     | 
    
         
            +
                  include Logging
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
9 
     | 
    
         
             
                  attr_reader :parameters, :template
         
     | 
| 
       9 
10 
     | 
    
         | 
| 
         @@ -22,12 +23,10 @@ module CfnGuardian 
     | 
|
| 
       22 
23 
     | 
    
         
             
                      parameter.Default sns
         
     | 
| 
       23 
24 
     | 
    
         
             
                      parameters[name] = Ref(name)
         
     | 
| 
       24 
25 
     | 
    
         
             
                    end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                    maintenance_groups. 
     | 
| 
       27 
     | 
    
         
            -
                       
     | 
| 
       28 
     | 
    
         
            -
                       
     | 
| 
       29 
     | 
    
         
            -
                      topic.Tags([{ Key: 'Environment', Value: 'guardian' }])
         
     | 
| 
       30 
     | 
    
         
            -
                      parameters[group] = Ref(group)
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                    if maintenance_groups.any?
         
     | 
| 
      
 28 
     | 
    
         
            +
                      add_lambda(CfnGuardian::Models::MaintenanceGroupCheck.new(maintenance_groups))
         
     | 
| 
      
 29 
     | 
    
         
            +
                      maintenance_groups.each {|group,config| add_maintenance_group(group,config,parameters)}
         
     | 
| 
       31 
30 
     | 
    
         
             
                    end
         
     | 
| 
       32 
31 
     | 
    
         | 
| 
       33 
32 
     | 
    
         
             
                    add_iam_role(ssm_parameters)
         
     | 
| 
         @@ -73,6 +72,17 @@ module CfnGuardian 
     | 
|
| 
       73 
72 
     | 
    
         
             
                        }]
         
     | 
| 
       74 
73 
     | 
    
         
             
                      }
         
     | 
| 
       75 
74 
     | 
    
         
             
                    }
         
     | 
| 
      
 75 
     | 
    
         
            +
                    policies << {
         
     | 
| 
      
 76 
     | 
    
         
            +
                      PolicyName: 'maintenance-group-actions',
         
     | 
| 
      
 77 
     | 
    
         
            +
                      PolicyDocument: {
         
     | 
| 
      
 78 
     | 
    
         
            +
                        Version: '2012-10-17',
         
     | 
| 
      
 79 
     | 
    
         
            +
                        Statement: [{
         
     | 
| 
      
 80 
     | 
    
         
            +
                          Effect: 'Allow',
         
     | 
| 
      
 81 
     | 
    
         
            +
                          Action: [ 'cloudwatch:DescribeAlarms', 'cloudwatch:DisableAlarmActions', 'cloudwatch:EnableAlarmActions', 'cloudwatch:SetAlarmState' ],
         
     | 
| 
      
 82 
     | 
    
         
            +
                          Resource: FnSub("arn:aws:cloudwatch:${AWS::Region}:${AWS::AccountId}:alarm:*")
         
     | 
| 
      
 83 
     | 
    
         
            +
                        }]
         
     | 
| 
      
 84 
     | 
    
         
            +
                      }
         
     | 
| 
      
 85 
     | 
    
         
            +
                    }
         
     | 
| 
       76 
86 
     | 
    
         
             
                    if ssm_parameters.any?
         
     | 
| 
       77 
87 
     | 
    
         
             
                      policies << {
         
     | 
| 
       78 
88 
     | 
    
         
             
                        PolicyName: 'ssm-parameters',
         
     | 
| 
         @@ -165,7 +175,37 @@ module CfnGuardian 
     | 
|
| 
       165 
175 
     | 
    
         
             
                      end
         
     | 
| 
       166 
176 
     | 
    
         
             
                    end
         
     | 
| 
       167 
177 
     | 
    
         
             
                  end
         
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
                  def add_maintenance_group(group,config,parameters)
         
     | 
| 
      
 180 
     | 
    
         
            +
                    group_name = "#{group}MaintenanceGroup"
         
     | 
| 
      
 181 
     | 
    
         
            +
                    schedules = config.fetch('Schedules', {})
         
     | 
| 
      
 182 
     | 
    
         
            +
                    logging = config.dig('Schedules', 'Debug').to_s
         
     | 
| 
      
 183 
     | 
    
         
            +
             
     | 
| 
      
 184 
     | 
    
         
            +
                    topic = @template.SNS_Topic(group_name)
         
     | 
| 
      
 185 
     | 
    
         
            +
                    topic.TopicName group_name
         
     | 
| 
      
 186 
     | 
    
         
            +
                    topic.Tags([{ Key: 'Environment', Value: 'guardian' }])
         
     | 
| 
      
 187 
     | 
    
         
            +
                    parameters[group_name] = Ref(group_name)
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
      
 189 
     | 
    
         
            +
                    if schedules.any?
         
     | 
| 
      
 190 
     | 
    
         
            +
                      event = @template.Events_Rule("#{group_name}EnableEvent")
         
     | 
| 
      
 191 
     | 
    
         
            +
                      event.Name "#{group_name}EnableEvent"
         
     | 
| 
      
 192 
     | 
    
         
            +
                      event.ScheduleExpression "cron(#{schedules['Enable']})"
         
     | 
| 
      
 193 
     | 
    
         
            +
                      event.Targets([{ 
         
     | 
| 
      
 194 
     | 
    
         
            +
                        Arn: FnGetAtt('MaintenanceGroupCheckFunction', 'Arn'), 
         
     | 
| 
      
 195 
     | 
    
         
            +
                        Id: "#{group_name}EnableTarget", 
         
     | 
| 
      
 196 
     | 
    
         
            +
                        Input: {action:"enable_alarms", maintenance_group: group_name, logging: logging}.to_json
         
     | 
| 
      
 197 
     | 
    
         
            +
                      }])
         
     | 
| 
      
 198 
     | 
    
         
            +
             
     | 
| 
      
 199 
     | 
    
         
            +
                      event = @template.Events_Rule("#{group_name}DisableEvent")
         
     | 
| 
      
 200 
     | 
    
         
            +
                      event.Name "#{group_name}DisableEvent"
         
     | 
| 
      
 201 
     | 
    
         
            +
                      event.ScheduleExpression "cron(#{schedules['Disable']})"            
         
     | 
| 
      
 202 
     | 
    
         
            +
                      event.Targets([{ 
         
     | 
| 
      
 203 
     | 
    
         
            +
                        Arn: FnGetAtt('MaintenanceGroupCheckFunction', 'Arn'), 
         
     | 
| 
      
 204 
     | 
    
         
            +
                        Id: "#{group_name}DisableTarget", 
         
     | 
| 
      
 205 
     | 
    
         
            +
                        Input: {action:"disable_alarms", maintenance_group: group_name, logging: logging}.to_json
         
     | 
| 
      
 206 
     | 
    
         
            +
                      }])
         
     | 
| 
      
 207 
     | 
    
         
            +
                    end
         
     | 
| 
      
 208 
     | 
    
         
            +
                  end
         
     | 
| 
       169 
209 
     | 
    
         
             
                end
         
     | 
| 
       170 
210 
     | 
    
         
             
              end
         
     | 
| 
       171 
211 
     | 
    
         
             
            end
         
     | 
    
        data/lib/cfnguardian/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: cfn-guardian
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.7.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Guslington
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2021- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2021-08-09 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: thor
         
     |