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.
- checksums.yaml +4 -4
- data/.dockerignore +1 -0
- data/Dockerfile +19 -0
- data/Gemfile.lock +31 -13
- data/README.md +441 -42
- data/cfn-guardian.gemspec +6 -2
- data/lib/cfnguardian.rb +301 -27
- data/lib/cfnguardian/cloudwatch.rb +121 -0
- data/lib/cfnguardian/codecommit.rb +54 -0
- data/lib/cfnguardian/codepipeline.rb +138 -0
- data/lib/cfnguardian/compile.rb +58 -17
- data/lib/cfnguardian/config/defaults.yaml +94 -0
- data/lib/cfnguardian/display_formatter.rb +164 -0
- data/lib/cfnguardian/drift.rb +79 -0
- data/lib/cfnguardian/log.rb +0 -1
- data/lib/cfnguardian/models/alarm.rb +98 -36
- data/lib/cfnguardian/models/check.rb +103 -26
- data/lib/cfnguardian/models/composite.rb +21 -0
- data/lib/cfnguardian/models/event.rb +164 -40
- data/lib/cfnguardian/models/metric_filter.rb +28 -0
- data/lib/cfnguardian/resources/application_targetgroup.rb +2 -0
- data/lib/cfnguardian/resources/base.rb +38 -16
- data/lib/cfnguardian/resources/ecs_service.rb +2 -2
- data/lib/cfnguardian/resources/http.rb +16 -1
- data/lib/cfnguardian/resources/internal_http.rb +74 -0
- data/lib/cfnguardian/resources/internal_port.rb +33 -0
- data/lib/cfnguardian/resources/internal_sftp.rb +58 -0
- data/lib/cfnguardian/resources/log_group.rb +26 -0
- data/lib/cfnguardian/resources/network_targetgroup.rb +1 -0
- data/lib/cfnguardian/resources/port.rb +25 -0
- data/lib/cfnguardian/resources/rds_instance.rb +2 -0
- data/lib/cfnguardian/resources/sftp.rb +50 -0
- data/lib/cfnguardian/resources/sql.rb +1 -1
- data/lib/cfnguardian/resources/tls.rb +66 -0
- data/lib/cfnguardian/s3.rb +3 -2
- data/lib/cfnguardian/stacks/main.rb +86 -65
- data/lib/cfnguardian/stacks/resources.rb +81 -42
- data/lib/cfnguardian/string.rb +12 -0
- data/lib/cfnguardian/version.rb +1 -1
- 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
|
-
|
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
|
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
|
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(
|
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("#{
|
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 #{
|
36
|
-
AlarmName
|
37
|
-
ComparisonOperator
|
38
|
-
Dimensions
|
39
|
-
EvaluationPeriods
|
40
|
-
Statistic
|
41
|
-
Period
|
42
|
-
Threshold
|
43
|
-
MetricName
|
44
|
-
Namespace
|
45
|
-
AlarmActions
|
46
|
-
OKActions
|
47
|
-
TreatMissingData
|
48
|
-
DatapointsToAlarm
|
49
|
-
ExtendedStatistic
|
50
|
-
EvaluateLowSampleCountPercentile
|
51
|
-
Unit
|
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(
|
57
|
-
@template.declare do
|
58
|
-
|
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 #{
|
66
|
-
ScheduleExpression "cron(#{
|
69
|
+
Description "Guardian scheduled #{event.group} #{event.type}"
|
70
|
+
ScheduleExpression "cron(#{event.cron})"
|
67
71
|
Targets([
|
68
72
|
{
|
69
|
-
Arn: Ref(
|
70
|
-
Id:
|
71
|
-
Input: FnSub(
|
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
|
data/lib/cfnguardian/string.rb
CHANGED
@@ -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
|
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.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-
|
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:
|
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
|