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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed07cb07793213554d2611f693312d285d672d54146a8188c6b178f56d946aa7
4
- data.tar.gz: 2322c8908d7239288fb689e0a102ccd9ab5af32a702a6aa6af3df76c90f6c740
3
+ metadata.gz: cd1284d70e2862cb14e2aa9f3c97e582ef6776bc54d80f47af8d8bfb561a9386
4
+ data.tar.gz: 6df131dc0d56bb00041f808617dbd856501d6a131d42ab1311a53d8fb3a3e02d
5
5
  SHA512:
6
- metadata.gz: 35f90c8f88dafa4092f3b44adb604f794ced719fc8d1b72252b8013d9c7420df66981d40435c96c7176a46623b98f701e0d725ed866adcb93bcfdb2d4b31843b
7
- data.tar.gz: 887fac6d120e13890639341295a97f54955e7de67875e554c2806177daacf3abe2542a0ec5ab45d73166eed71e63327d31e2e123329e93910324e43cc0eff58e
6
+ metadata.gz: 3f63a7f508b3b2b235138840ddcf9fbdf4512b646711cc7422da94727bde967e49f7da23e7dff94f10134d15c39e661a8da6e356b1fe60c514897f4bfd7176dc
7
+ data.tar.gz: 9ff94d8f5eeec75778f4b13da7fccd853fd85ff3669966de381c3147a94769b2dc916644069b764d05f560ad9e0f61024c6d776bd60e355cd6a2dbe89d579e04
@@ -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 --group alarm-1 alarm-2
12
- cfn-guardian enable-alarms --group alarm-1 alarm-2
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
- MaintenaceGroups:
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.
@@ -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('MaintenaceGroups', {})
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,@maintenance_group_list,@ssm_parameters)
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
@@ -70,6 +70,7 @@ module CfnGuardian::Resource
70
70
  alarm.threshold = 25000
71
71
  alarm.evaluation_periods = 1
72
72
  alarm.alarm_action = 'Critical'
73
+ alarm.statistic = 'Minimum'
73
74
  alarm.comparison_operator = 'LessThanOrEqualToThreshold'
74
75
  @alarms.push(alarm)
75
76
 
@@ -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.each do |group|
27
- topic = @template.SNS_Topic(group)
28
- topic.TopicName group
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
@@ -1,4 +1,4 @@
1
1
  module CfnGuardian
2
- VERSION = "0.6.13"
2
+ VERSION = "0.7.0"
3
3
  CHANGE_SET_VERSION = VERSION.gsub('.', '-').freeze
4
4
  end
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.6.13
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-07-06 00:00:00.000000000 Z
11
+ date: 2021-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor