cfn-guardian 0.1.0 → 0.3.3

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +1 -0
  3. data/Dockerfile +19 -0
  4. data/Gemfile.lock +31 -13
  5. data/README.md +441 -42
  6. data/cfn-guardian.gemspec +6 -2
  7. data/lib/cfnguardian.rb +301 -27
  8. data/lib/cfnguardian/cloudwatch.rb +121 -0
  9. data/lib/cfnguardian/codecommit.rb +54 -0
  10. data/lib/cfnguardian/codepipeline.rb +138 -0
  11. data/lib/cfnguardian/compile.rb +58 -17
  12. data/lib/cfnguardian/config/defaults.yaml +94 -0
  13. data/lib/cfnguardian/display_formatter.rb +164 -0
  14. data/lib/cfnguardian/drift.rb +79 -0
  15. data/lib/cfnguardian/log.rb +0 -1
  16. data/lib/cfnguardian/models/alarm.rb +98 -36
  17. data/lib/cfnguardian/models/check.rb +103 -26
  18. data/lib/cfnguardian/models/composite.rb +21 -0
  19. data/lib/cfnguardian/models/event.rb +164 -40
  20. data/lib/cfnguardian/models/metric_filter.rb +28 -0
  21. data/lib/cfnguardian/resources/application_targetgroup.rb +2 -0
  22. data/lib/cfnguardian/resources/base.rb +38 -16
  23. data/lib/cfnguardian/resources/ecs_service.rb +2 -2
  24. data/lib/cfnguardian/resources/http.rb +16 -1
  25. data/lib/cfnguardian/resources/internal_http.rb +74 -0
  26. data/lib/cfnguardian/resources/internal_port.rb +33 -0
  27. data/lib/cfnguardian/resources/internal_sftp.rb +58 -0
  28. data/lib/cfnguardian/resources/log_group.rb +26 -0
  29. data/lib/cfnguardian/resources/network_targetgroup.rb +1 -0
  30. data/lib/cfnguardian/resources/port.rb +25 -0
  31. data/lib/cfnguardian/resources/rds_instance.rb +2 -0
  32. data/lib/cfnguardian/resources/sftp.rb +50 -0
  33. data/lib/cfnguardian/resources/sql.rb +1 -1
  34. data/lib/cfnguardian/resources/tls.rb +66 -0
  35. data/lib/cfnguardian/s3.rb +3 -2
  36. data/lib/cfnguardian/stacks/main.rb +86 -65
  37. data/lib/cfnguardian/stacks/resources.rb +81 -42
  38. data/lib/cfnguardian/string.rb +12 -0
  39. data/lib/cfnguardian/version.rb +1 -1
  40. metadata +102 -5
@@ -1,74 +1,113 @@
1
1
  require 'cfndsl'
2
+ require 'digest/md5'
3
+ require 'cfnguardian/cloudwatch'
2
4
 
3
5
  module CfnGuardian
4
6
  module Stacks
5
7
  class Resources
6
8
  include CfnDsl::CloudFormation
7
9
 
8
- def build_template(resources)
10
+ attr_reader :template
11
+
12
+ def initialize(parameters)
9
13
  @template = CloudFormation("Guardian nested stack")
10
-
11
- %w(Critical Warning Task Informational).each do |name|
14
+ parameters.each do |name|
12
15
  parameter = @template.Parameter(name)
13
16
  parameter.Type 'String'
14
- parameter.Description "SNS topic ARN for #{name} notifications"
15
17
  end
16
-
18
+ end
19
+
20
+ def build_template(resources)
17
21
  resources.each do |resource|
18
- case resource[:type]
22
+ case resource.type
19
23
  when 'Alarm'
20
24
  add_alarm(resource)
21
25
  when 'Event'
22
26
  add_event(resource)
27
+ when 'Composite'
28
+ add_composite_alarm(resource)
29
+ when 'MetricFilter'
30
+ add_metric_filter(resource)
23
31
  else
24
- puts "Warn: #{resource[:type]} is a unsuported resource type"
32
+ puts "Warn: #{resource.type} is a unsuported resource type"
25
33
  end
26
34
  end
27
-
28
- return @template
29
35
  end
30
-
31
- def add_alarm(resource)
36
+
37
+ def add_alarm(alarm)
38
+ actions = [Ref(alarm.alarm_action)]
39
+ actions.concat alarm.maintenance_groups.map {|mg| Ref(mg)} if alarm.maintenance_groups.any?
40
+
32
41
  @template.declare do
33
- CloudWatch_Alarm("#{resource[:resource_name]}#{resource[:class]}#{resource[:name]}#{resource[:type]}"[0..255]) do
42
+ CloudWatch_Alarm("#{alarm.resource_hash}#{alarm.group}#{alarm.name.gsub(/[^0-9a-zA-Z]/i, '')}#{alarm.type}"[0..255]) do
34
43
  ActionsEnabled true
35
- AlarmDescription "Guardian alarm #{resource[:class]} #{resource[:resource]} #{resource[:name]}"
36
- AlarmName "#{resource[:class]}-#{resource[:resource]}-#{resource[:name]}"
37
- ComparisonOperator resource[:comparison_operator]
38
- Dimensions resource[:dimensions].map {|k,v| {Name: k, Value: v}}
39
- EvaluationPeriods resource[:evaluation_periods]
40
- Statistic resource[:statistic]
41
- Period resource[:period]
42
- Threshold resource[:threshold]
43
- MetricName resource[:metric_name]
44
- Namespace resource[:namespace]
45
- AlarmActions [Ref(resource[:alarm_action])]
46
- OKActions [Ref(resource[:alarm_action])]
47
- TreatMissingData resource[:treat_missing_data] unless resource[:treat_missing_data].nil?
48
- DatapointsToAlarm resource[:datapoints_to_alarm] unless resource[:datapoints_to_alarm].nil?
49
- ExtendedStatistic resource[:extended_statistic] unless resource[:extended_statistic].nil?
50
- EvaluateLowSampleCountPercentile resource[:evaluate_low_sample_count_percentile] unless resource[:evaluate_low_sample_count_percentile].nil?
51
- Unit resource[:unit] unless resource[:unit].nil?
44
+ AlarmDescription "Guardian alarm #{alarm.name} for the resource #{alarm.resource_id} in alarm group #{alarm.group}"
45
+ AlarmName CfnGuardian::CloudWatch.get_alarm_name(alarm)
46
+ ComparisonOperator alarm.comparison_operator
47
+ Dimensions alarm.dimensions.map {|k,v| {Name: k, Value: v}} unless alarm.dimensions.nil?
48
+ EvaluationPeriods alarm.evaluation_periods
49
+ Statistic alarm.statistic
50
+ Period alarm.period
51
+ Threshold alarm.threshold
52
+ MetricName alarm.metric_name
53
+ Namespace alarm.namespace
54
+ AlarmActions actions
55
+ OKActions actions
56
+ TreatMissingData alarm.treat_missing_data unless alarm.treat_missing_data.nil?
57
+ DatapointsToAlarm alarm.datapoints_to_alarm unless alarm.datapoints_to_alarm.nil?
58
+ ExtendedStatistic alarm.extended_statistic unless alarm.extended_statistic.nil?
59
+ EvaluateLowSampleCountPercentile alarm.evaluate_low_sample_count_percentile unless alarm.evaluate_low_sample_count_percentile.nil?
60
+ Unit alarm.unit unless alarm.unit.nil?
52
61
  end
53
62
  end
54
63
  end
55
64
 
56
- def add_event(resource)
57
- @template.declare do
58
- Parameter(resource[:target]) do
59
- Type 'String'
60
- Description "Lamba funtion Arn for #{resource[:class]} #{resource[:type]}"
61
- end
62
-
63
- Events_Rule("#{resource[:class]}#{resource[:type]}#{resource[:hash]}"[0..255]) do
65
+ def add_event(event)
66
+ @template.declare do
67
+ Events_Rule("#{event.group}#{event.type}#{event.hash}"[0..255]) do
64
68
  State 'ENABLED'
65
- Description "Guardian scheduled #{resource[:class]} #{resource[:type]}"
66
- ScheduleExpression "cron(#{resource[:cron]})"
69
+ Description "Guardian scheduled #{event.group} #{event.type}"
70
+ ScheduleExpression "cron(#{event.cron})"
67
71
  Targets([
68
72
  {
69
- Arn: Ref(resource[:target]),
70
- Id: resource[:hash],
71
- Input: FnSub(resource[:payload])
73
+ Arn: Ref(event.target),
74
+ Id: event.hash,
75
+ Input: FnSub(event.payload)
76
+ }
77
+ ])
78
+ end
79
+ end
80
+ end
81
+
82
+ def add_composite_alarm(alarm)
83
+ @template.declare do
84
+ CloudWatch_CompositeAlarm(alarm.name.gsub(/[^0-9a-zA-Z]/i, '')) do
85
+
86
+ AlarmDescription alarm.description
87
+ AlarmName "guardian-#{alarm.name}"
88
+ AlarmRule alarm.rule
89
+
90
+ unless alarm.alarm_action.nil?
91
+ ActionsEnabled true
92
+ AlarmActions [Ref(alarm.alarm_action)]
93
+ # InsufficientDataActions [Ref(alarm.alarm_action)]
94
+ # OKActions [Ref(alarm.alarm_action)]
95
+ end
96
+
97
+ end
98
+ end
99
+ end
100
+
101
+ def add_metric_filter(filter)
102
+ @template.declare do
103
+ Logs_MetricFilter("#{filter.name.gsub(/[^0-9a-zA-Z]/i, '')}#{filter.type}") do
104
+ LogGroupName filter.log_group
105
+ FilterPattern filter.pattern
106
+ MetricTransformations([
107
+ {
108
+ MetricValue: filter.metric_value,
109
+ MetricName: filter.metric_name,
110
+ MetricNamespace: filter.metric_namespace
72
111
  }
73
112
  ])
74
113
  end
@@ -1,4 +1,6 @@
1
1
  class String
2
+ include Term::ANSIColor
3
+
2
4
  def to_underscore
3
5
  self.gsub(/::/, '/').
4
6
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
@@ -16,4 +18,14 @@ class String
16
18
  map(&:capitalize).join.
17
19
  gsub(/[^0-9A-Za-z]/, '')
18
20
  end
21
+
22
+ def to_heading
23
+ self.split('_').collect(&:capitalize).join(' ')
24
+ end
25
+
26
+ def word_wrap(with=100)
27
+ self.scan(/\S.{0,#{with}}\S(?=\s|$)|\S+/).
28
+ map {|line| line + "\n"}.
29
+ join('')
30
+ end
19
31
  end
@@ -1,4 +1,4 @@
1
1
  module CfnGuardian
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.3"
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.1.0
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guslington
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-20 00:00:00.000000000 Z
11
+ date: 2020-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -65,7 +65,7 @@ dependencies:
65
65
  - !ruby/object:Gem::Version
66
66
  version: '2'
67
67
  - !ruby/object:Gem::Dependency
68
- name: aws-sdk-s3
68
+ name: term-ansicolor
69
69
  requirement: !ruby/object:Gem::Requirement
70
70
  requirements:
71
71
  - - "~>"
@@ -84,13 +84,33 @@ dependencies:
84
84
  - - "<"
85
85
  - !ruby/object:Gem::Version
86
86
  version: '2'
87
+ - !ruby/object:Gem::Dependency
88
+ name: aws-sdk-s3
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '1.60'
94
+ - - "<"
95
+ - !ruby/object:Gem::Version
96
+ version: '2'
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.60'
104
+ - - "<"
105
+ - !ruby/object:Gem::Version
106
+ version: '2'
87
107
  - !ruby/object:Gem::Dependency
88
108
  name: aws-sdk-cloudformation
89
109
  requirement: !ruby/object:Gem::Requirement
90
110
  requirements:
91
111
  - - "~>"
92
112
  - !ruby/object:Gem::Version
93
- version: '1'
113
+ version: '1.31'
94
114
  - - "<"
95
115
  - !ruby/object:Gem::Version
96
116
  version: '2'
@@ -100,7 +120,67 @@ dependencies:
100
120
  requirements:
101
121
  - - "~>"
102
122
  - !ruby/object:Gem::Version
103
- version: '1'
123
+ version: '1.31'
124
+ - - "<"
125
+ - !ruby/object:Gem::Version
126
+ version: '2'
127
+ - !ruby/object:Gem::Dependency
128
+ name: aws-sdk-cloudwatch
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '1.28'
134
+ - - "<"
135
+ - !ruby/object:Gem::Version
136
+ version: '2'
137
+ type: :runtime
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '1.28'
144
+ - - "<"
145
+ - !ruby/object:Gem::Version
146
+ version: '2'
147
+ - !ruby/object:Gem::Dependency
148
+ name: aws-sdk-codecommit
149
+ requirement: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: '1.28'
154
+ - - "<"
155
+ - !ruby/object:Gem::Version
156
+ version: '2'
157
+ type: :runtime
158
+ prerelease: false
159
+ version_requirements: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - "~>"
162
+ - !ruby/object:Gem::Version
163
+ version: '1.28'
164
+ - - "<"
165
+ - !ruby/object:Gem::Version
166
+ version: '2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: aws-sdk-codepipeline
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.28'
174
+ - - "<"
175
+ - !ruby/object:Gem::Version
176
+ version: '2'
177
+ type: :runtime
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - "~>"
182
+ - !ruby/object:Gem::Version
183
+ version: '1.28'
104
184
  - - "<"
105
185
  - !ruby/object:Gem::Version
106
186
  version: '2'
@@ -140,7 +220,9 @@ executables:
140
220
  extensions: []
141
221
  extra_rdoc_files: []
142
222
  files:
223
+ - ".dockerignore"
143
224
  - ".gitignore"
225
+ - Dockerfile
144
226
  - Gemfile
145
227
  - Gemfile.lock
146
228
  - LICENSE.txt
@@ -149,12 +231,20 @@ files:
149
231
  - cfn-guardian.gemspec
150
232
  - exe/cfn-guardian
151
233
  - lib/cfnguardian.rb
234
+ - lib/cfnguardian/cloudwatch.rb
235
+ - lib/cfnguardian/codecommit.rb
236
+ - lib/cfnguardian/codepipeline.rb
152
237
  - lib/cfnguardian/compile.rb
238
+ - lib/cfnguardian/config/defaults.yaml
153
239
  - lib/cfnguardian/deploy.rb
240
+ - lib/cfnguardian/display_formatter.rb
241
+ - lib/cfnguardian/drift.rb
154
242
  - lib/cfnguardian/log.rb
155
243
  - lib/cfnguardian/models/alarm.rb
156
244
  - lib/cfnguardian/models/check.rb
245
+ - lib/cfnguardian/models/composite.rb
157
246
  - lib/cfnguardian/models/event.rb
247
+ - lib/cfnguardian/models/metric_filter.rb
158
248
  - lib/cfnguardian/resources/amazonmq_broker.rb
159
249
  - lib/cfnguardian/resources/apigateway.rb
160
250
  - lib/cfnguardian/resources/application_targetgroup.rb
@@ -170,14 +260,21 @@ files:
170
260
  - lib/cfnguardian/resources/elastic_loadbalancer.rb
171
261
  - lib/cfnguardian/resources/elasticache_replication_group.rb
172
262
  - lib/cfnguardian/resources/http.rb
263
+ - lib/cfnguardian/resources/internal_http.rb
264
+ - lib/cfnguardian/resources/internal_port.rb
265
+ - lib/cfnguardian/resources/internal_sftp.rb
173
266
  - lib/cfnguardian/resources/lambda.rb
267
+ - lib/cfnguardian/resources/log_group.rb
174
268
  - lib/cfnguardian/resources/network_targetgroup.rb
175
269
  - lib/cfnguardian/resources/nrpe.rb
270
+ - lib/cfnguardian/resources/port.rb
176
271
  - lib/cfnguardian/resources/rds_cluster_instance.rb
177
272
  - lib/cfnguardian/resources/rds_instance.rb
178
273
  - lib/cfnguardian/resources/redshift_cluster.rb
274
+ - lib/cfnguardian/resources/sftp.rb
179
275
  - lib/cfnguardian/resources/sql.rb
180
276
  - lib/cfnguardian/resources/sqs_queue.rb
277
+ - lib/cfnguardian/resources/tls.rb
181
278
  - lib/cfnguardian/s3.rb
182
279
  - lib/cfnguardian/stacks/main.rb
183
280
  - lib/cfnguardian/stacks/resources.rb