cfndk 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +23 -14
- data/.gitignore +0 -1
- data/.rspec_parallel +6 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +811 -0
- data/README.md +122 -10
- data/cfndk.gemspec +1 -0
- data/lib/cfndk/change_set_command.rb +97 -0
- data/lib/cfndk/command.rb +15 -181
- data/lib/cfndk/config_file_loadable.rb +13 -0
- data/lib/cfndk/global_config.rb +15 -0
- data/lib/cfndk/key_pair.rb +7 -4
- data/lib/cfndk/key_pair_command.rb +53 -0
- data/lib/cfndk/key_pairs.rb +2 -1
- data/lib/cfndk/logger.rb +1 -1
- data/lib/cfndk/stack.rb +382 -103
- data/lib/cfndk/stack_command.rb +110 -0
- data/lib/cfndk/stacks.rb +40 -14
- data/lib/cfndk/subcommand_help_returnable.rb +16 -0
- data/lib/cfndk/version.rb +1 -1
- data/lib/cfndk.rb +6 -0
- data/skel/cfndk.yml +4 -0
- data/spec/cfndk_change_set_create_spec.rb +436 -0
- data/spec/cfndk_change_set_destroy_spec.rb +160 -0
- data/spec/cfndk_change_set_execute_spec.rb +179 -0
- data/spec/cfndk_change_set_report_spec.rb +107 -0
- data/spec/cfndk_change_set_spec.rb +37 -0
- data/spec/cfndk_create_spec.rb +56 -141
- data/spec/cfndk_destroy_spec.rb +4 -2
- data/spec/cfndk_keypiar_spec.rb +11 -9
- data/spec/cfndk_report_spec.rb +3 -1
- data/spec/cfndk_spec.rb +5 -3
- data/spec/cfndk_stack_create_spec.rb +454 -0
- data/spec/cfndk_stack_destroy_spec.rb +161 -0
- data/spec/cfndk_stack_report_spec.rb +181 -0
- data/spec/cfndk_stack_spec.rb +6 -1146
- data/spec/cfndk_stack_update_spec.rb +467 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/support/aruba.rb +1 -0
- metadata +42 -2
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
This is easy operation/integration support tool for AWS CloudFormation.
|
4
4
|
|
5
|
+
[![CircleCI](https://circleci.com/gh/Amakata/cfndk/tree/master.svg?style=svg)](https://circleci.com/gh/Amakata/cfndk/tree/master)
|
6
|
+
|
5
7
|
このツールは、AWS CloudFromationのための簡単な運用/構築サポートツールです。
|
6
8
|
|
7
9
|
kumogata, SparkleFormation, CoffeeFormation など、CloudFormationのテンプレートを書かずにDSLで表現するツールには様々な物があります。
|
@@ -16,6 +18,10 @@ kumogata, SparkleFormation, CoffeeFormation など、CloudFormationのテンプ
|
|
16
18
|
* CloudFormationでバージョンコントロールシステムと連動した継続的インテグレーションのための基盤対応
|
17
19
|
* Keypairの作成/削除
|
18
20
|
* コマンド、サブコマンド、冪統性を考慮したコマンドライン体系、オプションの整理、ヘルプの追加
|
21
|
+
* チェンジセットの作成/実行/削除/レポート(experimental)
|
22
|
+
* Keypair/スタック毎のregionのサポート
|
23
|
+
* 512000バイト以上の大きなテンプレートファイルの場合に自動的にS3にテンプレートファイルをアップロードして処理する機能
|
24
|
+
* cfndk全体での共通設定
|
19
25
|
|
20
26
|
## インストール
|
21
27
|
|
@@ -63,14 +69,14 @@ cfndk init
|
|
63
69
|
|
64
70
|
### ```create```
|
65
71
|
|
66
|
-
cfndk.yml
|
72
|
+
cfndk.ymlで定義されているキーペアとスタックを作成します。
|
67
73
|
|
68
74
|
```cfndk create [option]```
|
69
75
|
|
70
76
|
|
71
77
|
### ```destroy```
|
72
78
|
|
73
|
-
cfndk.yml
|
79
|
+
cfndk.ymlで定義されているるキーペアとスタックを削除します。
|
74
80
|
|
75
81
|
```
|
76
82
|
cfndk destroy [option]
|
@@ -100,8 +106,44 @@ cfndk.ymlで定義されているスタックについてレポートします
|
|
100
106
|
```
|
101
107
|
cfndk report [option]
|
102
108
|
```
|
109
|
+
### ```keypair```
|
110
|
+
|
111
|
+
cfndk.ymlで定義されているキーペアの作成/削除を行うサブコマンドです。
|
112
|
+
|
113
|
+
詳細は
|
114
|
+
|
115
|
+
```
|
116
|
+
cfndk keypair help
|
117
|
+
```
|
118
|
+
|
119
|
+
で確認できます。
|
120
|
+
|
121
|
+
### ```stack```
|
122
|
+
|
123
|
+
cfndk.ymlで定義されているスタックの作成/更新/削除/レポート/テンプレート検証を行うサブコマンドです。
|
124
|
+
|
125
|
+
詳細は
|
126
|
+
|
127
|
+
```
|
128
|
+
cfndk stack help
|
129
|
+
```
|
103
130
|
|
104
|
-
|
131
|
+
で確認できます。
|
132
|
+
|
133
|
+
|
134
|
+
### ```changeset``` (experimental)
|
135
|
+
|
136
|
+
cfndk.ymlで定義されているスタックのチェンジセットの作成/実行/削除/レポートを行うサブコマンドです。
|
137
|
+
|
138
|
+
詳細は
|
139
|
+
|
140
|
+
```
|
141
|
+
cfndk changeset help
|
142
|
+
```
|
143
|
+
|
144
|
+
で確認できます。
|
145
|
+
|
146
|
+
### 主なoption
|
105
147
|
|
106
148
|
#### ```-v --verbose```
|
107
149
|
|
@@ -118,10 +160,25 @@ cfndi.ymlのparametersのerb内で値で参照することができます。
|
|
118
160
|
|
119
161
|
#### ```-u, --uuid uuid```
|
120
162
|
|
121
|
-
|
122
|
-
UUID
|
163
|
+
スタック名、チェンジセット名に指定されたUUIDを使用します。
|
164
|
+
UUIDが指定されるとスタック名、チェンジセット名に付加されます。
|
123
165
|
またcfndi.ymlのparametersの値で参照することができます。
|
124
|
-
|
166
|
+
|
167
|
+
スタック名は下記のようになります。
|
168
|
+
何も指定されない場合はcfndk.ymlで定義されたスタック名がそのまま使われます。
|
169
|
+
|
170
|
+
```[Stack Original Name]-[Stack's UUID]```
|
171
|
+
|
172
|
+
#### ```--change-set-uuid uuid```
|
173
|
+
|
174
|
+
チェンジセット名に指定されたUUIDを使用します。
|
175
|
+
UUIDが指定されるとチェンジセット名に付加されます。
|
176
|
+
|
177
|
+
このオプションが指定された場合チェンジセット名は下記のようになります。
|
178
|
+
何も指定されない場合はチェンジセット名にはスタック名がそのまま使われます。
|
179
|
+
|
180
|
+
```[Stack Name]-[Changeset's UUID]```
|
181
|
+
|
125
182
|
|
126
183
|
#### ```--stack-names=name1 name2```
|
127
184
|
|
@@ -140,25 +197,37 @@ UUIDが指定されるとスタック名に付加されます。
|
|
140
197
|
|
141
198
|
動作の確認メッセージと入力をスキップします。
|
142
199
|
|
200
|
+
他にもオプションはあります。
|
201
|
+
詳細はコマンドヘルプを参照してください。
|
202
|
+
|
143
203
|
## 環境変数
|
144
204
|
|
145
205
|
### ```CFNDK_UUID```
|
146
206
|
|
147
207
|
この環境変数が指定されている場合、```--uuid $CFNDK_UUID```が指定されたものとして動作します。
|
148
|
-
|
208
|
+
```--uuid```のほうが優先されます。
|
209
|
+
|
210
|
+
### ```CFNDK_CHANGE_SET_UUID```
|
149
211
|
|
212
|
+
この環境変数が指定されている場合、```--change-set-uuid $CFNDK_CHANGE_SET_UUID```が指定されたものとして動作します。
|
150
213
|
|
151
214
|
## cfndk.yml
|
152
215
|
|
153
216
|
* example
|
154
217
|
|
155
218
|
```
|
219
|
+
global:
|
220
|
+
region: ap-northeast-1
|
221
|
+
s3_template_bucket: cfndk-templates
|
222
|
+
timeout_in_minutes: 10
|
156
223
|
keypairs:
|
157
224
|
Key1:
|
225
|
+
region: us-east-1
|
158
226
|
Key2:
|
159
227
|
key_file: key/key2<%= append_uuid %>.pem
|
160
228
|
stacks:
|
161
229
|
Stack1:
|
230
|
+
region: us-east-1
|
162
231
|
template_file: stack1/stack1.yaml
|
163
232
|
parameter_input: stack1/env.json
|
164
233
|
parameters:
|
@@ -177,11 +246,17 @@ stacks:
|
|
177
246
|
```
|
178
247
|
|
179
248
|
```
|
249
|
+
global:
|
250
|
+
region: [String]
|
251
|
+
s3_template_bucket: [String]
|
252
|
+
timeout_in_minutes: [Integer]
|
180
253
|
keypairs:
|
181
254
|
[String]:
|
255
|
+
region: [String]
|
182
256
|
key_file: [String]
|
183
257
|
stacks:
|
184
258
|
[String]:
|
259
|
+
region: [String]
|
185
260
|
template_file: [String]
|
186
261
|
parameter_input: [String]
|
187
262
|
parameters:
|
@@ -196,6 +271,33 @@ stacks:
|
|
196
271
|
- [String]
|
197
272
|
```
|
198
273
|
|
274
|
+
### ```global:```
|
275
|
+
|
276
|
+
全体設定を定義します。
|
277
|
+
|
278
|
+
#### region (デフォルト: us-east-1)
|
279
|
+
|
280
|
+
全体で利用するリージョンを指定します。
|
281
|
+
指定されない場合は、AWS_REGION環境変数の値をリージョンとして使用します。
|
282
|
+
AWS_REGIONも指定されない場合はus-east-1を利用します。
|
283
|
+
|
284
|
+
#### timeout_in_minutes (デフォルト: 1)
|
285
|
+
|
286
|
+
全体で利用するタイムアウト時間を分で指定します。
|
287
|
+
|
288
|
+
#### s3_template_bucket (デフォルト: cfndk-templates)
|
289
|
+
|
290
|
+
スタックのCloudFormationテンプレートファイルをアップロードするS3のバケット名を指定します。
|
291
|
+
|
292
|
+
実際のバケット名は
|
293
|
+
```
|
294
|
+
[region]-[s3_template_bucket]
|
295
|
+
```
|
296
|
+
が使用されます。
|
297
|
+
regionはスタック毎で指定されたものを利用します。
|
298
|
+
|
299
|
+
S3バケットは一日で自動的に中身のオブジェクトが削除されるように設定されます。
|
300
|
+
|
199
301
|
### ```keypairs:```
|
200
302
|
|
201
303
|
```
|
@@ -208,6 +310,11 @@ cfndkで管理するキーペアを定義します。
|
|
208
310
|
通常は、キーペアを作成するとこの名称が利用されます。
|
209
311
|
UUIDを利用すると、```[Keypair Original Name]-[UUID]```のような形式のキーペア名が利用されます。
|
210
312
|
|
313
|
+
#### region
|
314
|
+
|
315
|
+
キーペアのリージョンを指定します。
|
316
|
+
globalのregionより優先されます。
|
317
|
+
|
211
318
|
#### key_file
|
212
319
|
|
213
320
|
キーペア作成時にキーペアのファイルを指定された相対パスに作成します。
|
@@ -232,6 +339,11 @@ stacksの配下には、管理するスタックのオリジナル名を定義
|
|
232
339
|
通常は、stackを作成するとこの名称が利用されます。
|
233
340
|
UUIDを利用すると、```[Stack Original Name]-[UUID]```のような形式のスタック名が利用されます。
|
234
341
|
|
342
|
+
#### region
|
343
|
+
|
344
|
+
スタックのリージョンを指定します。
|
345
|
+
globalのregionより優先されます。
|
346
|
+
|
235
347
|
#### template_file
|
236
348
|
|
237
349
|
必須。CloudFormationテンプレートファイルのパスをcfndk.ymlからの相対パスで指定します。
|
@@ -289,7 +401,7 @@ dependsを指定すると、create,update,create-or-changeset,destoryのコマ
|
|
289
401
|
- Stack2
|
290
402
|
```
|
291
403
|
|
292
|
-
#### timeout_in_minutes
|
404
|
+
#### timeout_in_minutes
|
293
405
|
|
294
406
|
スタックを作成する際などのタイムアウト時間を分で指定します。
|
295
407
|
|
@@ -302,13 +414,13 @@ dependsを指定すると、create,update,create-or-changeset,destoryのコマ
|
|
302
414
|
|
303
415
|
* ```append_uuid(glue='-')```
|
304
416
|
|
305
|
-
UUIDガ指定されている場合、```[glueの文字列] + [UUID]```を返します。
|
417
|
+
スタックのUUIDガ指定されている場合、```[glueの文字列] + [Stack's UUID]```を返します。
|
306
418
|
UUIDが指定されてい無い場合は空文字が返ります。
|
307
419
|
glueで接続文字を置き換えることができます。
|
308
420
|
|
309
421
|
* ```uuid```
|
310
422
|
|
311
|
-
UUIDを返します。
|
423
|
+
スタックのUUIDを返します。
|
312
424
|
UUIDが指定されてい無い場合は空文字が返ります。
|
313
425
|
|
314
426
|
* ```properties(key)```
|
data/cfndk.gemspec
CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'aruba'
|
25
25
|
spec.add_development_dependency 'simplecov'
|
26
26
|
spec.add_development_dependency 'awspec'
|
27
|
+
spec.add_development_dependency 'parallel_tests'
|
27
28
|
|
28
29
|
spec.add_dependency 'thor'
|
29
30
|
spec.add_dependency 'rainbow'
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module CFnDK
|
2
|
+
class ChangeSetCommand < Thor
|
3
|
+
include SubcommandHelpReturnable
|
4
|
+
include ConfigFileLoadable
|
5
|
+
|
6
|
+
class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
|
7
|
+
class_option :color, type: :boolean, default: true, desc: 'Use colored output'
|
8
|
+
class_option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
|
9
|
+
class_option :stack_names, type: :array, desc: 'Target stack names'
|
10
|
+
|
11
|
+
desc 'create', 'Create change set'
|
12
|
+
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
13
|
+
option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
|
14
|
+
option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
|
15
|
+
def create
|
16
|
+
CFnDK.logger.info 'create...'.color(:green)
|
17
|
+
data = load_config_data(options)
|
18
|
+
|
19
|
+
credentials = CFnDK::CredentialProviderChain.new.resolve
|
20
|
+
stacks = CFnDK::Stacks.new(data, options, credentials)
|
21
|
+
stacks.validate
|
22
|
+
stacks.create_change_set
|
23
|
+
return 0
|
24
|
+
rescue => e
|
25
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
26
|
+
e.backtrace_locations.each do |line|
|
27
|
+
CFnDK.logger.debug line
|
28
|
+
end
|
29
|
+
return 1
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'execute', 'Execute change set'
|
33
|
+
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
34
|
+
option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
|
35
|
+
def execute
|
36
|
+
CFnDK.logger.info 'execute...'.color(:green)
|
37
|
+
data = load_config_data(options)
|
38
|
+
|
39
|
+
credentials = CFnDK::CredentialProviderChain.new.resolve
|
40
|
+
stacks = CFnDK::Stacks.new(data, options, credentials)
|
41
|
+
stacks.validate
|
42
|
+
stacks.execute_change_set
|
43
|
+
return 0
|
44
|
+
rescue => e
|
45
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
46
|
+
e.backtrace_locations.each do |line|
|
47
|
+
CFnDK.logger.debug line
|
48
|
+
end
|
49
|
+
return 1
|
50
|
+
end
|
51
|
+
|
52
|
+
desc 'destroy', 'Destroy change set'
|
53
|
+
option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
|
54
|
+
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
55
|
+
option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
|
56
|
+
def destroy
|
57
|
+
CFnDK.logger.info 'destroy...'.color(:green)
|
58
|
+
data = load_config_data(options)
|
59
|
+
|
60
|
+
credentials = CFnDK::CredentialProviderChain.new.resolve
|
61
|
+
stacks = CFnDK::Stacks.new(data, options, credentials)
|
62
|
+
|
63
|
+
if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
|
64
|
+
stacks.delete_change_set
|
65
|
+
return 0
|
66
|
+
else
|
67
|
+
CFnDK.logger.info 'destroy command was canceled'.color(:green)
|
68
|
+
return 2
|
69
|
+
end
|
70
|
+
rescue => e
|
71
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
72
|
+
e.backtrace_locations.each do |line|
|
73
|
+
CFnDK.logger.debug line
|
74
|
+
end
|
75
|
+
return 1
|
76
|
+
end
|
77
|
+
|
78
|
+
desc 'report', 'Report change set'
|
79
|
+
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
80
|
+
option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
|
81
|
+
option :types, type: :array, default: %w(tag parameter changes), desc: 'Report type'
|
82
|
+
def report
|
83
|
+
CFnDK.logger.info 'report...'.color(:green)
|
84
|
+
data = load_config_data(options)
|
85
|
+
credentials = CFnDK::CredentialProviderChain.new.resolve
|
86
|
+
stacks = CFnDK::Stacks.new(data, options, credentials)
|
87
|
+
stacks.report_change_set
|
88
|
+
return 0
|
89
|
+
rescue => e
|
90
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
91
|
+
e.backtrace_locations.each do |line|
|
92
|
+
CFnDK.logger.debug line
|
93
|
+
end
|
94
|
+
return 1
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/cfndk/command.rb
CHANGED
@@ -1,177 +1,4 @@
|
|
1
1
|
module CFnDK
|
2
|
-
module SubcommandHelpReternable
|
3
|
-
module ClassMethods
|
4
|
-
def subcommand_help(cmd)
|
5
|
-
desc 'help [COMMAND]', 'Describe subcommands or one specific subcommand'
|
6
|
-
class_eval "
|
7
|
-
def help(command = nil, subcommand = true); super; return 2; end
|
8
|
-
"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
extend ClassMethods
|
12
|
-
def self.included(klass)
|
13
|
-
klass.extend ClassMethods
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
module ConfigFileLoadable
|
18
|
-
private
|
19
|
-
|
20
|
-
def load_config_data(options)
|
21
|
-
raise "File does not exist. #{options[:config_path]}" unless File.file?(options[:config_path])
|
22
|
-
data = open(options[:config_path], 'r') { |f| YAML.load(f) }
|
23
|
-
return data if data
|
24
|
-
CFnDK.logger.error "File is empty. #{options[:config_path]}".color(:red)
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class KeyPairCommand < Thor
|
30
|
-
include SubcommandHelpReternable
|
31
|
-
include ConfigFileLoadable
|
32
|
-
class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
|
33
|
-
class_option :color, type: :boolean, default: true, desc: 'Use colored output'
|
34
|
-
class_option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
|
35
|
-
class_option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
36
|
-
class_option :keypair_names, type: :array, desc: 'Target keypair names'
|
37
|
-
|
38
|
-
desc 'create', 'Create keypair'
|
39
|
-
option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
|
40
|
-
def create
|
41
|
-
CFnDK.logger.info 'create...'.color(:green)
|
42
|
-
data = load_config_data(options)
|
43
|
-
|
44
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
45
|
-
keypairs = CFnDK::KeyPairs.new(data, options, credentials)
|
46
|
-
keypairs.create
|
47
|
-
return 0
|
48
|
-
rescue => e
|
49
|
-
CFnDK.logger.error e.message.color(:red)
|
50
|
-
CFnDK.logger.debug e.backtrace
|
51
|
-
return 1
|
52
|
-
end
|
53
|
-
|
54
|
-
desc 'destroy', 'Destroy keypair'
|
55
|
-
option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
|
56
|
-
def destroy
|
57
|
-
CFnDK.logger.info 'destroy...'.color(:green)
|
58
|
-
data = load_config_data(options)
|
59
|
-
|
60
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
61
|
-
keypairs = CFnDK::KeyPairs.new(data, options, credentials)
|
62
|
-
|
63
|
-
if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
|
64
|
-
keypairs.destroy
|
65
|
-
return 0
|
66
|
-
else
|
67
|
-
CFnDK.logger.info 'destroy command was canceled'.color(:green)
|
68
|
-
return 2
|
69
|
-
end
|
70
|
-
rescue => e
|
71
|
-
CFnDK.logger.error e.message.color(:red)
|
72
|
-
CFnDK.logger.debug e.backtrace
|
73
|
-
return 1
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
class StackCommand < Thor
|
78
|
-
include SubcommandHelpReternable
|
79
|
-
include ConfigFileLoadable
|
80
|
-
|
81
|
-
class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
|
82
|
-
class_option :color, type: :boolean, default: true, desc: 'Use colored output'
|
83
|
-
class_option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
|
84
|
-
class_option :stack_names, type: :array, desc: 'Target stack names'
|
85
|
-
|
86
|
-
desc 'create', 'Create stack'
|
87
|
-
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
88
|
-
option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
|
89
|
-
def create
|
90
|
-
CFnDK.logger.info 'create...'.color(:green)
|
91
|
-
data = load_config_data(options)
|
92
|
-
|
93
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
94
|
-
stacks = CFnDK::Stacks.new(data, options, credentials)
|
95
|
-
stacks.validate
|
96
|
-
stacks.create
|
97
|
-
return 0
|
98
|
-
rescue => e
|
99
|
-
CFnDK.logger.error e.message.color(:red)
|
100
|
-
CFnDK.logger.debug e.backtrace
|
101
|
-
return 1
|
102
|
-
end
|
103
|
-
|
104
|
-
desc 'update', 'Update stack'
|
105
|
-
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
106
|
-
option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
|
107
|
-
def update
|
108
|
-
CFnDK.logger.info 'update...'.color(:green)
|
109
|
-
data = load_config_data(options)
|
110
|
-
|
111
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
112
|
-
stacks = CFnDK::Stacks.new(data, options, credentials)
|
113
|
-
stacks.validate
|
114
|
-
stacks.update
|
115
|
-
return 0
|
116
|
-
rescue => e
|
117
|
-
CFnDK.logger.error e.message.color(:red)
|
118
|
-
CFnDK.logger.debug e.backtrace
|
119
|
-
return 1
|
120
|
-
end
|
121
|
-
|
122
|
-
desc 'destroy', 'Destroy stack'
|
123
|
-
option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
|
124
|
-
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
125
|
-
def destroy
|
126
|
-
CFnDK.logger.info 'destroy...'.color(:green)
|
127
|
-
data = load_config_data(options)
|
128
|
-
|
129
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
130
|
-
stacks = CFnDK::Stacks.new(data, options, credentials)
|
131
|
-
|
132
|
-
if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
|
133
|
-
stacks.destroy
|
134
|
-
return 0
|
135
|
-
else
|
136
|
-
CFnDK.logger.info 'destroy command was canceled'.color(:green)
|
137
|
-
return 2
|
138
|
-
end
|
139
|
-
rescue => e
|
140
|
-
CFnDK.logger.error e.message.color(:red)
|
141
|
-
CFnDK.logger.debug e.backtrace
|
142
|
-
return 1
|
143
|
-
end
|
144
|
-
|
145
|
-
desc 'validate', 'Validate stack'
|
146
|
-
def validate
|
147
|
-
CFnDK.logger.info 'validate...'.color(:green)
|
148
|
-
data = load_config_data(options)
|
149
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
150
|
-
stacks = CFnDK::Stacks.new(data, options, credentials)
|
151
|
-
stacks.validate
|
152
|
-
return 0
|
153
|
-
rescue => e
|
154
|
-
CFnDK.logger.error e.message.color(:red)
|
155
|
-
CFnDK.logger.debug e.backtrace
|
156
|
-
return 1
|
157
|
-
end
|
158
|
-
|
159
|
-
desc 'report', 'Report stack'
|
160
|
-
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
161
|
-
def report
|
162
|
-
CFnDK.logger.info 'report...'.color(:green)
|
163
|
-
data = load_config_data(options)
|
164
|
-
credentials = CFnDK::CredentialProviderChain.new.resolve
|
165
|
-
stacks = CFnDK::Stacks.new(data, options, credentials)
|
166
|
-
stacks.report
|
167
|
-
return 0
|
168
|
-
rescue => e
|
169
|
-
CFnDK.logger.error e.message.color(:red)
|
170
|
-
CFnDK.logger.debug e.backtrace
|
171
|
-
return 1
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
2
|
class Command < Thor
|
176
3
|
include Thor::Actions
|
177
4
|
include ConfigFileLoadable
|
@@ -232,8 +59,10 @@ module CFnDK
|
|
232
59
|
stacks.create
|
233
60
|
return 0
|
234
61
|
rescue => e
|
235
|
-
CFnDK.logger.error e.message.color(:red)
|
236
|
-
|
62
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
63
|
+
e.backtrace_locations.each do |line|
|
64
|
+
CFnDK.logger.debug line
|
65
|
+
end
|
237
66
|
return 1
|
238
67
|
end
|
239
68
|
|
@@ -241,8 +70,6 @@ module CFnDK
|
|
241
70
|
option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
|
242
71
|
option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
|
243
72
|
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
244
|
-
option :stack_names, type: :array, desc: 'Target stack names'
|
245
|
-
option :keypair_names, type: :array, desc: 'Target keypair names'
|
246
73
|
def destroy
|
247
74
|
CFnDK.logger.info 'destroy...'.color(:green)
|
248
75
|
data = load_config_data(options)
|
@@ -260,8 +87,10 @@ module CFnDK
|
|
260
87
|
return 2
|
261
88
|
end
|
262
89
|
rescue => e
|
263
|
-
CFnDK.logger.error "
|
264
|
-
|
90
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
91
|
+
e.backtrace_locations.each do |line|
|
92
|
+
CFnDK.logger.debug line
|
93
|
+
end
|
265
94
|
return 1
|
266
95
|
end
|
267
96
|
|
@@ -269,6 +98,7 @@ module CFnDK
|
|
269
98
|
option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
|
270
99
|
option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
|
271
100
|
option :stack_names, type: :array, desc: 'Target stack names'
|
101
|
+
option :types, type: :array, default: %w(tag output parameter resource event), desc: 'Report type'
|
272
102
|
def report
|
273
103
|
CFnDK.logger.info 'report...'.color(:green)
|
274
104
|
|
@@ -279,8 +109,10 @@ module CFnDK
|
|
279
109
|
stacks.report
|
280
110
|
return 0
|
281
111
|
rescue => e
|
282
|
-
CFnDK.logger.error e.message.color(:red)
|
283
|
-
|
112
|
+
CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
|
113
|
+
e.backtrace_locations.each do |line|
|
114
|
+
CFnDK.logger.debug line
|
115
|
+
end
|
284
116
|
return 1
|
285
117
|
end
|
286
118
|
|
@@ -296,5 +128,7 @@ module CFnDK
|
|
296
128
|
subcommand 'keypair', KeyPairCommand
|
297
129
|
desc 'stack SUBCOMMAND ...ARGS', 'Manage stack'
|
298
130
|
subcommand 'stack', StackCommand
|
131
|
+
desc 'changeset SUBCOMMAND ...ARGS', 'Manage change set'
|
132
|
+
subcommand 'changeset', ChangeSetCommand
|
299
133
|
end
|
300
134
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module CFnDK
|
2
|
+
module ConfigFileLoadable
|
3
|
+
private
|
4
|
+
|
5
|
+
def load_config_data(options)
|
6
|
+
raise "File does not exist. #{options[:config_path]}" unless File.file?(options[:config_path])
|
7
|
+
data = open(options[:config_path], 'r') { |f| YAML.load(f) }
|
8
|
+
return data if data
|
9
|
+
CFnDK.logger.error "File is empty. #{options[:config_path]}".color(:red)
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module CFnDK
|
2
|
+
class GlobalConfig
|
3
|
+
attr_reader :timeout_in_minutes, :s3_template_bucket, :s3_template_hash, :region
|
4
|
+
def initialize(data, option)
|
5
|
+
@timeout_in_minutes = 1
|
6
|
+
@s3_template_bucket = 'cfndk-templates'
|
7
|
+
@s3_template_hash = SecureRandom.uuid
|
8
|
+
@region = ENV['AWS_REGION'] || 'us-east-1'
|
9
|
+
return unless data['global'].is_a?(Hash)
|
10
|
+
@timeout_in_minutes = data['global']['timeout_in_minutes'] || 1
|
11
|
+
@s3_template_bucket = data['global']['s3_template_bucket'] || 'cfndk-templates'
|
12
|
+
@region = data['global']['region'] || ENV['AWS_REGION'] || 'us-east-1'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/cfndk/key_pair.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module CFnDK
|
2
2
|
class KeyPair
|
3
3
|
attr_reader :key_file
|
4
|
-
def initialize(name, data, option, credentials)
|
4
|
+
def initialize(name, data, option, global_config, credentials)
|
5
|
+
@global_config = global_config
|
5
6
|
@name = name
|
6
|
-
|
7
|
-
@key_file = data['key_file'] || nil
|
7
|
+
data = {} unless data
|
8
|
+
@key_file = data['key_file'] || nil
|
9
|
+
@region = data['region'] || @global_config.region
|
8
10
|
@option = option
|
9
|
-
@client = Aws::EC2::Client.new(credentials: credentials)
|
11
|
+
@client = Aws::EC2::Client.new(credentials: credentials, region: @region)
|
10
12
|
end
|
11
13
|
|
12
14
|
def create
|
@@ -55,6 +57,7 @@ module CFnDK
|
|
55
57
|
return unless @key_file
|
56
58
|
key_file = CFnDK::ErbString.new(@key_file, @option).value
|
57
59
|
CFnDK.logger.info(('create key file: ' + key_file).color(:green))
|
60
|
+
FileUtils.mkdir_p(File.dirname(key_file))
|
58
61
|
File.write(key_file, key_pair.key_material)
|
59
62
|
end
|
60
63
|
end
|