cfn-guardian 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.
- checksums.yaml +7 -0
- data/.gitignore +12 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +52 -0
- data/LICENSE.txt +21 -0
- data/README.md +412 -0
- data/Rakefile +2 -0
- data/cfn-guardian.gemspec +39 -0
- data/exe/cfn-guardian +4 -0
- data/lib/cfnguardian.rb +146 -0
- data/lib/cfnguardian/compile.rb +116 -0
- data/lib/cfnguardian/deploy.rb +144 -0
- data/lib/cfnguardian/log.rb +40 -0
- data/lib/cfnguardian/models/alarm.rb +292 -0
- data/lib/cfnguardian/models/check.rb +114 -0
- data/lib/cfnguardian/models/event.rb +192 -0
- data/lib/cfnguardian/resources/amazonmq_broker.rb +45 -0
- data/lib/cfnguardian/resources/apigateway.rb +34 -0
- data/lib/cfnguardian/resources/application_targetgroup.rb +31 -0
- data/lib/cfnguardian/resources/autoscaling_group.rb +22 -0
- data/lib/cfnguardian/resources/base.rb +116 -0
- data/lib/cfnguardian/resources/cloudfront_distribution.rb +26 -0
- data/lib/cfnguardian/resources/domain_expiry.rb +30 -0
- data/lib/cfnguardian/resources/dynamodb_table.rb +48 -0
- data/lib/cfnguardian/resources/ec2_instance.rb +24 -0
- data/lib/cfnguardian/resources/ecs_cluster.rb +44 -0
- data/lib/cfnguardian/resources/ecs_service.rb +32 -0
- data/lib/cfnguardian/resources/elastic_file_system.rb +17 -0
- data/lib/cfnguardian/resources/elastic_loadbalancer.rb +26 -0
- data/lib/cfnguardian/resources/elasticache_replication_group.rb +45 -0
- data/lib/cfnguardian/resources/http.rb +49 -0
- data/lib/cfnguardian/resources/lambda.rb +38 -0
- data/lib/cfnguardian/resources/network_targetgroup.rb +31 -0
- data/lib/cfnguardian/resources/nrpe.rb +42 -0
- data/lib/cfnguardian/resources/rds_cluster_instance.rb +30 -0
- data/lib/cfnguardian/resources/rds_instance.rb +45 -0
- data/lib/cfnguardian/resources/redshift_cluster.rb +30 -0
- data/lib/cfnguardian/resources/sql.rb +37 -0
- data/lib/cfnguardian/resources/sqs_queue.rb +23 -0
- data/lib/cfnguardian/s3.rb +35 -0
- data/lib/cfnguardian/stacks/main.rb +149 -0
- data/lib/cfnguardian/stacks/resources.rb +80 -0
- data/lib/cfnguardian/string.rb +19 -0
- data/lib/cfnguardian/validate.rb +80 -0
- data/lib/cfnguardian/version.rb +4 -0
- metadata +215 -0
@@ -0,0 +1,149 @@
|
|
1
|
+
require 'cfndsl'
|
2
|
+
|
3
|
+
module CfnGuardian
|
4
|
+
module Stacks
|
5
|
+
class Main
|
6
|
+
include CfnDsl::CloudFormation
|
7
|
+
|
8
|
+
def build_template(stacks,checks)
|
9
|
+
@template = CloudFormation("Guardian main stack")
|
10
|
+
|
11
|
+
%w(Critical Warning Task Informational).each do |name|
|
12
|
+
parameter = @template.Parameter(name)
|
13
|
+
parameter.Type 'String'
|
14
|
+
parameter.Description "SNS topic ARN for #{name} notifications"
|
15
|
+
end
|
16
|
+
|
17
|
+
parameters = {
|
18
|
+
Critical: Ref(:Critical),
|
19
|
+
Warning: Ref(:Warning),
|
20
|
+
Task: Ref(:Task),
|
21
|
+
Informational: Ref(:Informational)
|
22
|
+
}
|
23
|
+
|
24
|
+
build_iam_role()
|
25
|
+
|
26
|
+
checks.each {|check| parameters["#{check[:name]}Function#{check[:environment]}"] = add_lambda(check)}
|
27
|
+
stacks.each {|stack| add_stack(stack['Name'],stack['TemplateURL'],parameters)}
|
28
|
+
|
29
|
+
return @template
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_iam_role()
|
33
|
+
@template.declare do
|
34
|
+
IAM_Role(:LambdaExecutionRole) do
|
35
|
+
AssumeRolePolicyDocument({
|
36
|
+
Version: '2012-10-17',
|
37
|
+
Statement: [{
|
38
|
+
Effect: 'Allow',
|
39
|
+
Principal: { Service: [ 'lambda.amazonaws.com' ] },
|
40
|
+
Action: [ 'sts:AssumeRole' ]
|
41
|
+
}]
|
42
|
+
})
|
43
|
+
Path '/'
|
44
|
+
Policies([
|
45
|
+
{
|
46
|
+
PolicyName: 'logging',
|
47
|
+
PolicyDocument: {
|
48
|
+
Version: '2012-10-17',
|
49
|
+
Statement: [{
|
50
|
+
Effect: 'Allow',
|
51
|
+
Action: [ 'logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents' ],
|
52
|
+
Resource: 'arn:aws:logs:*:*:*'
|
53
|
+
}]
|
54
|
+
}
|
55
|
+
},
|
56
|
+
{
|
57
|
+
PolicyName: 'metrics',
|
58
|
+
PolicyDocument: {
|
59
|
+
Version: '2012-10-17',
|
60
|
+
Statement: [{
|
61
|
+
Effect: 'Allow',
|
62
|
+
Action: [ 'cloudwatch:PutMetricData' ],
|
63
|
+
Resource: '*'
|
64
|
+
}]
|
65
|
+
}
|
66
|
+
},
|
67
|
+
{
|
68
|
+
PolicyName: 'attach-network-interface',
|
69
|
+
PolicyDocument: {
|
70
|
+
Version: '2012-10-17',
|
71
|
+
Statement: [{
|
72
|
+
Effect: 'Allow',
|
73
|
+
Action: [ 'ec2:CreateNetworkInterface', 'ec2:DescribeNetworkInterfaces', 'ec2:DeleteNetworkInterface' ],
|
74
|
+
Resource: '*'
|
75
|
+
}]
|
76
|
+
}
|
77
|
+
}
|
78
|
+
])
|
79
|
+
Tags([
|
80
|
+
{ Key: 'Name', Value: 'guardian-lambda-role' },
|
81
|
+
{ Key: 'Environment', Value: 'guardian' }
|
82
|
+
])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def add_lambda(check)
|
88
|
+
vpc_config = {}
|
89
|
+
|
90
|
+
if check.has_key?(:vpc)
|
91
|
+
@template.declare do
|
92
|
+
EC2_SecurityGroup("#{check[:name]}SecurityGroup#{check[:environment]}") do
|
93
|
+
VpcId check[:vpc]
|
94
|
+
GroupDescription "Guardian lambda function #{check[:class]} check"
|
95
|
+
Tags([
|
96
|
+
{ Key: 'Name', Value: "guardian-#{check[:name]}-#{check[:environment]}" },
|
97
|
+
{ Key: 'Environment', Value: 'guardian' }
|
98
|
+
])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
vpc_config[:SecurityGroupIds] = Ref("#{check[:name]}SecurityGroup#{check[:environment]}")
|
103
|
+
vpc_config[:SubnetIds] = check[:subnets]
|
104
|
+
end
|
105
|
+
|
106
|
+
@template.declare do
|
107
|
+
Lambda_Function("#{check[:name]}Function#{check[:environment]}") do
|
108
|
+
Code({
|
109
|
+
S3Bucket: FnSub("base2.lambda.${AWS::Region}"),
|
110
|
+
S3Key: "#{check[:package]}/#{check[:version]}/handler.zip"
|
111
|
+
})
|
112
|
+
Handler check[:handler]
|
113
|
+
MemorySize 128
|
114
|
+
Runtime check[:runtime]
|
115
|
+
Timeout 120
|
116
|
+
Role FnGetAtt(:LambdaExecutionRole, :Arn)
|
117
|
+
VpcConfig vpc_config unless vpc_config.empty?
|
118
|
+
Tags([
|
119
|
+
{ Key: 'Name', Value: "guardian-#{check[:name]}-#{check[:class]}" },
|
120
|
+
{ Key: 'Environment', Value: 'guardian' }
|
121
|
+
])
|
122
|
+
end
|
123
|
+
|
124
|
+
Lambda_Permission("#{check[:name]}Permissions#{check[:environment]}") do
|
125
|
+
FunctionName Ref("#{check[:name]}Function#{check[:environment]}")
|
126
|
+
Action 'lambda:InvokeFunction'
|
127
|
+
Principal 'events.amazonaws.com'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
return FnGetAtt("#{check[:name]}Function#{check[:environment]}", :Arn)
|
132
|
+
end
|
133
|
+
|
134
|
+
def add_stack(name,url,stack_parameters)
|
135
|
+
@template.declare do
|
136
|
+
CloudFormation_Stack(name) do
|
137
|
+
Parameters stack_parameters
|
138
|
+
TemplateURL url
|
139
|
+
TimeoutInMinutes 15
|
140
|
+
Tags([
|
141
|
+
{ Key: 'Name', Value: "guardian-stack-#{name}" }
|
142
|
+
])
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'cfndsl'
|
2
|
+
|
3
|
+
module CfnGuardian
|
4
|
+
module Stacks
|
5
|
+
class Resources
|
6
|
+
include CfnDsl::CloudFormation
|
7
|
+
|
8
|
+
def build_template(resources)
|
9
|
+
@template = CloudFormation("Guardian nested stack")
|
10
|
+
|
11
|
+
%w(Critical Warning Task Informational).each do |name|
|
12
|
+
parameter = @template.Parameter(name)
|
13
|
+
parameter.Type 'String'
|
14
|
+
parameter.Description "SNS topic ARN for #{name} notifications"
|
15
|
+
end
|
16
|
+
|
17
|
+
resources.each do |resource|
|
18
|
+
case resource[:type]
|
19
|
+
when 'Alarm'
|
20
|
+
add_alarm(resource)
|
21
|
+
when 'Event'
|
22
|
+
add_event(resource)
|
23
|
+
else
|
24
|
+
puts "Warn: #{resource[:type]} is a unsuported resource type"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
return @template
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_alarm(resource)
|
32
|
+
@template.declare do
|
33
|
+
CloudWatch_Alarm("#{resource[:resource_name]}#{resource[:class]}#{resource[:name]}#{resource[:type]}"[0..255]) do
|
34
|
+
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?
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
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
|
64
|
+
State 'ENABLED'
|
65
|
+
Description "Guardian scheduled #{resource[:class]} #{resource[:type]}"
|
66
|
+
ScheduleExpression "cron(#{resource[:cron]})"
|
67
|
+
Targets([
|
68
|
+
{
|
69
|
+
Arn: Ref(resource[:target]),
|
70
|
+
Id: resource[:hash],
|
71
|
+
Input: FnSub(resource[:payload])
|
72
|
+
}
|
73
|
+
])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class String
|
2
|
+
def to_underscore
|
3
|
+
self.gsub(/::/, '/').
|
4
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
5
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
6
|
+
tr("-", "_").
|
7
|
+
downcase
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_camelcase
|
11
|
+
self.split('_').collect(&:capitalize).join
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_resource_name
|
15
|
+
self.split(/(\.|-|_)/).
|
16
|
+
map(&:capitalize).join.
|
17
|
+
gsub(/[^0-9A-Za-z]/, '')
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'aws-sdk-cloudformation'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'cfnguardian/version'
|
4
|
+
require 'cfnguardian/log'
|
5
|
+
require 'cfnguardian/s3'
|
6
|
+
|
7
|
+
module CfnGuardian
|
8
|
+
class Validate
|
9
|
+
include Logging
|
10
|
+
|
11
|
+
def initialize(bucket)
|
12
|
+
@bucket = bucket
|
13
|
+
@prefix = "validation"
|
14
|
+
@client = Aws::CloudFormation::Client.new()
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate()
|
18
|
+
success = []
|
19
|
+
Dir["out/*.yaml"].each do |template|
|
20
|
+
file_size_bytes = File.size(template)
|
21
|
+
|
22
|
+
if file_size_bytes > 51200
|
23
|
+
success << validate_s3(template)
|
24
|
+
else
|
25
|
+
success << validate_local(template)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
return success.include?(false)
|
29
|
+
end
|
30
|
+
|
31
|
+
def validate_local(path)
|
32
|
+
logger.info "Validating template #{path} locally"
|
33
|
+
template = File.read path
|
34
|
+
begin
|
35
|
+
response = @client.validate_template({
|
36
|
+
template_body: template
|
37
|
+
})
|
38
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
39
|
+
logger.warn("template #{path} failed validation with error:\n====> #{e.message}")
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_s3(path)
|
46
|
+
success = true
|
47
|
+
logger.info "Validating template #{path} from s3 bucket #{@bucket}"
|
48
|
+
|
49
|
+
template = File.read path
|
50
|
+
md5 = Digest::MD5.hexdigest template
|
51
|
+
prefix = "#{@prefix}/#{md5}"
|
52
|
+
|
53
|
+
client = Aws::S3::Client.new()
|
54
|
+
client.put_object({
|
55
|
+
body: template,
|
56
|
+
bucket: @bucket,
|
57
|
+
key: prefix
|
58
|
+
})
|
59
|
+
logger.info("uploaded #{path} to s3://#{@bucket}/#{prefix}")
|
60
|
+
|
61
|
+
begin
|
62
|
+
response = @client.validate_template({
|
63
|
+
template_url: "https://#{@bucket}.s3.amazonaws.com/#{prefix}"
|
64
|
+
})
|
65
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
66
|
+
logger.warn("template #{path} failed validation with error:\n====> #{e.message}")
|
67
|
+
success = false
|
68
|
+
end
|
69
|
+
|
70
|
+
client.put_object({
|
71
|
+
bucket: @bucket,
|
72
|
+
key: prefix
|
73
|
+
})
|
74
|
+
logger.debug("removed validated template s3://#{@bucket}/#{prefix}")
|
75
|
+
|
76
|
+
return success
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,215 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cfn-guardian
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guslington
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.20'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.20'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: cfndsl
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '2'
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: terminal-table
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1'
|
54
|
+
- - "<"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '2'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '1'
|
64
|
+
- - "<"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '2'
|
67
|
+
- !ruby/object:Gem::Dependency
|
68
|
+
name: aws-sdk-s3
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '1'
|
74
|
+
- - "<"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '2'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '1'
|
84
|
+
- - "<"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '2'
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
name: aws-sdk-cloudformation
|
89
|
+
requirement: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - "~>"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '1'
|
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'
|
104
|
+
- - "<"
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '2'
|
107
|
+
- !ruby/object:Gem::Dependency
|
108
|
+
name: bundler
|
109
|
+
requirement: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - "~>"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '2.0'
|
114
|
+
type: :development
|
115
|
+
prerelease: false
|
116
|
+
version_requirements: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '2.0'
|
121
|
+
- !ruby/object:Gem::Dependency
|
122
|
+
name: rake
|
123
|
+
requirement: !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - "~>"
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '10.0'
|
128
|
+
type: :development
|
129
|
+
prerelease: false
|
130
|
+
version_requirements: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - "~>"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '10.0'
|
135
|
+
description: Manages AWS cloudwatch alarms with default templates using cloudformation
|
136
|
+
email:
|
137
|
+
- itsupport@base2services.com
|
138
|
+
executables:
|
139
|
+
- cfn-guardian
|
140
|
+
extensions: []
|
141
|
+
extra_rdoc_files: []
|
142
|
+
files:
|
143
|
+
- ".gitignore"
|
144
|
+
- Gemfile
|
145
|
+
- Gemfile.lock
|
146
|
+
- LICENSE.txt
|
147
|
+
- README.md
|
148
|
+
- Rakefile
|
149
|
+
- cfn-guardian.gemspec
|
150
|
+
- exe/cfn-guardian
|
151
|
+
- lib/cfnguardian.rb
|
152
|
+
- lib/cfnguardian/compile.rb
|
153
|
+
- lib/cfnguardian/deploy.rb
|
154
|
+
- lib/cfnguardian/log.rb
|
155
|
+
- lib/cfnguardian/models/alarm.rb
|
156
|
+
- lib/cfnguardian/models/check.rb
|
157
|
+
- lib/cfnguardian/models/event.rb
|
158
|
+
- lib/cfnguardian/resources/amazonmq_broker.rb
|
159
|
+
- lib/cfnguardian/resources/apigateway.rb
|
160
|
+
- lib/cfnguardian/resources/application_targetgroup.rb
|
161
|
+
- lib/cfnguardian/resources/autoscaling_group.rb
|
162
|
+
- lib/cfnguardian/resources/base.rb
|
163
|
+
- lib/cfnguardian/resources/cloudfront_distribution.rb
|
164
|
+
- lib/cfnguardian/resources/domain_expiry.rb
|
165
|
+
- lib/cfnguardian/resources/dynamodb_table.rb
|
166
|
+
- lib/cfnguardian/resources/ec2_instance.rb
|
167
|
+
- lib/cfnguardian/resources/ecs_cluster.rb
|
168
|
+
- lib/cfnguardian/resources/ecs_service.rb
|
169
|
+
- lib/cfnguardian/resources/elastic_file_system.rb
|
170
|
+
- lib/cfnguardian/resources/elastic_loadbalancer.rb
|
171
|
+
- lib/cfnguardian/resources/elasticache_replication_group.rb
|
172
|
+
- lib/cfnguardian/resources/http.rb
|
173
|
+
- lib/cfnguardian/resources/lambda.rb
|
174
|
+
- lib/cfnguardian/resources/network_targetgroup.rb
|
175
|
+
- lib/cfnguardian/resources/nrpe.rb
|
176
|
+
- lib/cfnguardian/resources/rds_cluster_instance.rb
|
177
|
+
- lib/cfnguardian/resources/rds_instance.rb
|
178
|
+
- lib/cfnguardian/resources/redshift_cluster.rb
|
179
|
+
- lib/cfnguardian/resources/sql.rb
|
180
|
+
- lib/cfnguardian/resources/sqs_queue.rb
|
181
|
+
- lib/cfnguardian/s3.rb
|
182
|
+
- lib/cfnguardian/stacks/main.rb
|
183
|
+
- lib/cfnguardian/stacks/resources.rb
|
184
|
+
- lib/cfnguardian/string.rb
|
185
|
+
- lib/cfnguardian/validate.rb
|
186
|
+
- lib/cfnguardian/version.rb
|
187
|
+
homepage: https://github.com/base2Services/cfn-guardian
|
188
|
+
licenses:
|
189
|
+
- MIT
|
190
|
+
metadata:
|
191
|
+
allowed_push_host: https://rubygems.org
|
192
|
+
homepage_uri: https://github.com/base2Services/cfn-guardian
|
193
|
+
source_code_uri: https://github.com/base2Services/cfn-guardian
|
194
|
+
changelog_uri: https://github.com/base2Services/cfn-guardian
|
195
|
+
post_install_message:
|
196
|
+
rdoc_options: []
|
197
|
+
require_paths:
|
198
|
+
- lib
|
199
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
204
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - ">="
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
209
|
+
requirements: []
|
210
|
+
rubyforge_project:
|
211
|
+
rubygems_version: 2.7.6
|
212
|
+
signing_key:
|
213
|
+
specification_version: 4
|
214
|
+
summary: Manages AWS cloudwatch alarms with default templates using cloudformation
|
215
|
+
test_files: []
|