cfndk 0.1.1.2 → 0.1.2

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.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +1 -1
  3. data/.gitignore +1 -0
  4. data/.rspec +2 -0
  5. data/Gemfile.lock +9 -5
  6. data/README.md +124 -10
  7. data/cfndk.gemspec +3 -0
  8. data/docker/Dockerfile +8 -0
  9. data/docker/build.sh +3 -0
  10. data/docker/cfndk.sh +14 -0
  11. data/lib/cfndk.rb +9 -0
  12. data/lib/cfndk/change_set_command.rb +14 -8
  13. data/lib/cfndk/command.rb +14 -6
  14. data/lib/cfndk/credential_provider_chain.rb +12 -42
  15. data/lib/cfndk/credential_resolvable.rb +10 -0
  16. data/lib/cfndk/diff.rb +38 -0
  17. data/lib/cfndk/global_config.rb +32 -2
  18. data/lib/cfndk/key_pair.rb +33 -1
  19. data/lib/cfndk/key_pair_command.rb +10 -3
  20. data/lib/cfndk/key_pairs.rb +12 -0
  21. data/lib/cfndk/stack.rb +58 -59
  22. data/lib/cfndk/stack_command.rb +26 -8
  23. data/lib/cfndk/stacks.rb +16 -0
  24. data/lib/cfndk/template_packager.rb +210 -0
  25. data/lib/cfndk/uuid.rb +10 -0
  26. data/lib/cfndk/version.rb +1 -1
  27. data/spec/cfndk_spec.rb +1 -1
  28. data/spec/cfndk_stack_create_spec.rb +365 -5
  29. data/spec/cfndk_stack_destroy_spec.rb +64 -0
  30. data/spec/cfndk_stack_update_spec.rb +86 -0
  31. data/spec/fixtures/big_vpc.yaml +533 -0
  32. data/spec/fixtures/lambda_function/index.js +4 -0
  33. data/spec/fixtures/lambda_function/lambda_function.json +4 -0
  34. data/spec/fixtures/lambda_function/lambda_function.yaml +28 -0
  35. data/spec/fixtures/nested_stack.json +35 -0
  36. data/spec/fixtures/nested_stack.yaml +20 -0
  37. data/spec/fixtures/serverless_function/index.js +4 -0
  38. data/spec/fixtures/serverless_function/serverless_function.json +4 -0
  39. data/spec/fixtures/serverless_function/serverless_function.yaml +21 -0
  40. data/spec/fixtures/stack.json +8 -0
  41. data/spec/fixtures/stack.template.json +39 -0
  42. data/spec/fixtures/stack.yaml +22 -0
  43. data/spec/fixtures/vpc.template.json +40 -0
  44. data/vagrant/Vagrantfile +89 -0
  45. metadata +80 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 5b00253ce992f17d5d0635b26c31f95c0c1e4472
4
- data.tar.gz: ab090529505cc83683861f4f2f159f97ece30691
2
+ SHA256:
3
+ metadata.gz: 769405321919c35d09b8742a2b1b17846e2f8142e52fdf0961630b022202d75b
4
+ data.tar.gz: fc3a7eec80fc9710a806509a0eba9bc10b35070c95107a1dbef5cf4ee2887b62
5
5
  SHA512:
6
- metadata.gz: bf7998d5f02525b383a332f5d424f38a03943d77d449f49d32df7781ebf1f6742da80e9b5be8b7b0df8b28124e395a5412d95d526571ae6b8e41c78c0b6e9e6b
7
- data.tar.gz: e6e58b2c62c23284b575a387538db52d6db7a6a99553521bec6ef352e4ec139585c77427ecd1cfc47c293b4ccc5db60375d607ef3714a77f7dca2a54c10c342f
6
+ metadata.gz: 7e07b11ab40692eb56b479598d3f44d4f5ceb052b926cc6d5220925a4067bb4744b4f44607c6162b4e863670d0d307d02cdab78c362afbd887d8aac4d69f93f0
7
+ data.tar.gz: aa29ad27746fcb1f961200b579bdd78290943a2c96bafceb14f3b6caef1314ab3049837ae14488289f7114c204ab1eb608d59682e14dcd9bc7cbe7343a8af341
@@ -8,7 +8,7 @@ jobs:
8
8
  docker:
9
9
  - image: circleci/ruby:2.4.1-node-browsers
10
10
  environment:
11
- PARALLEL_TESTS_CONCURRENCY: 2
11
+ PARALLEL_TESTS_CONCURRENCY: 4
12
12
  parallelism: 1
13
13
  working_directory: ~/repo
14
14
 
data/.gitignore CHANGED
@@ -12,3 +12,4 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+ /vagrant/.vagrant/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -1,11 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cfndk (0.1.1.2)
4
+ cfndk (0.1.2)
5
5
  aws-sdk
6
6
  bundler
7
7
  camelizable
8
+ diff-lcs
9
+ polyfill
8
10
  rainbow
11
+ rubyzip (= 1.3.0)
9
12
  terminal-table
10
13
  thor
11
14
 
@@ -732,8 +735,7 @@ GEM
732
735
  backports (3.12.0)
733
736
  builder (3.2.3)
734
737
  camelizable (0.0.3)
735
- childprocess (1.0.1)
736
- rake (< 13.0)
738
+ childprocess (1.0.0)
737
739
  contracts (0.16.0)
738
740
  cucumber (3.1.2)
739
741
  builder (>= 2.1.2)
@@ -764,8 +766,9 @@ GEM
764
766
  parallel (1.14.0)
765
767
  parallel_tests (2.28.0)
766
768
  parallel
769
+ polyfill (1.8.0)
767
770
  rainbow (3.0.0)
768
- rake (11.1.2)
771
+ rake (13.0.1)
769
772
  rspec (3.8.0)
770
773
  rspec-core (~> 3.8.0)
771
774
  rspec-expectations (~> 3.8.0)
@@ -782,6 +785,7 @@ GEM
782
785
  diff-lcs (>= 1.2.0, < 2.0)
783
786
  rspec-support (~> 3.8.0)
784
787
  rspec-support (3.8.0)
788
+ rubyzip (1.3.0)
785
789
  simplecov (0.16.1)
786
790
  docile (~> 1.1)
787
791
  json (>= 1.8, < 3)
@@ -793,7 +797,7 @@ GEM
793
797
  unicode-display_width (~> 1.1, >= 1.1.1)
794
798
  thor (0.20.3)
795
799
  tins (1.20.2)
796
- unicode-display_width (1.1.3)
800
+ unicode-display_width (1.7.0)
797
801
 
798
802
  PLATFORMS
799
803
  ruby
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # AWS CloudFormation Development Kit
2
2
 
3
3
  This is easy operation/integration support tool for AWS CloudFormation.
4
+ This tool drives DevOps and Infrastructure as Code.
4
5
 
5
6
  [![CircleCI](https://circleci.com/gh/Amakata/cfndk/tree/master.svg?style=svg)](https://circleci.com/gh/Amakata/cfndk/tree/master)
6
7
 
@@ -18,18 +19,19 @@ kumogata, SparkleFormation, CoffeeFormation など、CloudFormationのテンプ
18
19
  * CloudFormationでバージョンコントロールシステムと連動した継続的インテグレーションのための基盤対応
19
20
  * Keypairの作成/削除
20
21
  * コマンド、サブコマンド、冪統性を考慮したコマンドライン体系、オプションの整理、ヘルプの追加
21
- * チェンジセットの作成/実行/削除/レポート(experimental)
22
+ * チェンジセットの作成/実行/削除/レポート
22
23
  * Keypair/スタック毎のregionのサポート
23
24
  * 512000バイト以上の大きなテンプレートファイルの場合に自動的にS3にテンプレートファイルをアップロードして処理する機能
25
+ * aws cloudformation package相当の機能(nested templateやlambda functionの自動アップロード) (experimental)
24
26
  * cfndk全体での共通設定
25
27
 
26
- ## インストール
28
+ ## Install
27
29
 
28
30
  ```
29
31
  $ gem install cfndk
30
32
  ```
31
33
 
32
- ## 使い方
34
+ ## Usage
33
35
 
34
36
  ```
35
37
  $ mkdir cfn-project
@@ -42,7 +44,7 @@ $ cfndk report
42
44
  $ cfndk destroy -f
43
45
  ```
44
46
 
45
- ## Credentials設定
47
+ ## Credentials configuration
46
48
 
47
49
  次の順番でCredentialsを評価して最初に有効なCredentialsを使用します。
48
50
 
@@ -57,7 +59,7 @@ $ cfndk destroy -f
57
59
  4. EC2/ECS Instance ProfileによるCredentials
58
60
  * AWS_CONTAINER_CREDENTIALS_RELATIVE_URI環境変数が設定された場合のみECSが使われます。
59
61
 
60
- ## コマンド
62
+ ## Command
61
63
 
62
64
  ### ```init```
63
65
 
@@ -143,7 +145,7 @@ cfndk changeset help
143
145
 
144
146
  で確認できます。
145
147
 
146
- ### 主なoption
148
+ ### option
147
149
 
148
150
  #### ```-v --verbose```
149
151
 
@@ -200,7 +202,7 @@ UUIDが指定されるとチェンジセット名に付加されます。
200
202
  他にもオプションはあります。
201
203
  詳細はコマンドヘルプを参照してください。
202
204
 
203
- ## 環境変数
205
+ ## Environment Variables
204
206
 
205
207
  ### ```CFNDK_UUID```
206
208
 
@@ -220,6 +222,9 @@ global:
220
222
  region: ap-northeast-1
221
223
  s3_template_bucket: cfndk-templates
222
224
  timeout_in_minutes: 10
225
+ role_arn: arn:aws:iam::XXXXXXXXXXX:role/XXXXXXXXXXXXX
226
+ package: true
227
+ default_profile: profile_name
223
228
  keypairs:
224
229
  Key1:
225
230
  region: us-east-1
@@ -232,6 +237,7 @@ stacks:
232
237
  parameter_input: stack1/env.json
233
238
  parameters:
234
239
  VpcName: Prod<%= append_uuid %>
240
+ package: true
235
241
  Stack2:
236
242
  template_file: stack2/stack2.yaml
237
243
  parameter_input: stack2/env.json
@@ -241,7 +247,7 @@ stacks:
241
247
  - CAPABILITY_IAM
242
248
  - CAPABILITY_NAMED_IAM
243
249
  depends:
244
- - Stack1
250
+ - Stack1
245
251
  timeout_in_minutes: 10
246
252
  ```
247
253
 
@@ -250,10 +256,17 @@ global:
250
256
  region: [String]
251
257
  s3_template_bucket: [String]
252
258
  timeout_in_minutes: [Integer]
259
+ package: [Boolean]
260
+ default_profile: [String]
261
+ pre_command: [String]
262
+ post_command: [String]
253
263
  keypairs:
254
264
  [String]:
255
265
  region: [String]
256
266
  key_file: [String]
267
+ enabled: [Boolean]
268
+ pre_command: [String]
269
+ post_command: [String]
257
270
  stacks:
258
271
  [String]:
259
272
  region: [String]
@@ -268,7 +281,11 @@ stacks:
268
281
  timeout_in_minutes: [Integer]
269
282
  depends:
270
283
  - [String]
271
- - [String]
284
+ - [String]
285
+ package: [Boolean]
286
+ enabled: [Boolean]
287
+ pre_command: [String]
288
+ post_command: [String]
272
289
  ```
273
290
 
274
291
  ### ```global:```
@@ -285,6 +302,10 @@ AWS_REGIONも指定されない場合はus-east-1を利用します。
285
302
 
286
303
  全体で利用するタイムアウト時間を分で指定します。
287
304
 
305
+ #### role_arn
306
+
307
+ 利用するロールのARN
308
+
288
309
  #### s3_template_bucket (デフォルト: cfndk-templates)
289
310
 
290
311
  スタックのCloudFormationテンプレートファイルをアップロードするS3のバケット名を指定します。
@@ -298,6 +319,37 @@ regionはスタック毎で指定されたものを利用します。
298
319
 
299
320
  S3バケットは一日で自動的に中身のオブジェクトが削除されるように設定されます。
300
321
 
322
+ #### package (デフォルト: false)
323
+
324
+ trueを指定した場合に、
325
+ スタックのテンプレートで、ネステッドスタックや、CloudFormationのコードがローカルパス形式で指定されている場合に
326
+ ```aws cloudformation package```
327
+ 相当の処理を行います。
328
+
329
+ yaml、jsonの意図しない加工がされる可能性があるためデフォルトではfalseとなっています。
330
+
331
+ 例えば、```package: true```を指定して下記の様に記述すると、 ```./lambda_function``` フォルダをzipアーカイブしてS3にアップロードし、Codeを適切なS3のパスに更新します。
332
+
333
+ ```
334
+ LambdaFunction:
335
+ Type: AWS::Lambda::Function
336
+ Properties:
337
+ Code: ./lambda_function
338
+ ```
339
+
340
+ #### default_profile
341
+
342
+ default_profileで指定されたAWSプロファイルを利用してスタックを作成します。
343
+ AWS_PROFILE環境変数が指定された場合にはAWS_PROFILE環境変数が優先して使用されます。
344
+
345
+ #### pre_command
346
+
347
+ スタックのcreate、updateやチェンジセットのcreateで、処理の開始前に実施するコマンドを指定します。
348
+
349
+ #### post_command
350
+
351
+ スタックのcreate、updateやチェンジセットのcreateで、処理の完了後に実施するコマンドを指定します。
352
+
301
353
  ### ```keypairs:```
302
354
 
303
355
  ```
@@ -326,6 +378,17 @@ erbの記法が利用できます。
326
378
  key_file: key/key<%= append_uuid %>.pem
327
379
  ```
328
380
 
381
+ #### enabled (デフォルト: true)
382
+
383
+ falseを指定した場合、そのkey pairを無視します
384
+
385
+ #### pre_command
386
+
387
+ ker pairのcreateの処理の開始前に実施するコマンドを指定します。
388
+
389
+ #### post_command
390
+
391
+ key pairのcreateの処理の完了後に実施するコマンドを指定します。
329
392
 
330
393
  ### ```stacks:```
331
394
 
@@ -401,6 +464,28 @@ dependsを指定すると、create,update,create-or-changeset,destoryのコマ
401
464
  - Stack2
402
465
  ```
403
466
 
467
+ #### package (デフォルト: false)
468
+
469
+ trueを指定した場合に、
470
+ スタックのテンプレートで、ネステッドスタックや、CloudFormationのコードがローカルパス形式で指定されている場合に
471
+ ```aws cloudformation package```
472
+ 相当の処理を行います。
473
+
474
+ yaml、jsonの意図しない加工がされる可能性があるためデフォルトではfalseとなっています。
475
+
476
+ 例えば、```package: true```を指定して下記の様に記述すると、 ```./lambda_function``` フォルダをzipアーカイブしてS3にアップロードし、Codeを適切なS3のパスに更新します。
477
+
478
+ ```
479
+ LambdaFunction:
480
+ Type: AWS::Lambda::Function
481
+ Properties:
482
+ Code: ./lambda_function
483
+ ```
484
+
485
+ #### enabled (デフォルト: true)
486
+
487
+ falseを指定した場合、そのスタックを無視します
488
+
404
489
  #### timeout_in_minutes
405
490
 
406
491
  スタックを作成する際などのタイムアウト時間を分で指定します。
@@ -409,6 +494,14 @@ dependsを指定すると、create,update,create-or-changeset,destoryのコマ
409
494
  timeout_in_minutes: 5
410
495
  ```
411
496
 
497
+ #### pre_command
498
+
499
+ スタックのcreate、updateやチェンジセットのcreateで、処理の開始前に実施するコマンドを指定します。
500
+
501
+ #### post_command
502
+
503
+ スタックのcreate、updateやチェンジセットのcreateで、処理の完了後に実施するコマンドを指定します。
504
+
412
505
 
413
506
  ### erbで使用できるメソッド
414
507
 
@@ -427,8 +520,29 @@ dependsを指定すると、create,update,create-or-changeset,destoryのコマ
427
520
 
428
521
  オプション```--properties```で指定したキーに対応する値を参照することができます。
429
522
 
523
+ ## Execution Environment
524
+
525
+ ### Vagrant
526
+
527
+ Vagrantを利用してLinux環境とcfndkのインストールを行うリファレンス環境を用意しました。
528
+
529
+ ```
530
+ cd vagrant
531
+ vagrant up
532
+ vagrant ssh
533
+ ```
534
+
535
+ ### Docker
536
+
537
+ gemで直接インストールする代わりに、Dockerコンテナを利用して、cfndkコマンドを実行できるようにします。
538
+
539
+ ```
540
+ cp docker/cfndk.sh /usr/local/bin/cfndk.sh
541
+ chmod +x /usr/local/bin/cfndk.sh
542
+ AWS_PROFILE=default cfndk.sh help
543
+ ```
430
544
 
431
- ## テスト
545
+ ## Test
432
546
 
433
547
  cfndkコマンドのテストを行うことができます。
434
548
  CFNDK_COVERAGE環境変数に1を設定することで、カバレッジを取ることができます。
@@ -28,7 +28,10 @@ Gem::Specification.new do |spec|
28
28
  spec.add_dependency 'bundler'
29
29
  spec.add_dependency 'thor'
30
30
  spec.add_dependency 'rainbow'
31
+ spec.add_dependency 'rubyzip', '1.3.0'
31
32
  spec.add_dependency 'aws-sdk'
32
33
  spec.add_dependency 'camelizable'
33
34
  spec.add_dependency 'terminal-table'
35
+ spec.add_dependency 'diff-lcs'
36
+ spec.add_dependency 'polyfill'
34
37
  end
@@ -0,0 +1,8 @@
1
+ FROM ruby:2.6-alpine
2
+
3
+ RUN gem install bundler --version 1.14.6
4
+ RUN gem install cfndk
5
+
6
+ WORKDIR /home/cfndk
7
+ ENTRYPOINT ["sh", "-c", "cfndk $@", ""]
8
+ CMD ["help"]
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ docker build -t cfndk:latest ./
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ WORK_DIR=`pwd`
4
+
5
+ docker run \
6
+ -v $WORK_DIR:/home/cfndk \
7
+ -v $HOME/.aws:/root/.aws \
8
+ -e AWS_PROFILE=$AWS_PROFILE \
9
+ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
10
+ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
11
+ -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
12
+ -w /home/cfndk \
13
+ -it amakata/cfndk:latest \
14
+ "$@"
@@ -4,14 +4,19 @@ require 'rainbow/ext/string'
4
4
  require 'camelizable'
5
5
  require 'fileutils'
6
6
  require 'pathname'
7
+ require 'ostruct'
7
8
  require 'erb'
8
9
  require 'yaml'
9
10
  require 'json'
11
+ require 'zip'
10
12
  require 'aws-sdk'
11
13
  require 'terminal-table'
12
14
  require 'securerandom'
13
15
  require 'logger'
14
16
  require 'thor'
17
+ require 'diff/lcs'
18
+ require 'diff/lcs/hunk'
19
+ require 'polyfill'
15
20
 
16
21
  if ENV['CFNDK_COVERAGE']
17
22
  require 'simplecov'
@@ -29,11 +34,15 @@ require 'cfndk/global_config'
29
34
  require 'cfndk/logger'
30
35
  require 'cfndk/credential_provider_chain'
31
36
  require 'cfndk/subcommand_help_returnable'
37
+ require 'cfndk/credential_resolvable'
32
38
  require 'cfndk/config_file_loadable'
33
39
  require 'cfndk/key_pair_command'
34
40
  require 'cfndk/stack_command'
35
41
  require 'cfndk/change_set_command'
36
42
  require 'cfndk/command'
43
+ require 'cfndk/template_packager'
44
+ require 'cfndk/diff'
45
+ require 'cfndk/uuid'
37
46
 
38
47
  module CFnDK
39
48
  end
@@ -2,11 +2,12 @@ module CFnDK
2
2
  class ChangeSetCommand < Thor
3
3
  include SubcommandHelpReturnable
4
4
  include ConfigFileLoadable
5
+ include CredentialResolvable
5
6
 
6
7
  class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
7
8
  class_option :color, type: :boolean, default: true, desc: 'Use colored output'
8
9
  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
+ class_option :stack_names, type: :array, aliases: 's', desc: 'Target stack names'
10
11
 
11
12
  desc 'create', 'Create change set'
12
13
  option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
@@ -15,11 +16,16 @@ module CFnDK
15
16
  def create
16
17
  CFnDK.logger.info 'create...'.color(:green)
17
18
  data = load_config_data(options)
18
-
19
- credentials = CFnDK::CredentialProviderChain.new.resolve
19
+ credentials = resolve_credential(data, options)
20
+ global_config = CFnDK::GlobalConfig.new(data, options)
20
21
  stacks = CFnDK::Stacks.new(data, options, credentials)
22
+
23
+ global_config.pre_command_execute
24
+ stacks.pre_command_execute
21
25
  stacks.validate
22
26
  stacks.create_change_set
27
+ stacks.post_command_execute
28
+ global_config.post_command_execute
23
29
  return 0
24
30
  rescue => e
25
31
  CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
@@ -35,10 +41,9 @@ module CFnDK
35
41
  def execute
36
42
  CFnDK.logger.info 'execute...'.color(:green)
37
43
  data = load_config_data(options)
38
-
39
- credentials = CFnDK::CredentialProviderChain.new.resolve
44
+ credentials = resolve_credential(data, options)
40
45
  stacks = CFnDK::Stacks.new(data, options, credentials)
41
- stacks.validate
46
+
42
47
  stacks.execute_change_set
43
48
  return 0
44
49
  rescue => e
@@ -56,8 +61,8 @@ module CFnDK
56
61
  def destroy
57
62
  CFnDK.logger.info 'destroy...'.color(:green)
58
63
  data = load_config_data(options)
64
+ credentials = resolve_credential(data, options)
59
65
 
60
- credentials = CFnDK::CredentialProviderChain.new.resolve
61
66
  stacks = CFnDK::Stacks.new(data, options, credentials)
62
67
 
63
68
  if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
@@ -82,7 +87,8 @@ module CFnDK
82
87
  def report
83
88
  CFnDK.logger.info 'report...'.color(:green)
84
89
  data = load_config_data(options)
85
- credentials = CFnDK::CredentialProviderChain.new.resolve
90
+ credentials = resolve_credential(data, options)
91
+
86
92
  stacks = CFnDK::Stacks.new(data, options, credentials)
87
93
  stacks.report_change_set
88
94
  return 0