cfn_manage 0.2.7 → 0.2.8
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 +5 -5
- data/bin/cfn_manage.rb +4 -0
- data/bin/usage.txt +8 -1
- data/lib/aws_credentials.rb +1 -1
- data/lib/cf_progress_tracker.rb +1 -1
- data/lib/cf_start_stop_environment.rb +51 -25
- data/lib/dynamodb_start_stop_handler.rb +53 -0
- metadata +147 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3d8a7ed727a31e5b2a377abd2cedf2e1e9dedd1ec5225d3a6e5c2c85f6f402b6
|
4
|
+
data.tar.gz: fb0c0023eb68cad7f4c11659100a9088574ba36f6ec108d8c93b01c83960fcf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4960e7f832c1463219ab949edcb2642f3079ff8eda2cfbc5f0b2c301c45e3c6607a2f02cfb999396aad4c3b4ab1e492faa2ceb7458421cff5042484ea1f81f45
|
7
|
+
data.tar.gz: bd52ce9e9d80cce6c50e841911861f10ee841701dd50f97651bab2d0e8427da499d532c5c74decbf5f0f53d0c51b81caeec1fe33e64d5616a33b6ed7e6724d24
|
data/bin/cfn_manage.rb
CHANGED
data/bin/usage.txt
CHANGED
@@ -39,4 +39,11 @@ General options
|
|
39
39
|
|
40
40
|
Applicable only to [start|stop-environment] commands. If dry run is enabled
|
41
41
|
info about assets being started / stopped will ne only printed to standard output,
|
42
|
-
without any action taken.
|
42
|
+
without any action taken.
|
43
|
+
|
44
|
+
--continue-on-error
|
45
|
+
|
46
|
+
Applicable only to [start|stop-environment] commands. If there is problem with stopping a resource,
|
47
|
+
(e.g. cloudformation stack not being synced or manual resource deletion) script will continue it's
|
48
|
+
operation. By defult script stops when there is problem with starting/stopping resource, and expects
|
49
|
+
manual intervention to fix the root cause for failure.
|
data/lib/aws_credentials.rb
CHANGED
data/lib/cf_progress_tracker.rb
CHANGED
@@ -1,4 +1,11 @@
|
|
1
|
-
require 'aws-sdk'
|
1
|
+
require 'aws-sdk-ec2'
|
2
|
+
require 'aws-sdk-s3'
|
3
|
+
require 'aws-sdk-ec2'
|
4
|
+
require 'aws-sdk-cloudformation'
|
5
|
+
require 'aws-sdk-rds'
|
6
|
+
require 'aws-sdk-cloudwatch'
|
7
|
+
require 'aws-sdk-autoscaling'
|
8
|
+
|
2
9
|
require_relative '../lib/cf_common'
|
3
10
|
require_relative '../lib/aws_credentials'
|
4
11
|
require 'json'
|
@@ -33,6 +40,7 @@ module Base2
|
|
33
40
|
@cf_client = Aws::CloudFormation::Client.new(credentials: @credentials, retry_limit: 20)
|
34
41
|
end
|
35
42
|
@dry_run = (ENV.key?('DRY_RUN') and ENV['DRY_RUN'] == '1')
|
43
|
+
@continue_on_error = (ENV.key? 'CFN_CONTINUE_ON_ERROR' and ENV['CFN_CONTINUE_ON_ERROR'] == '1')
|
36
44
|
end
|
37
45
|
|
38
46
|
|
@@ -41,7 +49,7 @@ module Base2
|
|
41
49
|
Common.visit_stack(@cf_client, stack_name, method(:collect_resources), true)
|
42
50
|
do_start_assets
|
43
51
|
configuration = { stack_running: true }
|
44
|
-
save_item_configuration("
|
52
|
+
save_item_configuration("environment_data/stack-#{stack_name}", configuration) unless @dry_run
|
45
53
|
$log.info("Environment #{stack_name} started")
|
46
54
|
end
|
47
55
|
|
@@ -51,7 +59,7 @@ module Base2
|
|
51
59
|
Common.visit_stack(@cf_client, stack_name, method(:collect_resources), true)
|
52
60
|
do_stop_assets
|
53
61
|
configuration = { stack_running: false }
|
54
|
-
save_item_configuration("
|
62
|
+
save_item_configuration("environment_data/stack-#{stack_name}", configuration) unless @dry_run
|
55
63
|
$log.info("Environment #{stack_name} stopped")
|
56
64
|
end
|
57
65
|
|
@@ -61,17 +69,26 @@ module Base2
|
|
61
69
|
@environment_resources = @environment_resources.sort_by { |k| k[:priority] }.reverse
|
62
70
|
|
63
71
|
@environment_resources.each do |resource|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
72
|
+
begin
|
73
|
+
$log.info("Stopping resource #{resource[:id]}")
|
74
|
+
# just print out information if running a dry run, otherwise start assets
|
75
|
+
if not @dry_run
|
76
|
+
configuration = resource[:handler].stop()
|
77
|
+
if configuration.class == Hash
|
78
|
+
s3_prefix = "environment_data/resource/#{resource[:id]}"
|
79
|
+
save_item_configuration(s3_prefix, configuration)
|
80
|
+
end
|
81
|
+
else
|
82
|
+
$log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
|
83
|
+
$log.debug("Resource type: #{resource[:type]}\n\n")
|
84
|
+
end
|
85
|
+
rescue => e
|
86
|
+
$log.error("An exception occurred during stop operation against resource #{resource[:id]}")
|
87
|
+
$log.error("#{e.to_s}")
|
88
|
+
$log.error(e.backtrace.join("\n\t"))
|
89
|
+
if not @continue_on_error
|
90
|
+
raise e
|
71
91
|
end
|
72
|
-
else
|
73
|
-
$log.info("Dry run enabled, skipping stop start\nFollowing resource would be stopped: #{resource[:id]}")
|
74
|
-
$log.debug("Resource type: #{resource[:type]}\n\n")
|
75
92
|
end
|
76
93
|
end
|
77
94
|
end
|
@@ -81,18 +98,27 @@ module Base2
|
|
81
98
|
@environment_resources = @environment_resources.sort_by { |k| k[:priority] }
|
82
99
|
|
83
100
|
@environment_resources.each do |resource|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
101
|
+
begin
|
102
|
+
$log.info("Starting resource #{resource[:id]}")
|
103
|
+
# just print out information if running a dry run, otherwise start assets
|
104
|
+
if not @dry_run
|
105
|
+
# read configuration
|
106
|
+
s3_prefix = "environment_data/resource/#{resource[:id]}"
|
107
|
+
configuration = get_object_configuration(s3_prefix)
|
108
|
+
|
109
|
+
# start
|
110
|
+
resource[:handler].start(configuration)
|
111
|
+
else
|
112
|
+
$log.info("Dry run enabled, skipping actual start\nFollowing resource would be started: #{resource[:id]}")
|
113
|
+
$log.debug("Resource type: #{resource[:type]}\n\n")
|
114
|
+
end
|
115
|
+
rescue => e
|
116
|
+
$log.error("An exception occurred during start operation against resource #{resource[:id]}")
|
117
|
+
$log.error("#{e.to_s}")
|
118
|
+
$log.error(e.backtrace.join("\n\t"))
|
119
|
+
if not @continue_on_error
|
120
|
+
raise e
|
121
|
+
end
|
96
122
|
end
|
97
123
|
end
|
98
124
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../lib/aws_credentials'
|
2
|
+
|
3
|
+
module Base2
|
4
|
+
|
5
|
+
class DynamoDbStartStopHandler
|
6
|
+
|
7
|
+
@table
|
8
|
+
@table_name
|
9
|
+
@gsi_names
|
10
|
+
|
11
|
+
def initialize(table_name)
|
12
|
+
credentials = Base2::AWSCredentials.get_session_credentials("stoprun_#{instance_id}")
|
13
|
+
ec2_client = Aws::DynamoDB::Client.new(credentials: credentials)
|
14
|
+
@table = Aws::DynamoDB::Resource.new(client: ec2_client).table(table_name)
|
15
|
+
@table_name = table_name
|
16
|
+
@table.global_secondary_indexes.each do |gsi|
|
17
|
+
@gsi_names << gsi.index_name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def start(configuration)
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def stop
|
26
|
+
configuration = {
|
27
|
+
read_capacity: @table.provisioned_throughput.read_capacity_units,
|
28
|
+
write_capacity: @table.provisioned_throughput.write_capacity_units
|
29
|
+
}
|
30
|
+
|
31
|
+
$log.info("Current dynamo table #{@table.name} capacity: #{configuration}")
|
32
|
+
|
33
|
+
# check if environment vairable set for
|
34
|
+
if ENV.key? ('cfn_manage_dynamodb_stop_capacity')
|
35
|
+
stop_capacity = ENV['cfn_manage_dynamodb_stop_capacity'].to_i
|
36
|
+
|
37
|
+
$log.info("Downsizing read/write capacity to #{stop_capacity}")
|
38
|
+
@table.update({
|
39
|
+
provisioned_throughput: {
|
40
|
+
read_capacity_units: stop_capacity, # required
|
41
|
+
write_capacity_units: stop_capacity, # required
|
42
|
+
}
|
43
|
+
})
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
configuration
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cfn_manage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Base2Services
|
@@ -9,13 +9,13 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-04-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name: aws-sdk
|
15
|
+
name: aws-sdk-core
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '3'
|
21
21
|
- - "<"
|
@@ -25,12 +25,152 @@ dependencies:
|
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "
|
28
|
+
- - "~>"
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: '3'
|
31
31
|
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '4'
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: aws-sdk-s3
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1'
|
41
|
+
- - "<"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '1'
|
51
|
+
- - "<"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: aws-sdk-ec2
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1'
|
61
|
+
- - "<"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '2'
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1'
|
71
|
+
- - "<"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '2'
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: aws-sdk-cloudformation
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '1'
|
81
|
+
- - "<"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '2'
|
84
|
+
type: :runtime
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '1'
|
91
|
+
- - "<"
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '2'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: aws-sdk-rds
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '1'
|
101
|
+
- - "<"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1'
|
111
|
+
- - "<"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '2'
|
114
|
+
- !ruby/object:Gem::Dependency
|
115
|
+
name: aws-sdk-cloudwatch
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '1'
|
121
|
+
- - "<"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '2'
|
124
|
+
type: :runtime
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1'
|
131
|
+
- - "<"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '2'
|
134
|
+
- !ruby/object:Gem::Dependency
|
135
|
+
name: aws-sdk-iam
|
136
|
+
requirement: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '1'
|
141
|
+
- - "<"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '2'
|
144
|
+
type: :runtime
|
145
|
+
prerelease: false
|
146
|
+
version_requirements: !ruby/object:Gem::Requirement
|
147
|
+
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '1'
|
151
|
+
- - "<"
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '2'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: aws-sdk-autoscaling
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '1'
|
161
|
+
- - "<"
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '2'
|
164
|
+
type: :runtime
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - "~>"
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '1'
|
171
|
+
- - "<"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '2'
|
34
174
|
description: ''
|
35
175
|
email: itsupport@base2services.com
|
36
176
|
executables:
|
@@ -47,6 +187,7 @@ files:
|
|
47
187
|
- lib/cf_common.rb
|
48
188
|
- lib/cf_progress_tracker.rb
|
49
189
|
- lib/cf_start_stop_environment.rb
|
190
|
+
- lib/dynamodb_start_stop_handler.rb
|
50
191
|
- lib/ec2_start_stop_handler.rb
|
51
192
|
- lib/rds_start_stop_handler.rb
|
52
193
|
- lib/start_stop_handler_factory.rb
|
@@ -70,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
211
|
version: '0'
|
71
212
|
requirements: []
|
72
213
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.6
|
214
|
+
rubygems_version: 2.7.6
|
74
215
|
signing_key:
|
75
216
|
specification_version: 4
|
76
217
|
summary: Manage AWS Cloud Formation stacks
|