cfn_monitor 0.1.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.
@@ -0,0 +1,138 @@
1
+ require 'cfndsl'
2
+
3
+ CloudFormation do
4
+ Description("CloudWatch Services")
5
+
6
+ Parameter("EnvironmentName"){
7
+ Type 'String'
8
+ }
9
+
10
+ Resource("ServicesCheckLambdaExecutionRole") do
11
+ Type 'AWS::IAM::Role'
12
+ Property('AssumeRolePolicyDocument', {
13
+ Version: '2012-10-17',
14
+ Statement: [{
15
+ Effect: 'Allow',
16
+ Principal: { Service: [ 'lambda.amazonaws.com' ] },
17
+ Action: [ 'sts:AssumeRole' ]
18
+ }]
19
+ })
20
+ Property('Path','/')
21
+ Property('Policies', [
22
+ PolicyName: 'ServicesCheck',
23
+ PolicyDocument: {
24
+ Version: '2012-10-17',
25
+ Statement: [{
26
+ Effect: 'Allow',
27
+ Action: [ 'logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents' ],
28
+ Resource: 'arn:aws:logs:*:*:*'
29
+ },
30
+ {
31
+ Effect: 'Allow',
32
+ Action: [ 'cloudwatch:PutMetricData' ],
33
+ Resource: '*'
34
+ },
35
+ {
36
+ Effect: 'Allow',
37
+ Action: [ 'ssm:SendCommand', 'ssm:ListCommandInvocations', 'ssm:DescribeInstanceInformation' ],
38
+ Resource: '*'
39
+ },
40
+ {
41
+ Effect: 'Allow',
42
+ Action: [ 'autoscaling:SetInstanceHealth', 'autoscaling:DescribeAutoScalingInstances', 'ec2:DescribeInstances' ],
43
+ Resource: '*'
44
+ }]
45
+ }
46
+ ])
47
+ end
48
+
49
+ Resource("ServicesCheckFunction") do
50
+ Type 'AWS::Lambda::Function'
51
+ Property('Code', { S3Bucket: FnJoin('.',['base2.lambda',Ref('AWS::Region')]), S3Key: 'check-service.zip' })
52
+ Property('Handler', 'handler.check_service')
53
+ Property('MemorySize', 128)
54
+ Property('Runtime', 'python3.6')
55
+ Property('Timeout', 300)
56
+ Property('Role', FnGetAtt("ServicesCheckLambdaExecutionRole",'Arn'))
57
+ end
58
+
59
+ Resource("ServicesCheckPermissions") do
60
+ Type 'AWS::Lambda::Permission'
61
+ Property('FunctionName', Ref("ServicesCheckFunction"))
62
+ Property('Action', 'lambda:InvokeFunction')
63
+ Property('Principal', 'events.amazonaws.com')
64
+ end
65
+
66
+ SSM_Document('ServiceCheck') do
67
+ Content ({
68
+ schemaVersion: "2.2",
69
+ description: "Check status of a running services using the service command",
70
+ parameters: {
71
+ Process: {
72
+ type: "String",
73
+ description: "process name to check",
74
+ default: ""
75
+ }
76
+ },
77
+ mainSteps: [ {
78
+ action: "aws:runShellScript",
79
+ name: "checkProcess",
80
+ inputs: {
81
+ runCommand: [ "service {{Process}} status" ]
82
+ }
83
+ } ]
84
+ })
85
+ DocumentType 'Command'
86
+ end
87
+
88
+ alarms.each do |alarm|
89
+ if alarm[:type] == 'service'
90
+ servicesHash = Digest::MD5.hexdigest alarm[:resource]
91
+
92
+ # Conditionally create shedule based on environments attribute
93
+ if alarm[:environments] != ['all']
94
+ conditions = []
95
+ alarm[:environments].each do | env |
96
+ conditions << FnEquals(Ref("EnvironmentName"),env)
97
+ end
98
+ if conditions.length > 1
99
+ Condition("Condition#{servicesHash}", FnOr(conditions))
100
+ else
101
+ Condition("Condition#{servicesHash}", conditions[0])
102
+ end
103
+ end
104
+
105
+ # Set defaults
106
+ services = alarm[:parameters]
107
+ services['scheduleExpression'] ||= "* * * * ? *"
108
+
109
+ # Create payload
110
+ payload = {}
111
+ payload['SERVICE'] = alarm[:resource]
112
+ payload['ENVIRONMENT'] = "${env}"
113
+ payload['REGION'] = "${region}"
114
+ payload['REPORT_FAILED_SSM_AGENT'] = services['ReportFailedSSMAgent'] ||= false
115
+ payload['TERMINATE_ON_FAILURE'] = services['TerminateOnFailure'] ||= false
116
+ payload['SSM_DOCUMENT'] = Ref('ServiceCheck')
117
+ # TODO: auto discovery of autoscaling groups based on cf logical resource id
118
+ # payload['AUTOSCALING_GROUP'] = []
119
+
120
+ Resource("ServicesCheckSchedule#{servicesHash}") do
121
+ Condition "Condition#{servicesHash}" if alarm[:environments] != ['all']
122
+ Type 'AWS::Events::Rule'
123
+ Property('Description', FnSub( "${env}-Service-Check-#{alarm[:resource]}", env: Ref('EnvironmentName') ) )
124
+ Property('ScheduleExpression', "cron(#{services['scheduleExpression']})")
125
+ Property('State', 'ENABLED')
126
+ Property('Targets', [
127
+ {
128
+ Arn: FnGetAtt("ServicesCheckFunction",'Arn'),
129
+ Id: servicesHash,
130
+ Input: FnSub( payload.to_json, env: Ref('EnvironmentName'), region: Ref("AWS::Region") )
131
+ }
132
+ ])
133
+ end
134
+
135
+ end
136
+ end
137
+
138
+ end
metadata ADDED
@@ -0,0 +1,250 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cfn_monitor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Base2Services
8
+ - Jared Brook
9
+ - Angus Vine
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2018-10-25 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thor
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '0.19'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.19'
29
+ - !ruby/object:Gem::Dependency
30
+ name: cfndsl
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '0.16'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '0.16'
43
+ - !ruby/object:Gem::Dependency
44
+ name: aws-sdk-cloudformation
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '2'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1'
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2'
63
+ - !ruby/object:Gem::Dependency
64
+ name: aws-sdk-s3
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1'
70
+ - - "<"
71
+ - !ruby/object:Gem::Version
72
+ version: '2'
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '1'
80
+ - - "<"
81
+ - !ruby/object:Gem::Version
82
+ version: '2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk-elasticloadbalancingv2
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1'
90
+ - - "<"
91
+ - !ruby/object:Gem::Version
92
+ version: '2'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '1'
100
+ - - "<"
101
+ - !ruby/object:Gem::Version
102
+ version: '2'
103
+ - !ruby/object:Gem::Dependency
104
+ name: bundler
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.16'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.16'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '10.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '10.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rspec
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.9'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.9'
145
+ - !ruby/object:Gem::Dependency
146
+ name: rspec-core
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.8'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '3.8'
159
+ - !ruby/object:Gem::Dependency
160
+ name: rspec-expectations
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '3.8'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.8'
173
+ - !ruby/object:Gem::Dependency
174
+ name: rspec-mocks
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.8'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '3.8'
187
+ description: |-
188
+ CloudWatch monitoring tool can query a cloudformation stack and return
189
+ monitorable resources that can be placed into a config file. This config
190
+ can then be used to generate a cloudformation stack to create and manage
191
+ cloudwatch alarms.
192
+ email:
193
+ - itsupport@base2services.com
194
+ executables:
195
+ - cfn_monitor
196
+ extensions: []
197
+ extra_rdoc_files: []
198
+ files:
199
+ - ".gitignore"
200
+ - ".rspec"
201
+ - ".travis.yml"
202
+ - Dockerfile
203
+ - Gemfile
204
+ - LICENSE.txt
205
+ - README.md
206
+ - Rakefile
207
+ - cfn_monitor.gemspec
208
+ - exe/cfn_monitor
209
+ - lib/cfn_monitor.rb
210
+ - lib/cfn_monitor/deploy.rb
211
+ - lib/cfn_monitor/generate.rb
212
+ - lib/cfn_monitor/query.rb
213
+ - lib/cfn_monitor/utils.rb
214
+ - lib/cfn_monitor/version.rb
215
+ - lib/config/config.yml
216
+ - lib/config/templates.yml
217
+ - lib/ext/alarms.rb
218
+ - lib/lambda/getEnvironmentName.py
219
+ - lib/lambda/getPhysicalId.py
220
+ - lib/templates/alarms.rb
221
+ - lib/templates/endpoints.rb
222
+ - lib/templates/hosts.rb
223
+ - lib/templates/master.rb
224
+ - lib/templates/resources.rb
225
+ - lib/templates/services.rb
226
+ homepage: https://github.com/base2Services/cfn-monitor/blob/master/README.md
227
+ licenses:
228
+ - MIT
229
+ metadata: {}
230
+ post_install_message:
231
+ rdoc_options: []
232
+ require_paths:
233
+ - lib
234
+ required_ruby_version: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ">="
237
+ - !ruby/object:Gem::Version
238
+ version: '0'
239
+ required_rubygems_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ requirements: []
245
+ rubyforge_project:
246
+ rubygems_version: 2.7.7
247
+ signing_key:
248
+ specification_version: 4
249
+ summary: Configure and generate a cloudwatch monitoring cloudformation stack
250
+ test_files: []