cfndk 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +23 -14
  3. data/.gitignore +0 -1
  4. data/.rspec_parallel +6 -0
  5. data/Gemfile +1 -0
  6. data/Gemfile.lock +811 -0
  7. data/README.md +122 -10
  8. data/cfndk.gemspec +1 -0
  9. data/lib/cfndk/change_set_command.rb +97 -0
  10. data/lib/cfndk/command.rb +15 -181
  11. data/lib/cfndk/config_file_loadable.rb +13 -0
  12. data/lib/cfndk/global_config.rb +15 -0
  13. data/lib/cfndk/key_pair.rb +7 -4
  14. data/lib/cfndk/key_pair_command.rb +53 -0
  15. data/lib/cfndk/key_pairs.rb +2 -1
  16. data/lib/cfndk/logger.rb +1 -1
  17. data/lib/cfndk/stack.rb +382 -103
  18. data/lib/cfndk/stack_command.rb +110 -0
  19. data/lib/cfndk/stacks.rb +40 -14
  20. data/lib/cfndk/subcommand_help_returnable.rb +16 -0
  21. data/lib/cfndk/version.rb +1 -1
  22. data/lib/cfndk.rb +6 -0
  23. data/skel/cfndk.yml +4 -0
  24. data/spec/cfndk_change_set_create_spec.rb +436 -0
  25. data/spec/cfndk_change_set_destroy_spec.rb +160 -0
  26. data/spec/cfndk_change_set_execute_spec.rb +179 -0
  27. data/spec/cfndk_change_set_report_spec.rb +107 -0
  28. data/spec/cfndk_change_set_spec.rb +37 -0
  29. data/spec/cfndk_create_spec.rb +56 -141
  30. data/spec/cfndk_destroy_spec.rb +4 -2
  31. data/spec/cfndk_keypiar_spec.rb +11 -9
  32. data/spec/cfndk_report_spec.rb +3 -1
  33. data/spec/cfndk_spec.rb +5 -3
  34. data/spec/cfndk_stack_create_spec.rb +454 -0
  35. data/spec/cfndk_stack_destroy_spec.rb +161 -0
  36. data/spec/cfndk_stack_report_spec.rb +181 -0
  37. data/spec/cfndk_stack_spec.rb +6 -1146
  38. data/spec/cfndk_stack_update_spec.rb +467 -0
  39. data/spec/spec_helper.rb +4 -1
  40. data/spec/support/aruba.rb +1 -0
  41. 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
- ### [option]
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
- 指定されたUUIDを使用します。
122
- UUIDが指定されるとスタック名に付加されます。
163
+ スタック名、チェンジセット名に指定されたUUIDを使用します。
164
+ UUIDが指定されるとスタック名、チェンジセット名に付加されます。
123
165
  またcfndi.ymlのparametersの値で参照することができます。
124
- ```-u```は最後に指定されたものが有効になります。
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
- ```-u```のほうが優先されます。
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 (デフォルト: 1)
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
- CFnDK.logger.debug e.backtrace
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 "(#{e.class}) #{e.message}".color(:red)
264
- CFnDK.logger.debug e.backtrace
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
- CFnDK.logger.debug e.backtrace
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
@@ -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
- @key_file = nil
7
- @key_file = data['key_file'] || nil if data
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