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,218 @@
1
+ module EC2
2
+ class Ec2
3
+ attr_reader :config,:gateway,:security_group,:key_pair,:ec2_instances
4
+
5
+ def initialize(vpc)
6
+ @config = Configuration.new
7
+ @gateway = Ec2ApiGateway.new
8
+ setup_config(vpc)
9
+ end
10
+
11
+ def create
12
+
13
+ create_security_group
14
+
15
+ create_key_pair
16
+
17
+ create_ec2_instance
18
+
19
+ end
20
+
21
+ def destroy
22
+
23
+ terminate_ec2_instance
24
+
25
+ delete_security_group
26
+
27
+ delete_key_pair
28
+
29
+ end
30
+
31
+ def start
32
+ @ec2_instances.each do |ec2_instance|
33
+ ec2_instance.start
34
+ end
35
+ end
36
+
37
+ def stop
38
+ @ec2_instances.each do |ec2_instance|
39
+ ec2_instance.stop
40
+ end
41
+ end
42
+
43
+ def reboot
44
+ @ec2_instances.each do |ec2_instance|
45
+ ec2_instance.reboot
46
+ end
47
+ end
48
+
49
+ private
50
+ def setup_config(vpc)
51
+ @config.vpc_id = vpc.get_vpc_id
52
+ @subnet_infos = vpc.get_subnet_infos
53
+ @security_group = SecurityGroup.new(self)
54
+ @key_pair = KeyPair.new(self)
55
+
56
+ @ec2_instances = []
57
+ @config.instance_tags_public.each do |tag|
58
+ @config.instance_tags = tag
59
+ values = [@config.instance_tags[0][:value]]
60
+ instance_ids = @gateway.get_instance_collection(values)
61
+ instance_ids.each do |instance_id|
62
+ ec2_instance = Ec2Instance.new(self, instance_id)
63
+ @ec2_instances << ec2_instance
64
+ end
65
+ end
66
+
67
+ @config.instance_tags_private.each do |tag|
68
+ @config.instance_tags = tag
69
+ values = [@config.instance_tags[0][:value]]
70
+ instance_ids = @gateway.get_instance_collection(values)
71
+ instance_ids.each do |instance_id|
72
+ ec2_instance = Ec2Instance.new(self, instance_id)
73
+ @ec2_instances << ec2_instance
74
+ end
75
+ end
76
+ end
77
+
78
+ def create_security_group
79
+ @security_group.create
80
+ end
81
+
82
+ def create_key_pair
83
+ @key_pair.create
84
+ end
85
+
86
+ def create_ec2_instance
87
+ private_i = 0
88
+ public_i = 0
89
+ @subnet_infos.each do |info|
90
+ @config.subnet_id = info[:subnet_id]
91
+ @config.az = info[:az]
92
+ if info[:network] == 'Private'
93
+ @config.instance_tags = @config.instance_tags_private[private_i]
94
+ private_i += private_i
95
+ else
96
+ @config.instance_tags = @config.instance_tags_public[public_i]
97
+ public_i += public_i
98
+ end
99
+ ec2_instance = Ec2Instance.new(self)
100
+ ec2_instance.create(@security_group,@key_pair)
101
+ @ec2_instances << ec2_instance
102
+ end
103
+ end
104
+
105
+ def terminate_ec2_instance
106
+ @ec2_instances.each do |ec2_instance|
107
+ ec2_instance.terminate
108
+ end
109
+ end
110
+
111
+ def delete_security_group
112
+ @security_group = nil if @security_group.delete.nil?
113
+ end
114
+
115
+ def delete_key_pair
116
+ @key_pair.delete
117
+ @key_pair = nil
118
+ end
119
+ end
120
+
121
+ class Ec2Stub < Ec2
122
+ def initialize(vpc)
123
+ @config = ConfigurationStub.new
124
+ @gateway = Ec2ApiGatewayStub.new
125
+ setup_config(vpc)
126
+ end
127
+
128
+ def start
129
+ instance_id = 'String'
130
+ @gateway.client.stub_responses(:describe_instances,
131
+ {
132
+ reservations: [
133
+ {
134
+ instances: [
135
+ instance_id: instance_id,
136
+ state: {'code':89}
137
+ ]
138
+ }
139
+ ]
140
+ })
141
+ @ec2_instances << Ec2Instance.new(self, instance_id)
142
+ super
143
+ end
144
+
145
+ def reboot
146
+ instance_id = 'String'
147
+ @gateway.client.stub_responses(:describe_instances,
148
+ {
149
+ reservations: [
150
+ {
151
+ instances: [
152
+ instance_id: instance_id,
153
+ state: {'code':16}
154
+ ]
155
+ }
156
+ ]
157
+ })
158
+ @ec2_instances << Ec2Instance.new(self, instance_id)
159
+ super
160
+ end
161
+
162
+ def stop
163
+ instance_id = 'String'
164
+ @gateway.client.stub_responses(:describe_instances,
165
+ {
166
+ reservations: [
167
+ {
168
+ instances: [
169
+ instance_id: instance_id,
170
+ state: {'code':16}
171
+ ]
172
+ }
173
+ ]
174
+ })
175
+ @ec2_instances << Ec2Instance.new(self, instance_id)
176
+ super
177
+ end
178
+
179
+ private
180
+ def create_security_group
181
+ super
182
+ end
183
+
184
+ def create_key_pair
185
+ super
186
+ end
187
+
188
+ def create_ec2_instance
189
+ super
190
+ end
191
+
192
+ def terminate_ec2_instance
193
+ @gateway.client.stub_responses(:describe_instances,
194
+ {
195
+ reservations: [
196
+ {
197
+ instances: [
198
+ instance_id: 'String',
199
+ state: {'code':16}
200
+ ]
201
+ }
202
+ ]
203
+ })
204
+ @ec2_instances.first.instance_variable_set :@instance_id,'String' unless @ec2_instances.first.nil?
205
+ super
206
+ @ec2_instances = []
207
+ end
208
+
209
+ def delete_security_group
210
+ super
211
+ @security_group = nil
212
+ end
213
+
214
+ def delete_key_pair
215
+ super
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,127 @@
1
+ module EC2
2
+ class Ec2ApiGateway
3
+ include CertificationHelper
4
+
5
+ attr_reader :client,:resource,:stub
6
+
7
+ def initialize
8
+ aws_certificate
9
+ @client = Aws::EC2::Client.new
10
+ @resource = Aws::EC2::Resource.new(client: client)
11
+ @stub = false
12
+ end
13
+
14
+ def stub?
15
+ @stub
16
+ end
17
+
18
+ def get_instance_collection(values)
19
+ instance_ids = []
20
+ resp = @client.describe_instances(filters: [{name: "tag:Name", values: values}])
21
+ resp.reservations.each do |reservation|
22
+ reservation.instances.each do |instance|
23
+ instance_ids << instance.instance_id
24
+ end
25
+ end
26
+ instance_ids
27
+ end
28
+
29
+ def get_group_id(security_group)
30
+ group_id = nil
31
+ @resource.security_groups.each do |sg|
32
+ if sg.group_name == security_group[:group_name]
33
+ group_id = sg.group_id
34
+ end
35
+ end
36
+ group_id
37
+ end
38
+
39
+ def select_key_pairs
40
+ @client.describe_key_pairs
41
+ end
42
+
43
+ def find_instance_by_id(instance_id)
44
+ @resource.instance(instance_id)
45
+ end
46
+
47
+ def create_security_group(security_group)
48
+ resp = @resource.create_security_group(security_group)
49
+ resp.id
50
+ end
51
+
52
+ def authorize_egress(id,authorize_egress)
53
+ sg = @resource.security_group(id)
54
+ sg.authorize_egress(authorize_egress)
55
+ end
56
+
57
+ def authorize_ingress(id,authorize_ingress)
58
+ sg = @resource.security_group(id)
59
+ sg.authorize_ingress(authorize_ingress)
60
+ end
61
+
62
+ def delete_security_group(security_group_id)
63
+ @client.delete_security_group({
64
+ group_id: security_group_id,
65
+ })
66
+ end
67
+
68
+ def create_key_pairs(key_pair_name)
69
+ @client.create_key_pair({
70
+ key_name: key_pair_name
71
+ })
72
+ end
73
+
74
+ def create_instances(image_id,min_count,max_count,key_pair_name,security_group,encoded_script,instance_type,config)
75
+ @resource.create_instances({
76
+ image_id: image_id,
77
+ min_count: min_count,
78
+ max_count: max_count,
79
+ key_name: key_pair_name,
80
+ user_data: encoded_script,
81
+ instance_type: instance_type,
82
+ placement: {
83
+ availability_zone: config.az
84
+ },
85
+ network_interfaces: [
86
+ {
87
+ device_index: 0,
88
+ subnet_id: config.subnet_id,
89
+ associate_public_ip_address: true,
90
+ groups: [security_group.security_group_id],
91
+ },
92
+ ],
93
+ })
94
+ end
95
+
96
+ def delete_key_pairs(key_pair_name)
97
+ @client.delete_key_pair({
98
+ key_name: key_pair_name
99
+ })
100
+ end
101
+
102
+ def wait_for_instance_status_ok(instance_id)
103
+ @resource.client.wait_until(:instance_status_ok, {instance_ids: [instance_id]}) unless stub?
104
+ end
105
+
106
+ def wait_for_instance_terminated(instance_id)
107
+ @resource.client.wait_until(:instance_terminated, {instance_ids: [instance_id]}) unless stub?
108
+ end
109
+
110
+ def wait_for_instance_running(instance_id)
111
+ @resource.client.wait_until(:instance_running, {instance_ids: [instance_id]}) unless stub?
112
+ end
113
+
114
+ def wait_for_instance_stopped(instance_id)
115
+ @resource.client.wait_until(:instance_stopped, {instance_ids: [instance_id]}) unless stub?
116
+ end
117
+
118
+ end
119
+
120
+ class Ec2ApiGatewayStub < Ec2ApiGateway
121
+ def initialize
122
+ @client = Aws::EC2::Client.new(stub_responses: true)
123
+ @resource = Aws::EC2::Resource.new(stub_responses: true,client: client)
124
+ @stub = true
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,107 @@
1
+ module EC2
2
+ class Ec2Instance
3
+ attr_reader :instance_id
4
+
5
+ def initialize(ec2,instance_id=nil)
6
+ @config = ec2.config
7
+ @gateway = ec2.gateway
8
+ script = ''
9
+ @encoded_script = Base64.encode64(script)
10
+ @image_id = @config.image_id
11
+ @instance_type = @config.instance_type
12
+ @min_count = @config.min_count
13
+ @max_count = @config.max_count
14
+ @instance_tags = @config.instance_tags
15
+ @instance_id = instance_id
16
+ end
17
+
18
+ def create(security_group,key_pair)
19
+ instance = @gateway.create_instances(@image_id,
20
+ @min_count,
21
+ @max_count,
22
+ key_pair.key_pair_name,
23
+ security_group,
24
+ @encoded_script,
25
+ @instance_type,
26
+ @config)
27
+
28
+ instance.empty? ? @instance_id = nil : @instance_id = instance.first.id
29
+ @gateway.wait_for_instance_status_ok(@instance_id)
30
+ instance.create_tags({tags: @instance_tags})
31
+ instance
32
+ end
33
+
34
+ def terminate
35
+ i = @gateway.find_instance_by_id(@instance_id)
36
+
37
+ unless i.nil?
38
+ if i.exists?
39
+ case i.state.code
40
+ when 48 # terminated
41
+ puts "#{@instance_id} is already terminated"
42
+ else
43
+ i.terminate
44
+ @gateway.wait_for_instance_terminated(@instance_id)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def start
51
+ i = @gateway.find_instance_by_id(@instance_id)
52
+
53
+ unless i.nil?
54
+ if i.exists?
55
+ case i.state.code
56
+ when 0 # pending
57
+ puts "#{instance_id} is pending, so it will be running in a bit"
58
+ when 16 # started
59
+ puts "#{instance_id} is already started"
60
+ when 48 # terminated
61
+ puts "#{instance_id} is terminated, so you cannot start it"
62
+ else
63
+ puts "#{instance_id} is starting"
64
+ i.start
65
+ @gateway.wait_for_instance_running(instance_id)
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ def stop
72
+ i = @gateway.find_instance_by_id(@instance_id)
73
+
74
+ unless i.nil?
75
+ if i.exists?
76
+ case i.state.code
77
+ when 48 # terminated
78
+ puts "#{instance_id} is terminated, so you cannot stop it"
79
+ when 64 # stopping
80
+ puts "#{instance_id} is stopping, so it will be stopped in a bit"
81
+ when 89 # stopped
82
+ puts "#{instance_id} is already stopped"
83
+ else
84
+ puts "#{instance_id} is stopping"
85
+ i.stop
86
+ @gateway.wait_for_instance_stopped(instance_id)
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ def reboot
93
+ i = @gateway.find_instance_by_id(@instance_id)
94
+
95
+ if i.exists?
96
+ case i.state.code
97
+ when 48 # terminated
98
+ puts "#{instance_id} is terminated, so you cannot reboot it"
99
+ else
100
+ puts "#{instance_id} is rebooting"
101
+ i.reboot
102
+ @gateway.wait_for_instance_status_ok(instance_id)
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end