etude_for_aws 0.7.4

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 (124) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +103 -0
  3. data/.rspec +2 -0
  4. data/.ruby-version +1 -0
  5. data/.yardopts +10 -0
  6. data/Dockerfile +17 -0
  7. data/Dockerfile-dev +20 -0
  8. data/Gemfile +6 -0
  9. data/Gemfile.lock +89 -0
  10. data/Guardfile +22 -0
  11. data/Jenkinsfile +11 -0
  12. data/README.md +26 -0
  13. data/Rakefile +12 -0
  14. data/Vagrantfile +15 -0
  15. data/bin/aws_console.rb +10 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +8 -0
  18. data/circle.yml +22 -0
  19. data/config.yml +124 -0
  20. data/docker-compose.yml +9 -0
  21. data/docs/README.md +54 -0
  22. data/docs/_config.yml +6 -0
  23. data/docs/dev/cfm/cfm.md +9 -0
  24. data/docs/dev/cfm/images/vpc_core_model.png +0 -0
  25. data/docs/dev/cfm/images/vpc_type1.png +0 -0
  26. data/docs/dev/cfm/images/vpc_type2.png +0 -0
  27. data/docs/dev/cfm/images/vpc_type3.png +0 -0
  28. data/docs/dev/cfm/images/vpc_type4.png +0 -0
  29. data/docs/dev/cfm/images/vpc_type5.png +0 -0
  30. data/docs/dev/cfm/images/vpc_type6.png +0 -0
  31. data/docs/dev/cfm/images/vpc_type7.png +0 -0
  32. data/docs/dev/cfm/vpc/core_model.puml +35 -0
  33. data/docs/dev/cfm/vpc/vpc.md +39 -0
  34. data/docs/dev/cfm/vpc/vpc_type1.puml +17 -0
  35. data/docs/dev/cfm/vpc/vpc_type2.puml +23 -0
  36. data/docs/dev/cfm/vpc/vpc_type3.puml +24 -0
  37. data/docs/dev/cfm/vpc/vpc_type4.puml +23 -0
  38. data/docs/dev/cfm/vpc/vpc_type5.puml +25 -0
  39. data/docs/dev/cfm/vpc/vpc_type6.puml +26 -0
  40. data/docs/dev/cfm/vpc/vpc_type7.puml +39 -0
  41. data/docs/dev/ec2/core_model.puml +43 -0
  42. data/docs/dev/ec2/ec2.md +36 -0
  43. data/docs/dev/ec2/ec2_type1.puml +27 -0
  44. data/docs/dev/ec2/ec2_type2.puml +43 -0
  45. data/docs/dev/ec2/ec2_type3.puml +44 -0
  46. data/docs/dev/ec2/ec2_type4.puml +43 -0
  47. data/docs/dev/ec2/ec2_type5.puml +45 -0
  48. data/docs/dev/ec2/ec2_type6.puml +46 -0
  49. data/docs/dev/ec2/ec2_type7.puml +79 -0
  50. data/docs/dev/ec2/images/.keep +0 -0
  51. data/docs/dev/ec2/images/ec2_core_model.png +0 -0
  52. data/docs/dev/ec2/images/ec2_type1.png +0 -0
  53. data/docs/dev/ec2/images/ec2_type2.png +0 -0
  54. data/docs/dev/ec2/images/ec2_type3.png +0 -0
  55. data/docs/dev/ec2/images/ec2_type4.png +0 -0
  56. data/docs/dev/ec2/images/ec2_type5.png +0 -0
  57. data/docs/dev/ec2/images/ec2_type6.png +0 -0
  58. data/docs/dev/ec2/images/ec2_type7.png +0 -0
  59. data/docs/dev/vpc/core_model.puml +49 -0
  60. data/docs/dev/vpc/images/core_model.png +0 -0
  61. data/docs/dev/vpc/images/simple.png +0 -0
  62. data/docs/dev/vpc/images/standard.png +0 -0
  63. data/docs/dev/vpc/simple.puml +17 -0
  64. data/docs/dev/vpc/standard.puml +24 -0
  65. data/docs/dev/vpc/vpc.md +19 -0
  66. data/docs/ops/build_aws_sdk_repl.md +19 -0
  67. data/docs/ops/images/.keep +0 -0
  68. data/docs/ops/run_rake_task.md +89 -0
  69. data/docs/ops/ship_circleci.md +9 -0
  70. data/docs/ops/ship_jenkins.md +20 -0
  71. data/docs/ops/ship_ruby_gem.md +26 -0
  72. data/docs/template_catalog.md +6 -0
  73. data/docs/template_pattern.md +13 -0
  74. data/docs/template_recipe.md +6 -0
  75. data/docs/template_spec.md +8 -0
  76. data/etude_for_aws.gemspec +41 -0
  77. data/etude_for_aws.iml +42 -0
  78. data/exe/etude_for_aws +3 -0
  79. data/lib/etude_for_aws.rb +38 -0
  80. data/lib/etude_for_aws/cfm/configuration.rb +39 -0
  81. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-1az-1subnet-pub.template +529 -0
  82. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-1az-2subnet-pub-pri.template +790 -0
  83. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-1az-2subnet-pub.template +634 -0
  84. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-2az-2subnet-pri.template +645 -0
  85. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-2az-2subnet-pub-pri.template +611 -0
  86. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-2az-2subnet-pub.template +646 -0
  87. data/lib/etude_for_aws/cfm/vpc/cfm_templates/vpc-2az-4subnet-pub-pri.template +1010 -0
  88. data/lib/etude_for_aws/cfm/vpc/null_vpc.rb +13 -0
  89. data/lib/etude_for_aws/cfm/vpc/one_az_one_public_subnet_vpc.rb +45 -0
  90. data/lib/etude_for_aws/cfm/vpc/one_az_two_public_and_private_subnet_vpc.rb +47 -0
  91. data/lib/etude_for_aws/cfm/vpc/one_az_two_public_subnet_vpc.rb +47 -0
  92. data/lib/etude_for_aws/cfm/vpc/two_az_one_public_subnet_and_private_subnet_vpc.rb +52 -0
  93. data/lib/etude_for_aws/cfm/vpc/two_az_two_private_subnet_vpc.rb +38 -0
  94. data/lib/etude_for_aws/cfm/vpc/two_az_two_public_subnet_and_private_subnet_vpc.rb +38 -0
  95. data/lib/etude_for_aws/cfm/vpc/two_az_two_public_subnet_vpc.rb +38 -0
  96. data/lib/etude_for_aws/cfm/vpc/vpc.rb +104 -0
  97. data/lib/etude_for_aws/ec2/configuration.rb +66 -0
  98. data/lib/etude_for_aws/ec2/ec2.rb +218 -0
  99. data/lib/etude_for_aws/ec2/ec2_api_gateway.rb +127 -0
  100. data/lib/etude_for_aws/ec2/ec2_instance.rb +107 -0
  101. data/lib/etude_for_aws/ec2/key_pair.rb +46 -0
  102. data/lib/etude_for_aws/ec2/security_group.rb +75 -0
  103. data/lib/etude_for_aws/ec2/vpc_interface.rb +11 -0
  104. data/lib/etude_for_aws/helpers/certification_helper.rb +16 -0
  105. data/lib/etude_for_aws/helpers/configuration_helper.rb +103 -0
  106. data/lib/etude_for_aws/tasks/cfm.rake +73 -0
  107. data/lib/etude_for_aws/tasks/ec2.rake +210 -0
  108. data/lib/etude_for_aws/tasks/vpc.rake +47 -0
  109. data/lib/etude_for_aws/version.rb +3 -0
  110. data/lib/etude_for_aws/vpc/configuration.rb +77 -0
  111. data/lib/etude_for_aws/vpc/customer_gateway.rb +28 -0
  112. data/lib/etude_for_aws/vpc/internet_gateway.rb +15 -0
  113. data/lib/etude_for_aws/vpc/route_table.rb +42 -0
  114. data/lib/etude_for_aws/vpc/simple_vpc.rb +57 -0
  115. data/lib/etude_for_aws/vpc/standard_vpc.rb +94 -0
  116. data/lib/etude_for_aws/vpc/subnet.rb +22 -0
  117. data/lib/etude_for_aws/vpc/vpc.rb +147 -0
  118. data/lib/etude_for_aws/vpc/vpc_api_gateway.rb +277 -0
  119. data/lib/etude_for_aws/vpc/vpc_director.rb +43 -0
  120. data/lib/etude_for_aws/vpc/vpn.rb +244 -0
  121. data/lib/etude_for_aws/vpc/vpn_connection.rb +28 -0
  122. data/lib/etude_for_aws/vpc/vpn_director.rb +47 -0
  123. data/lib/etude_for_aws/vpc/vpn_gateway.rb +36 -0
  124. metadata +280 -0
@@ -0,0 +1,19 @@
1
+ VPC
2
+ ---
3
+
4
+ ## 基本仕様
5
+ + 1つのVPCに対して複数のサブネットを持つ
6
+ + 1つのVPCに対して複数のルートテーブルを持つ
7
+ + 1つのVPCに対して1つのインターネットゲートウェイを持つ
8
+ + インターネットゲートウェイを持つルートテーブルに関連付けられてたサブネットはパブリックとなる
9
+ + インターネットゲートウェイを持たないルートテーブルに関連付けられてたサブネットはプライベートとなる
10
+
11
+ ## ユースケース
12
+ ### シンプルなVPC
13
+ ![](./images/simple.png)
14
+
15
+ ### 標準的なVPC
16
+ ![](./images/standard.png)
17
+
18
+ ## コアモデル
19
+ ![](./images/core_model.png)
@@ -0,0 +1,19 @@
1
+ Using the AWS SDK for Ruby REPL
2
+ ---
3
+
4
+ ## 例
5
+ ```bash
6
+ bin/console
7
+ Aws>s3 = Aws::S3::Client.new(region: 'ap-northeast-1a')
8
+ Aws>s3.list_buckets
9
+ ```
10
+
11
+ ## 注意
12
+ 事前に`.env`にAWSクレデンシャルを設定しておく。
13
+
14
+ ## 参照
15
+ + [dotenv](https://github.com/bkeepers/dotenv)
16
+ + [Rubyでシェルコマンドを実行する方法](https://www.xmisao.com/2014/03/01/how-to-execute-a-shell-script-in-ruby.html)
17
+ + [AWS SDK for RubyでのAPI操作をインタラクティブに実行する](http://dev.classmethod.jp/cloud/aws/using-the-aws-sdk-for-ruby-from-repl/)
18
+ + [Getting Started with the AWS SDK for Ruby](http://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v2/developer-guide/getting-started.html)
19
+
File without changes
@@ -0,0 +1,89 @@
1
+ Rake Task
2
+ ---
3
+
4
+ ## 例
5
+ EC2インスタンスの生成と操作
6
+ ```bash
7
+ rake EC2:copy_key_pair # 作成したキーペアをコピーする
8
+ rake EC2:create_simple_vpc_env # シンプルなVPC環境にEC2インスタンスを作成する
9
+ rake EC2:create_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを作成する
10
+ rake EC2:create_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
11
+ rake EC2:create_type02 # 1つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
12
+ rake EC2:create_type03 # 1つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
13
+ rake EC2:create_type04 # 2つのアベイラビリティゾーンに2つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
14
+ rake EC2:create_type05 # 2つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
15
+ rake EC2:create_type06 # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
16
+ rake EC2:create_type07 # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
17
+ rake EC2:destroy_simple_vpc_env # シンプルなVPC環境のEC2インスタンスを削除する
18
+ rake EC2:destroy_standard_vpc_env # 標準的なVPC環境のEC2インスタンスを削除する
19
+ rake EC2:destroy_type01_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
20
+ rake EC2:destroy_type02_env # 1つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
21
+ rake EC2:destroy_type03_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
22
+ rake EC2:destroy_type04_env # 2つのアベイラビリティゾーンに2つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
23
+ rake EC2:destroy_type05_env # 2つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
24
+ rake EC2:destroy_type06_env # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
25
+ rake EC2:destroy_type07_env # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットVPCのVPC環境のEC2インスタンスを削除する
26
+ rake EC2:reboot_simple_vpc_env # シンプルなVPC環境にEC2インスタンス再起動する
27
+ rake EC2:reboot_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを再起動する
28
+ rake EC2:reboot_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを再起動する
29
+ rake EC2:setup_type01_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境を作成する
30
+ rake EC2:start_simple_vpc_env # シンプルなVPC環境にEC2インスタンス起動する
31
+ rake EC2:start_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを起動する
32
+ rake EC2:start_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを起動する
33
+ rake EC2:stop_simple_vpc_env # シンプルなVPC環境にEC2インスタンス停止する
34
+ rake EC2:stop_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを停止する
35
+ rake EC2:stop_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを停止する
36
+ ```
37
+
38
+ VPCの作成
39
+ ```bash
40
+ rake CFM:create_type01_vpc # 1つのアベイラビリティゾーンに1つのパブリックサブネットVPCを作成する
41
+ rake CFM:create_type02_vpc # 1つのアベイラビリティゾーンに2つのパブリックサブネットVPCを作成する
42
+ rake CFM:create_type03_vpc # 1つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットVPCを作成する
43
+ rake CFM:create_type04_vpc # 2つのアベイラビリティゾーンに2つのプライベートサブネットVPCを作成する
44
+ rake CFM:create_type05_vpc # 2つのアベイラビリティゾーンに2つのパブリックサブネットVPCを作成する
45
+ rake CFM:create_type06_vpc # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットVPCを作成する
46
+ rake CFM:create_type07_vpc # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットVPCを作成する
47
+ rake CFM:destroy_type01_vpc # 1つのアベイラビリティゾーンに1つのパブリックサブネットVPCを削除する
48
+ rake CFM:destroy_type02_vpc # 1つのアベイラビリティゾーンに2つのパブリックサブネットVPCを削除する
49
+ rake CFM:destroy_type05_vpc # 2つのアベイラビリティゾーンに2つのパブリックサブネットVPCを削除する
50
+ rake CFM:destroy_type06_vpc # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットVPCを削除する
51
+ rake CFM:destroy_type07_vpc # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットVPCを削除する
52
+ rake EC2:create_simple_vpc_env # シンプルなVPC環境にEC2インスタンスを作成する
53
+ rake EC2:create_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを作成する
54
+ rake EC2:create_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
55
+ rake EC2:create_type02 # 1つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
56
+ rake EC2:create_type03 # 1つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
57
+ rake EC2:create_type04 # 2つのアベイラビリティゾーンに2つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
58
+ rake EC2:create_type05 # 2つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境にEC2インスタンスを作成する
59
+ rake EC2:create_type06 # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
60
+ rake EC2:create_type07 # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットのVPC環境にEC2インスタンスを作成する
61
+ rake EC2:destroy_simple_vpc_env # シンプルなVPC環境のEC2インスタンスを削除する
62
+ rake EC2:destroy_standard_vpc_env # 標準的なVPC環境のEC2インスタンスを削除する
63
+ rake EC2:destroy_type01_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
64
+ rake EC2:destroy_type02_env # 1つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
65
+ rake EC2:destroy_type03_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
66
+ rake EC2:destroy_type04_env # 2つのアベイラビリティゾーンに2つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
67
+ rake EC2:destroy_type05_env # 2つのアベイラビリティゾーンに2つのパブリックサブネットのVPC環境のEC2インスタンスを削除する
68
+ rake EC2:destroy_type06_env # 2つのアベイラビリティゾーンに1つのパブリックサブネットと1つのプライベートサブネットのVPC環境のEC2インスタンスを削除する
69
+ rake EC2:destroy_type07_env # 2つのアベイラビリティゾーンに2つのパブリックサブネットと2つのプライベートサブネットVPCのVPC環境のEC2インスタンスを削除する
70
+ rake EC2:reboot_simple_vpc_env # シンプルなVPC環境にEC2インスタンス再起動する
71
+ rake EC2:reboot_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを再起動する
72
+ rake EC2:reboot_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを再起動する
73
+ rake EC2:setup_type01_env # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境を作成する
74
+ rake EC2:start_simple_vpc_env # シンプルなVPC環境にEC2インスタンス起動する
75
+ rake EC2:start_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを起動する
76
+ rake EC2:start_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを起動する
77
+ rake EC2:stop_simple_vpc_env # シンプルなVPC環境にEC2インスタンス停止する
78
+ rake EC2:stop_standard_vpc_env # 標準的なVPC環境にEC2インスタンスを停止する
79
+ rake EC2:stop_type01 # 1つのアベイラビリティゾーンに1つのパブリックサブネットのVPC環境にEC2インスタンスを停止する
80
+ rake VPC:create_simple_vpc # シンプルなVPCを作成する
81
+ rake VPC:create_standard_vpc # 標準的なVPCを作成する
82
+ rake VPC:destroy_simple_vpc # シンプルなVPCを削除する
83
+ rake VPC:destroy_standard_vpc # 標準的なVPCを削除する
84
+ ```
85
+
86
+ ## 注意
87
+
88
+ ## 参照
89
+ + [Rails ではない場合に gem で定義された Rake Task を呼び出す](http://qiita.com/dany1468/items/ed738709c4db16e1cdfd)
@@ -0,0 +1,9 @@
1
+ CircleCIセットアップ
2
+ ---
3
+
4
+ ## 例
5
+
6
+ ## 注意
7
+ + リードオンリー権限のAWS IAMユーザーを作成してAWS Permissionsにクレデンシャルを設定する。
8
+
9
+ ## 参照
@@ -0,0 +1,20 @@
1
+ Jenkins配置
2
+ ---
3
+
4
+ ## 例
5
+ ```
6
+ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
7
+ ```
8
+ `http://0.0.0.0:9000`に接続してJenkinsをセットアップする
9
+
10
+ Crumb Dataが必要な場合は`http://0.0.0.0:9000/crumbIssuer/api/json`からcrumbを取得する
11
+
12
+ .envファイルをコピーしてテストを動かせるようにする
13
+ ```bash
14
+ sudo cp /vagrant/.env /var/lib/jenkins/workspace/Develop/
15
+ ```
16
+
17
+ ## 注意
18
+ + 仮想マシン環境でセットアップする。
19
+
20
+ ## 参照
@@ -0,0 +1,26 @@
1
+ RubyGemパッケージの配置
2
+ ---
3
+
4
+ ## 例
5
+ ### Gemのビルド
6
+ ```bash
7
+ gem install bundler
8
+ bundle install
9
+ bundle exec rake build
10
+ ```
11
+
12
+ ### .gemファイルを作る
13
+ ```bash
14
+ gem build etude_for_aws.gemspec
15
+ ```
16
+ ### Gemの公開
17
+ ```bash
18
+ gem push etude_for_aws-0.0.0.gem
19
+ ```
20
+
21
+ ## 注意
22
+ + 公開するバージョンは都度更新する
23
+
24
+ ## 参照
25
+ + [Version Badge](https://badge.fury.io/)
26
+ + [RubygemsへのデプロイをCircleCIで自動化してみた](http://leko.jp/archives/871)
@@ -0,0 +1,6 @@
1
+ 名前
2
+ ---
3
+ ## 要約
4
+ ## 理由
5
+ ## 手順
6
+ ## サンプル
@@ -0,0 +1,13 @@
1
+ パターン
2
+ ---
3
+ # 状況
4
+ コンテキスト。どういった状況で発見される問題か
5
+
6
+ # 問題
7
+ パターンによって解決されるべき問題
8
+
9
+ # 空気
10
+ フォース。問題が解決されあないままになっている要因、場を支配する空気
11
+
12
+ # 解決
13
+ 「状況」における「問題」について、取り巻く「空気」を振り払いながら、パターンがどのように解決をもたらすのか
@@ -0,0 +1,6 @@
1
+ 名前(Name)
2
+ ---
3
+
4
+ ## 例(Example)
5
+ ## 注意(Warnings)
6
+ ## 参照(Resources)
@@ -0,0 +1,8 @@
1
+ アプリケーション名
2
+ ---
3
+
4
+ ## 基本仕様
5
+
6
+ ## ユースケース
7
+
8
+ ## コアモデル
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'etude_for_aws/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "etude_for_aws"
8
+ spec.version = EtudeForAws::VERSION
9
+ spec.authors = ["k2works"]
10
+ spec.email = ["kakimomokuri@gmail.com"]
11
+
12
+ spec.summary = %q{Etude for AWS.}
13
+ spec.description = %q{Etude for AWS.}
14
+ spec.homepage = "https://github.com/k2works/etude_for_aws"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ else
22
+ raise "RubyGems 2.0 or newer is required to protect against " \
23
+ "public gem pushes."
24
+ end
25
+
26
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ f.match(%r{^(test|spec|features)/})
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_development_dependency "bundler", "~> 1.14"
34
+ spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "rspec", "~> 3.0"
36
+ spec.add_development_dependency "yard", "~> 0.8"
37
+ spec.add_development_dependency "redcarpet", "~> 3.4"
38
+ spec.add_development_dependency "aws-sdk", "~> 2.9"
39
+ spec.add_development_dependency "dotenv"
40
+ spec.add_development_dependency "pry", "~> 0.10.4"
41
+ end
data/etude_for_aws.iml ADDED
@@ -0,0 +1,42 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$" />
6
+ <orderEntry type="inheritedJdk" />
7
+ <orderEntry type="sourceFolder" forTests="false" />
8
+ <orderEntry type="library" scope="PROVIDED" name="aws-sdk (v2.9.12, rbenv: 2.3.1) [gem]" level="application" />
9
+ <orderEntry type="library" scope="PROVIDED" name="aws-sdk-core (v2.9.12, rbenv: 2.3.1) [gem]" level="application" />
10
+ <orderEntry type="library" scope="PROVIDED" name="aws-sdk-resources (v2.9.12, rbenv: 2.3.1) [gem]" level="application" />
11
+ <orderEntry type="library" scope="PROVIDED" name="aws-sigv4 (v1.0.0, rbenv: 2.3.1) [gem]" level="application" />
12
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v1.14.6, rbenv: 2.3.1) [gem]" level="application" />
13
+ <orderEntry type="library" scope="PROVIDED" name="coderay (v1.1.1, rbenv: 2.3.1) [gem]" level="application" />
14
+ <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.3, rbenv: 2.3.1) [gem]" level="application" />
15
+ <orderEntry type="library" scope="PROVIDED" name="dotenv (v2.1.2, rbenv: 2.3.1) [gem]" level="application" />
16
+ <orderEntry type="library" scope="PROVIDED" name="ffi (v1.9.18, rbenv: 2.3.1) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="formatador (v0.2.5, rbenv: 2.3.1) [gem]" level="application" />
18
+ <orderEntry type="library" scope="PROVIDED" name="guard (v2.14.1, rbenv: 2.3.1) [gem]" level="application" />
19
+ <orderEntry type="library" scope="PROVIDED" name="guard-yard (v2.2.0, rbenv: 2.3.1) [gem]" level="application" />
20
+ <orderEntry type="library" scope="PROVIDED" name="jmespath (v1.3.1, rbenv: 2.3.1) [gem]" level="application" />
21
+ <orderEntry type="library" scope="PROVIDED" name="listen (v3.1.5, rbenv: 2.3.1) [gem]" level="application" />
22
+ <orderEntry type="library" scope="PROVIDED" name="lumberjack (v1.0.11, rbenv: 2.3.1) [gem]" level="application" />
23
+ <orderEntry type="library" scope="PROVIDED" name="method_source (v0.8.2, rbenv: 2.3.1) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="nenv (v0.3.0, rbenv: 2.3.1) [gem]" level="application" />
25
+ <orderEntry type="library" scope="PROVIDED" name="notiffany (v0.1.1, rbenv: 2.3.1) [gem]" level="application" />
26
+ <orderEntry type="library" scope="PROVIDED" name="pry (v0.10.4, rbenv: 2.3.1) [gem]" level="application" />
27
+ <orderEntry type="library" scope="PROVIDED" name="rake (v10.5.0, rbenv: 2.3.1) [gem]" level="application" />
28
+ <orderEntry type="library" scope="PROVIDED" name="rb-fsevent (v0.9.8, rbenv: 2.3.1) [gem]" level="application" />
29
+ <orderEntry type="library" scope="PROVIDED" name="rb-inotify (v0.9.8, rbenv: 2.3.1) [gem]" level="application" />
30
+ <orderEntry type="library" scope="PROVIDED" name="redcarpet (v3.4.0, rbenv: 2.3.1) [gem]" level="application" />
31
+ <orderEntry type="library" scope="PROVIDED" name="rspec (v3.5.0, rbenv: 2.3.1) [gem]" level="application" />
32
+ <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.5.4, rbenv: 2.3.1) [gem]" level="application" />
33
+ <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.5.0, rbenv: 2.3.1) [gem]" level="application" />
34
+ <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.5.0, rbenv: 2.3.1) [gem]" level="application" />
35
+ <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.5.0, rbenv: 2.3.1) [gem]" level="application" />
36
+ <orderEntry type="library" scope="PROVIDED" name="ruby_dep (v1.5.0, rbenv: 2.3.1) [gem]" level="application" />
37
+ <orderEntry type="library" scope="PROVIDED" name="shellany (v0.0.1, rbenv: 2.3.1) [gem]" level="application" />
38
+ <orderEntry type="library" scope="PROVIDED" name="slop (v3.6.0, rbenv: 2.3.1) [gem]" level="application" />
39
+ <orderEntry type="library" scope="PROVIDED" name="thor (v0.19.4, rbenv: 2.3.1) [gem]" level="application" />
40
+ <orderEntry type="library" scope="PROVIDED" name="yard (v0.9.9, rbenv: 2.3.1) [gem]" level="application" />
41
+ </component>
42
+ </module>
data/exe/etude_for_aws ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "etude_for_aws"
@@ -0,0 +1,38 @@
1
+ require 'etude_for_aws/version'
2
+ require 'etude_for_aws/helpers/certification_helper'
3
+ require 'etude_for_aws/helpers/configuration_helper'
4
+ require 'etude_for_aws/ec2/vpc_interface'
5
+ require 'etude_for_aws/cfm/configuration'
6
+ require 'etude_for_aws/cfm/vpc/vpc'
7
+ require 'etude_for_aws/cfm/vpc/null_vpc'
8
+ require 'etude_for_aws/cfm/vpc/one_az_one_public_subnet_vpc'
9
+ require 'etude_for_aws/cfm/vpc/one_az_two_public_subnet_vpc'
10
+ require 'etude_for_aws/cfm/vpc/one_az_two_public_and_private_subnet_vpc'
11
+ require 'etude_for_aws/cfm/vpc/two_az_two_private_subnet_vpc'
12
+ require 'etude_for_aws/cfm/vpc/two_az_two_public_subnet_vpc'
13
+ require 'etude_for_aws/cfm/vpc/two_az_one_public_subnet_and_private_subnet_vpc'
14
+ require 'etude_for_aws/cfm/vpc/two_az_two_public_subnet_and_private_subnet_vpc'
15
+ require 'etude_for_aws/vpc/vpc_api_gateway'
16
+ require 'etude_for_aws/vpc/configuration'
17
+ require 'etude_for_aws/vpc/vpc'
18
+ require 'etude_for_aws/vpc/subnet'
19
+ require 'etude_for_aws/vpc/internet_gateway'
20
+ require 'etude_for_aws/vpc/route_table'
21
+ require 'etude_for_aws/vpc/vpc_director'
22
+ require 'etude_for_aws/vpc/simple_vpc'
23
+ require 'etude_for_aws/vpc/standard_vpc'
24
+ require 'etude_for_aws/vpc/vpn'
25
+ require 'etude_for_aws/vpc/customer_gateway'
26
+ require 'etude_for_aws/vpc/vpn_gateway'
27
+ require 'etude_for_aws/vpc/vpn_connection'
28
+ require 'etude_for_aws/vpc/vpn_director'
29
+ require 'etude_for_aws/ec2/ec2_api_gateway'
30
+ require 'etude_for_aws/ec2/configuration'
31
+ require 'etude_for_aws/ec2/ec2'
32
+ require 'etude_for_aws/ec2/security_group'
33
+ require 'etude_for_aws/ec2/key_pair'
34
+ require 'etude_for_aws/ec2/ec2_instance'
35
+
36
+ module EtudeForAws
37
+ # Your code goes here...
38
+ end
@@ -0,0 +1,39 @@
1
+ module CFM
2
+ class Configuration
3
+ include CertificationHelper
4
+ include ConfigurationHelper
5
+
6
+ attr_accessor :stack_name,
7
+ :template,
8
+ :stack_tag_value,
9
+ :stack_id,
10
+ :yaml,
11
+ :template_path,
12
+ :parameters,
13
+ :azs,
14
+ :vpc_id
15
+
16
+ def initialize
17
+ aws_certificate
18
+ @yaml = ConfigurationHelper.load_yaml_file
19
+ @stack_name = get_yaml_stack_name
20
+ @stack_tag_value = get_yaml_stack_tag_value
21
+ @template_path = get_yaml_template_path
22
+ @azs = get_yaml_zas
23
+ end
24
+
25
+ def get_template_file(type)
26
+ get_yaml_template_file(type)
27
+ end
28
+
29
+ def create_client
30
+ Aws::CloudFormation::Client.new
31
+ end
32
+ end
33
+
34
+ class ConfigurationStub < Configuration
35
+ def create_client
36
+ Aws::CloudFormation::Client.new(stub_responses: true)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,529 @@
1
+ {
2
+ "AWSTemplateFormatVersion": "2010-09-09",
3
+ "Description": "AWS CloudFormation Sample Template.",
4
+ "Parameters" : {
5
+ "AZ1" : {
6
+ "Default" : "ap-northeast-1a",
7
+ "Description" : "AZ",
8
+ "Type" : "String",
9
+ "AllowedValues" : [ "ap-northeast-1a","ap-northeast-1c","us-west-2a","us-west-2b","us-west-2c" ],
10
+ "ConstraintDescription" : "must select a valid availability zone."
11
+ }
12
+ },
13
+ "Resources": {
14
+ "VPC": {
15
+ "Type": "AWS::EC2::VPC",
16
+ "Properties": {
17
+ "CidrBlock": "10.0.0.0/16",
18
+ "Tags": [
19
+ {
20
+ "Key": "Application",
21
+ "Value": {
22
+ "Ref": "AWS::StackId"
23
+ }
24
+ }
25
+ ]
26
+ },
27
+ "Metadata": {
28
+ "AWS::CloudFormation::Designer": {
29
+ "id": "ab8adda6-4951-48c5-9f86-d57e61a33616"
30
+ }
31
+ }
32
+ },
33
+ "Subnet": {
34
+ "Type": "AWS::EC2::Subnet",
35
+ "Properties": {
36
+ "VpcId": {
37
+ "Ref": "VPC"
38
+ },
39
+ "CidrBlock": "10.0.0.0/24",
40
+ "AvailabilityZone": {"Ref": "AZ1"},
41
+ "Tags": [
42
+ {
43
+ "Key": "Application",
44
+ "Value": {
45
+ "Ref": "AWS::StackId"
46
+ }
47
+ }
48
+ ]
49
+ },
50
+ "Metadata": {
51
+ "AWS::CloudFormation::Designer": {
52
+ "id": "d5f991d6-ff02-459b-a9ac-9313872b192a"
53
+ }
54
+ }
55
+ },
56
+ "InternetGateway": {
57
+ "Type": "AWS::EC2::InternetGateway",
58
+ "Properties": {
59
+ "Tags": [
60
+ {
61
+ "Key": "Application",
62
+ "Value": {
63
+ "Ref": "AWS::StackId"
64
+ }
65
+ }
66
+ ]
67
+ },
68
+ "Metadata": {
69
+ "AWS::CloudFormation::Designer": {
70
+ "id": "bd204b2e-d771-423d-b093-7991bd2d401e"
71
+ }
72
+ }
73
+ },
74
+ "AttachGateway": {
75
+ "Type": "AWS::EC2::VPCGatewayAttachment",
76
+ "Properties": {
77
+ "VpcId": {
78
+ "Ref": "VPC"
79
+ },
80
+ "InternetGatewayId": {
81
+ "Ref": "InternetGateway"
82
+ }
83
+ },
84
+ "Metadata": {
85
+ "AWS::CloudFormation::Designer": {
86
+ "id": "3544dd6c-cbe4-4f28-8f6f-8d91d93daa8f"
87
+ }
88
+ }
89
+ },
90
+ "RouteTable": {
91
+ "Type": "AWS::EC2::RouteTable",
92
+ "Properties": {
93
+ "VpcId": {
94
+ "Ref": "VPC"
95
+ },
96
+ "Tags": [
97
+ {
98
+ "Key": "Application",
99
+ "Value": {
100
+ "Ref": "AWS::StackId"
101
+ }
102
+ }
103
+ ]
104
+ },
105
+ "Metadata": {
106
+ "AWS::CloudFormation::Designer": {
107
+ "id": "a13e2dc0-81df-4ba3-a944-683f2d500540"
108
+ }
109
+ }
110
+ },
111
+ "Route": {
112
+ "Type": "AWS::EC2::Route",
113
+ "DependsOn": "AttachGateway",
114
+ "Properties": {
115
+ "RouteTableId": {
116
+ "Ref": "RouteTable"
117
+ },
118
+ "DestinationCidrBlock": "0.0.0.0/0",
119
+ "GatewayId": {
120
+ "Ref": "InternetGateway"
121
+ }
122
+ },
123
+ "Metadata": {
124
+ "AWS::CloudFormation::Designer": {
125
+ "id": "d67c560a-5a80-45e6-b923-12ef9788e6b4"
126
+ }
127
+ }
128
+ },
129
+ "SubnetRouteTableAssociation": {
130
+ "Type": "AWS::EC2::SubnetRouteTableAssociation",
131
+ "Properties": {
132
+ "SubnetId": {
133
+ "Ref": "Subnet"
134
+ },
135
+ "RouteTableId": {
136
+ "Ref": "RouteTable"
137
+ }
138
+ },
139
+ "Metadata": {
140
+ "AWS::CloudFormation::Designer": {
141
+ "id": "79b72fb3-5594-4c04-b410-c5b618aa8b38"
142
+ }
143
+ }
144
+ },
145
+ "NetworkAcl": {
146
+ "Type": "AWS::EC2::NetworkAcl",
147
+ "Properties": {
148
+ "VpcId": {
149
+ "Ref": "VPC"
150
+ },
151
+ "Tags": [
152
+ {
153
+ "Key": "Application",
154
+ "Value": {
155
+ "Ref": "AWS::StackId"
156
+ }
157
+ }
158
+ ]
159
+ },
160
+ "Metadata": {
161
+ "AWS::CloudFormation::Designer": {
162
+ "id": "46a052c5-d0ae-4754-8490-4aaae2d672ab"
163
+ }
164
+ }
165
+ },
166
+ "InboundHTTPNetworkAclEntry": {
167
+ "Type": "AWS::EC2::NetworkAclEntry",
168
+ "Properties": {
169
+ "NetworkAclId": {
170
+ "Ref": "NetworkAcl"
171
+ },
172
+ "RuleNumber": "100",
173
+ "Protocol": "6",
174
+ "RuleAction": "allow",
175
+ "Egress": "false",
176
+ "CidrBlock": "0.0.0.0/0",
177
+ "PortRange": {
178
+ "From": "80",
179
+ "To": "80"
180
+ }
181
+ },
182
+ "Metadata": {
183
+ "AWS::CloudFormation::Designer": {
184
+ "id": "1bd95f87-13c7-4915-867e-bf0e4a8cb060"
185
+ }
186
+ }
187
+ },
188
+ "InboundSSHNetworkAclEntry": {
189
+ "Type": "AWS::EC2::NetworkAclEntry",
190
+ "Properties": {
191
+ "NetworkAclId": {
192
+ "Ref": "NetworkAcl"
193
+ },
194
+ "RuleNumber": "101",
195
+ "Protocol": "6",
196
+ "RuleAction": "allow",
197
+ "Egress": "false",
198
+ "CidrBlock": "0.0.0.0/0",
199
+ "PortRange": {
200
+ "From": "22",
201
+ "To": "22"
202
+ }
203
+ },
204
+ "Metadata": {
205
+ "AWS::CloudFormation::Designer": {
206
+ "id": "55127ca8-ccef-4b5e-8cf6-6cc1cc3c15b3"
207
+ }
208
+ }
209
+ },
210
+ "InboundResponsePortsNetworkAclEntry": {
211
+ "Type": "AWS::EC2::NetworkAclEntry",
212
+ "Properties": {
213
+ "NetworkAclId": {
214
+ "Ref": "NetworkAcl"
215
+ },
216
+ "RuleNumber": "102",
217
+ "Protocol": "6",
218
+ "RuleAction": "allow",
219
+ "Egress": "false",
220
+ "CidrBlock": "0.0.0.0/0",
221
+ "PortRange": {
222
+ "From": "1024",
223
+ "To": "65535"
224
+ }
225
+ },
226
+ "Metadata": {
227
+ "AWS::CloudFormation::Designer": {
228
+ "id": "73ac814c-fbec-4381-9ea9-af1116be65b2"
229
+ }
230
+ }
231
+ },
232
+ "OutBoundHTTPNetworkAclEntry": {
233
+ "Type": "AWS::EC2::NetworkAclEntry",
234
+ "Properties": {
235
+ "NetworkAclId": {
236
+ "Ref": "NetworkAcl"
237
+ },
238
+ "RuleNumber": "100",
239
+ "Protocol": "6",
240
+ "RuleAction": "allow",
241
+ "Egress": "true",
242
+ "CidrBlock": "0.0.0.0/0",
243
+ "PortRange": {
244
+ "From": "80",
245
+ "To": "80"
246
+ }
247
+ },
248
+ "Metadata": {
249
+ "AWS::CloudFormation::Designer": {
250
+ "id": "87d84388-9f0b-4d1f-a0b0-41142048dc1e"
251
+ }
252
+ }
253
+ },
254
+ "OutBoundHTTPSNetworkAclEntry": {
255
+ "Type": "AWS::EC2::NetworkAclEntry",
256
+ "Properties": {
257
+ "NetworkAclId": {
258
+ "Ref": "NetworkAcl"
259
+ },
260
+ "RuleNumber": "101",
261
+ "Protocol": "6",
262
+ "RuleAction": "allow",
263
+ "Egress": "true",
264
+ "CidrBlock": "0.0.0.0/0",
265
+ "PortRange": {
266
+ "From": "443",
267
+ "To": "443"
268
+ }
269
+ },
270
+ "Metadata": {
271
+ "AWS::CloudFormation::Designer": {
272
+ "id": "f7e2e791-29fe-4713-b359-c67fa615fa80"
273
+ }
274
+ }
275
+ },
276
+ "OutBoundResponsePortsNetworkAclEntry": {
277
+ "Type": "AWS::EC2::NetworkAclEntry",
278
+ "Properties": {
279
+ "NetworkAclId": {
280
+ "Ref": "NetworkAcl"
281
+ },
282
+ "RuleNumber": "102",
283
+ "Protocol": "6",
284
+ "RuleAction": "allow",
285
+ "Egress": "true",
286
+ "CidrBlock": "0.0.0.0/0",
287
+ "PortRange": {
288
+ "From": "1024",
289
+ "To": "65535"
290
+ }
291
+ },
292
+ "Metadata": {
293
+ "AWS::CloudFormation::Designer": {
294
+ "id": "ff5fd4ee-e72d-4d17-a4f2-daca784d876f"
295
+ }
296
+ }
297
+ },
298
+ "SubnetNetworkAclAssociation": {
299
+ "Type": "AWS::EC2::SubnetNetworkAclAssociation",
300
+ "Properties": {
301
+ "SubnetId": {
302
+ "Ref": "Subnet"
303
+ },
304
+ "NetworkAclId": {
305
+ "Ref": "NetworkAcl"
306
+ }
307
+ },
308
+ "Metadata": {
309
+ "AWS::CloudFormation::Designer": {
310
+ "id": "daaa2c06-12a6-4ebc-a9ab-ea684849268b"
311
+ }
312
+ }
313
+ }
314
+ },
315
+ "Outputs": {
316
+ "VPCID" : {
317
+ "Value" : { "Ref" : "VPC" },
318
+ "Description" : "VPC ID"
319
+ },
320
+ "SUBNETPUB1" : {
321
+ "Value" : { "Ref" : "Subnet" },
322
+ "Description" : "PublicSubnet1"
323
+ }
324
+ },
325
+ "Metadata": {
326
+ "AWS::CloudFormation::Designer": {
327
+ "bd204b2e-d771-423d-b093-7991bd2d401e": {
328
+ "size": {
329
+ "width": 60,
330
+ "height": 60
331
+ },
332
+ "position": {
333
+ "x": 1010,
334
+ "y": 670
335
+ },
336
+ "z": 1,
337
+ "embeds": []
338
+ },
339
+ "ab8adda6-4951-48c5-9f86-d57e61a33616": {
340
+ "size": {
341
+ "width": 780,
342
+ "height": 780
343
+ },
344
+ "position": {
345
+ "x": 60,
346
+ "y": 90
347
+ },
348
+ "z": 1,
349
+ "embeds": [
350
+ "46a052c5-d0ae-4754-8490-4aaae2d672ab",
351
+ "a13e2dc0-81df-4ba3-a944-683f2d500540",
352
+ "d5f991d6-ff02-459b-a9ac-9313872b192a"
353
+ ]
354
+ },
355
+ "46a052c5-d0ae-4754-8490-4aaae2d672ab": {
356
+ "size": {
357
+ "width": 420,
358
+ "height": 330
359
+ },
360
+ "position": {
361
+ "x": 90,
362
+ "y": 150
363
+ },
364
+ "z": 2,
365
+ "parent": "ab8adda6-4951-48c5-9f86-d57e61a33616",
366
+ "embeds": [
367
+ "ff5fd4ee-e72d-4d17-a4f2-daca784d876f",
368
+ "f7e2e791-29fe-4713-b359-c67fa615fa80",
369
+ "87d84388-9f0b-4d1f-a0b0-41142048dc1e",
370
+ "73ac814c-fbec-4381-9ea9-af1116be65b2",
371
+ "55127ca8-ccef-4b5e-8cf6-6cc1cc3c15b3",
372
+ "1bd95f87-13c7-4915-867e-bf0e4a8cb060"
373
+ ]
374
+ },
375
+ "ff5fd4ee-e72d-4d17-a4f2-daca784d876f": {
376
+ "size": {
377
+ "width": 60,
378
+ "height": 60
379
+ },
380
+ "position": {
381
+ "x": 120,
382
+ "y": 210
383
+ },
384
+ "z": 3,
385
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
386
+ "embeds": []
387
+ },
388
+ "f7e2e791-29fe-4713-b359-c67fa615fa80": {
389
+ "size": {
390
+ "width": 60,
391
+ "height": 60
392
+ },
393
+ "position": {
394
+ "x": 240,
395
+ "y": 210
396
+ },
397
+ "z": 3,
398
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
399
+ "embeds": []
400
+ },
401
+ "87d84388-9f0b-4d1f-a0b0-41142048dc1e": {
402
+ "size": {
403
+ "width": 60,
404
+ "height": 60
405
+ },
406
+ "position": {
407
+ "x": 120,
408
+ "y": 330
409
+ },
410
+ "z": 3,
411
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
412
+ "embeds": []
413
+ },
414
+ "73ac814c-fbec-4381-9ea9-af1116be65b2": {
415
+ "size": {
416
+ "width": 60,
417
+ "height": 60
418
+ },
419
+ "position": {
420
+ "x": 240,
421
+ "y": 330
422
+ },
423
+ "z": 3,
424
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
425
+ "embeds": []
426
+ },
427
+ "55127ca8-ccef-4b5e-8cf6-6cc1cc3c15b3": {
428
+ "size": {
429
+ "width": 60,
430
+ "height": 60
431
+ },
432
+ "position": {
433
+ "x": 360,
434
+ "y": 210
435
+ },
436
+ "z": 3,
437
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
438
+ "embeds": []
439
+ },
440
+ "1bd95f87-13c7-4915-867e-bf0e4a8cb060": {
441
+ "size": {
442
+ "width": 60,
443
+ "height": 60
444
+ },
445
+ "position": {
446
+ "x": 360,
447
+ "y": 330
448
+ },
449
+ "z": 3,
450
+ "parent": "46a052c5-d0ae-4754-8490-4aaae2d672ab",
451
+ "embeds": []
452
+ },
453
+ "a13e2dc0-81df-4ba3-a944-683f2d500540": {
454
+ "size": {
455
+ "width": 240,
456
+ "height": 240
457
+ },
458
+ "position": {
459
+ "x": 390,
460
+ "y": 540
461
+ },
462
+ "z": 2,
463
+ "parent": "ab8adda6-4951-48c5-9f86-d57e61a33616",
464
+ "embeds": [
465
+ "d67c560a-5a80-45e6-b923-12ef9788e6b4"
466
+ ]
467
+ },
468
+ "3544dd6c-cbe4-4f28-8f6f-8d91d93daa8f": {
469
+ "source": {
470
+ "id": "bd204b2e-d771-423d-b093-7991bd2d401e"
471
+ },
472
+ "target": {
473
+ "id": "ab8adda6-4951-48c5-9f86-d57e61a33616"
474
+ },
475
+ "z": 1
476
+ },
477
+ "d67c560a-5a80-45e6-b923-12ef9788e6b4": {
478
+ "size": {
479
+ "width": 60,
480
+ "height": 60
481
+ },
482
+ "position": {
483
+ "x": 420,
484
+ "y": 600
485
+ },
486
+ "z": 3,
487
+ "parent": "a13e2dc0-81df-4ba3-a944-683f2d500540",
488
+ "embeds": [],
489
+ "references": [
490
+ "bd204b2e-d771-423d-b093-7991bd2d401e"
491
+ ],
492
+ "dependson": [
493
+ "3544dd6c-cbe4-4f28-8f6f-8d91d93daa8f"
494
+ ]
495
+ },
496
+ "d5f991d6-ff02-459b-a9ac-9313872b192a": {
497
+ "size": {
498
+ "width": 240,
499
+ "height": 240
500
+ },
501
+ "position": {
502
+ "x": 90,
503
+ "y": 540
504
+ },
505
+ "z": 2,
506
+ "parent": "ab8adda6-4951-48c5-9f86-d57e61a33616",
507
+ "embeds": []
508
+ },
509
+ "daaa2c06-12a6-4ebc-a9ab-ea684849268b": {
510
+ "source": {
511
+ "id": "46a052c5-d0ae-4754-8490-4aaae2d672ab"
512
+ },
513
+ "target": {
514
+ "id": "d5f991d6-ff02-459b-a9ac-9313872b192a"
515
+ },
516
+ "z": 2
517
+ },
518
+ "79b72fb3-5594-4c04-b410-c5b618aa8b38": {
519
+ "source": {
520
+ "id": "a13e2dc0-81df-4ba3-a944-683f2d500540"
521
+ },
522
+ "target": {
523
+ "id": "d5f991d6-ff02-459b-a9ac-9313872b192a"
524
+ },
525
+ "z": 2
526
+ }
527
+ }
528
+ }
529
+ }