cap-ec2 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 092240e7eaab751a6904e3aca76edf76f9d2465d
4
+ data.tar.gz: 1749028233473e4273d3e9179c748ddb9531ea78
5
+ SHA512:
6
+ metadata.gz: f82a05e873cea98c83b7512d306e39e6db38fe627747c53ade46b2c2ada8c60972f71f4460837b4cf1788ad7f275ee90d19a3faa9fb265bdde02edef017f0df3
7
+ data.tar.gz: 4e40c794ca64fe95890df5f0d83795f2c2bb63dcc530fa62a00f74e30f53563b2ad40dc394888d013cf7d8ded7f68f1aedd51b226d4dec1d4d6d8c6263f97429
@@ -1,5 +1,10 @@
1
1
  # Cap-EC2 changelog
2
2
 
3
+ ## 0.0.8
4
+
5
+ * Made `config/ec2.yml` optional, set all options by Capistrano variable. [@rjocoleman](https://github.com/rjocoleman)
6
+ * Remove requirement for default region to be set. [@rjocoleman](https://github.com/rjocoleman)
7
+
3
8
  ## 0.0.7
4
9
 
5
10
  * Removed monkey patching of `Capistrano::TaskEnhancements` [@rjocoleman](https://github.com/rjocoleman)
@@ -29,4 +34,4 @@
29
34
 
30
35
  ## 0.0.1
31
36
 
32
- * Initial release
37
+ * Initial release
data/README.md CHANGED
@@ -2,23 +2,22 @@
2
2
 
3
3
  [![Code Climate](https://codeclimate.com/github/forward3d/cap-ec2.png)](https://codeclimate.com/github/forward3d/cap-ec2)
4
4
 
5
- Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags,
5
+ Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags,
6
6
  dynamically building the list of servers to be deployed to.
7
7
 
8
8
  ## Notes
9
9
 
10
- Cap-EC2 is only compatible with Capistrano 3.x or later; if you want the Capistrano 2.x version,
10
+ Cap-EC2 is only compatible with Capistrano 3.x or later; if you want the Capistrano 2.x version,
11
11
  use [Capify-EC2](https://github.com/forward/capify-ec2). Note that the configuration file (`config/ec2.yml`)
12
12
  is not compatible between versions either.
13
13
 
14
14
  This documentation assumes familiarity with Capistrano 3.x.
15
15
 
16
- A number of features that are in Capify-EC2 are not yet available in Cap-EC2, due to the
16
+ A number of features that are in Capify-EC2 are not yet available in Cap-EC2, due to the
17
17
  architectural changes in Capistrano 3.x. The following features are missing (this is not
18
18
  an exhaustive list!):
19
19
  * rolling deploy (this should be implemented via [SSHKit](https://github.com/capistrano/sshkit))
20
20
  * ELB registration/de-registration (not widely used)
21
- * using IAM roles to provide credentials
22
21
  * Variables set by EC2 tags
23
22
  * Connecting to instances via SSH using a convenience task
24
23
 
@@ -31,34 +30,49 @@ features you would like.
31
30
 
32
31
  or add the gem to your project's Gemfile.
33
32
 
34
- You will need to create a YAML configuration file at `config/ec2.yml` that looks like the following:
33
+ You also need to add the gem to your Capfile:
35
34
 
36
35
  ```ruby
37
- access_key_id: "YOUR ACCESS KEY"
38
- secret_access_key: "YOUR SECRET KEY"
39
- regions:
40
- - 'eu-west-1'
36
+ require "cap-ec2/capistrano"
41
37
  ```
42
38
 
43
- You also need to add the gem to your Capfile:
39
+
40
+ ## Configuration
41
+
42
+ Configurable options, shown here with defaults:
44
43
 
45
44
  ```ruby
46
- require "cap-ec2/capistrano"
45
+ set :ec2_config, 'config/ec2.yml'
46
+
47
+ set :ec2_project_tag, 'Project'
48
+ set :ec2_roles_tag, 'Roles'
49
+ set :ec2_stages_tag, 'Stages'
50
+
51
+ set :ec2_access_key_id, nil
52
+ set :ec2_secret_access_key, nil
53
+ set :ec2_region, %w{}
47
54
  ```
48
55
 
49
- ## Configuration
56
+ #### Order of inheritance
57
+ `cap-ec2` supports multiple methods of configuration. The order of inheritance is:
58
+ YAML File > User Capistrano Config > Default Capistrano Config > ENV variables.
59
+
60
+ #### Regions
61
+ `:ec2_region` is an array of [AWS regions](http://docs.aws.amazon.com/general/latest/gr/rande.html#ec2_region), if not present all regions will be checked for matching instances - this the default behavior and can be slow, if speed is an issue consider setting your required regions.
50
62
 
51
- Your `config/ec2.yml` file must contain at least the information above (`access_key_id`, `secret_access_key`, `regions`).
52
- Omitting any of these will raise an exception.
63
+ If`:ec2_access_key_id` or `:ec2_secret_access_key` are not set in any configuration the environment variables
64
+ `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` will be checked.
65
+ If running on EC2 the IAM instance profile credentials will be used if credentials are not set by any other method.
53
66
 
54
- The following are optional settings you can use.
67
+
68
+ #### Misc settings
55
69
 
56
70
  * project_tag
57
-
71
+
58
72
  If this is defined, Cap-EC2 will look for a tag with this name when searching for instances belong
59
73
  to this project. Cap-EC2 will look for a value which matches the `:application` setting in your
60
74
  `deploy.rb`. The tag name defaults to "Project".
61
-
75
+
62
76
  * stages_tag
63
77
 
64
78
  If this is defined, Cap-EC2 will look for a tag with this name to determine which instances belong to
@@ -67,7 +81,29 @@ The following are optional settings you can use.
67
81
  * roles_tag
68
82
 
69
83
  If this is defined, Cap-EC2 will look for a tag with this name to determine which instances belong to
70
- a given role. The tag name defaults to "Roles".
84
+ a given role. The tag name defaults to "Roles".
85
+
86
+
87
+ ### YAML Configuration
88
+
89
+
90
+ If you'd prefer do your configuration via a YAML file `config/ec2.yml` can be used, (or an alternative name/location set via `set :ec2_config`):
91
+
92
+ If so YAML file will look like this:
93
+
94
+ ```ruby
95
+ access_key_id: "YOUR ACCESS KEY"
96
+ secret_access_key: "YOUR SECRET KEY"
97
+ regions:
98
+ - 'eu-west-1'
99
+ project_tag: "Project"
100
+ roles_tag: "Roles"
101
+ stages_tag: "Stages"
102
+ ```
103
+
104
+
105
+ Your `config/ec2.yml` file can contain (`access_key_id`, `secret_access_key`, `regions`) - if a value is omitted then the order of inheritance is followed.
106
+
71
107
 
72
108
  ## Usage
73
109
 
@@ -160,7 +196,7 @@ trivial to add.
160
196
  ### Tasks and deployment
161
197
 
162
198
  You can now define your tasks for these roles in exactly the same way as you would if you weren't
163
- using this gem.
199
+ using this gem.
164
200
 
165
201
  ## Utility tasks
166
202
 
@@ -176,7 +212,7 @@ This command will show you information all the instances your configuration matc
176
212
  Example:
177
213
 
178
214
  $ cap production ec2:status
179
-
215
+
180
216
  Num Name ID Type DNS Zone Roles Stage
181
217
  00: server-1-20131030-1144-0 i-abcdefgh m1.small 192.168.202.248 us-west-2c banana,apple production
182
218
  01: server-2-20131118-1839-0 i-hgfedcba m1.small 192.168.200.60 us-west-2a banana production
@@ -191,23 +227,23 @@ Example:
191
227
 
192
228
  $ cap production ec2:server_names
193
229
  server-1-20131030-1144-0
194
- server-2-20131118-1839-0
230
+ server-2-20131118-1839-0
195
231
 
196
232
  ### View server instance IDs
197
-
233
+
198
234
  This command will show the instance IDs of the instances matching the given stage:
199
-
235
+
200
236
  cap [stage] ec2:instance_ids
201
-
237
+
202
238
  Example:
203
-
239
+
204
240
  $ cap production ec2:instance_ids
205
241
  i-abcdefgh
206
242
  i-hgfedcba
207
243
 
208
244
  ## Acknowledgements
209
245
 
210
- Thanks to [Rylon](https://github.com/Rylon) for maintaining Capify-EC2 and
246
+ Thanks to [Rylon](https://github.com/Rylon) for maintaining Capify-EC2 and
211
247
  reviewing my thought processes for this project.
212
248
 
213
249
  ## Contributing
@@ -6,8 +6,8 @@ require 'cap-ec2/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "cap-ec2"
8
8
  spec.version = CapEC2::VERSION
9
- spec.authors = ["Andy Sykes"]
10
- spec.email = ["github@tinycat.co.uk"]
9
+ spec.authors = ["Andy Sykes", "Robert Coleman"]
10
+ spec.email = ["github@tinycat.co.uk", "github@robert.net.nz"]
11
11
  spec.description = %q{Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags, dynamically building the list of servers to be deployed to.}
12
12
  spec.summary = %q{Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2 instance tags, dynamically building the list of servers to be deployed to.}
13
13
  spec.homepage = "https://github.com/forward3d/cap-ec2"
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
-
23
+
24
24
  spec.add_dependency "aws-sdk"
25
25
  spec.add_dependency "capistrano", ">= 3.0"
26
26
  spec.add_dependency "terminal-table"
@@ -7,7 +7,6 @@ require 'yaml'
7
7
  require_relative 'utils'
8
8
  require_relative 'ec2-handler'
9
9
  require_relative 'status-table'
10
- require_relative 'instance'
11
10
 
12
11
  # Load extra tasks
13
12
  load File.expand_path("../tasks/ec2.rake", __FILE__)
@@ -17,19 +16,19 @@ module Capistrano
17
16
  module Ec2
18
17
 
19
18
  def ec2_handler
20
- @ec2_handler ||= CapEC2::EC2Handler.new(env.fetch(:ec2_config, "config/ec2.yml"))
19
+ @ec2_handler ||= CapEC2::EC2Handler.new
21
20
  end
22
-
21
+
23
22
  def ec2_role(name, options={})
24
23
  ec2_handler.get_servers_for_role(name).each do |server|
25
- env.role(name, server.contact_point, options)
24
+ env.role(name, CapEC2::Utils.contact_point(server), options)
26
25
  end
27
26
  end
28
-
27
+
29
28
  def env
30
29
  Configuration.env
31
30
  end
32
-
31
+
33
32
  end
34
33
  end
35
34
  end
@@ -1,26 +1,30 @@
1
1
  module CapEC2
2
2
  class EC2Handler
3
3
  include CapEC2::Utils
4
-
5
- def initialize(ec2_config = "config/ec2.yml")
6
- @ec2_config = YAML.load_file ec2_config
4
+
5
+ def initialize
6
+ load_config
7
+ configured_regions = get_regions(fetch(:ec2_region))
7
8
  @ec2 = {}
8
- @ec2_config["regions"].each do |region|
9
- @ec2[region] = AWS::EC2.new(
10
- access_key_id: @ec2_config["access_key_id"],
11
- secret_access_key: @ec2_config["secret_access_key"],
9
+ configured_regions.each do |region|
10
+ @ec2[region] = ec2_connect(region)
11
+ end
12
+ end
13
+
14
+ def ec2_connect(region=nil)
15
+ AWS::EC2.new(
16
+ access_key_id: fetch(:ec2_access_key_id),
17
+ secret_access_key: fetch(:ec2_secret_access_key),
12
18
  region: region
13
19
  )
14
- end
15
20
  end
16
-
21
+
17
22
  def status_table
18
23
  CapEC2::StatusTable.new(
19
- defined_roles.map {|r| get_servers_for_role(r)}.flatten.uniq {|i| i.instance_id},
20
- @ec2_config
24
+ defined_roles.map {|r| get_servers_for_role(r)}.flatten.uniq {|i| i.instance_id}
21
25
  )
22
26
  end
23
-
27
+
24
28
  def server_names
25
29
  puts defined_roles.map {|r| get_servers_for_role(r)}
26
30
  .flatten
@@ -28,7 +32,7 @@ module CapEC2
28
32
  .map {|i| i.tags["Name"]}
29
33
  .join("\n")
30
34
  end
31
-
35
+
32
36
  def instance_ids
33
37
  puts defined_roles.map {|r| get_servers_for_role(r)}
34
38
  .flatten
@@ -36,41 +40,35 @@ module CapEC2
36
40
  .map {|i| i.instance_id}
37
41
  .join("\n")
38
42
  end
39
-
43
+
40
44
  def defined_roles
41
45
  Capistrano::Configuration.env.send(:servers).send(:available_roles)
42
46
  end
43
-
47
+
44
48
  def stage
45
49
  Capistrano::Configuration.env.fetch(:stage).to_s
46
50
  end
47
-
51
+
48
52
  def application
49
53
  Capistrano::Configuration.env.fetch(:application).to_s
50
54
  end
51
-
55
+
52
56
  def tag(tag_name)
53
57
  "tag:#{tag_name}"
54
58
  end
55
-
59
+
56
60
  def get_servers_for_role(role)
57
61
  servers = []
58
- each_region do |ec2|
62
+ @ec2.each do |_, ec2|
59
63
  instances = ec2.instances
60
64
  .filter(tag(project_tag), application)
61
65
  .filter('instance-state-code', '16')
62
- servers << instances.select do |i|
66
+ servers << instances.select do |i|
63
67
  i.tags[roles_tag] =~ /,{0,1}#{role}(,|$)/ && i.tags[stages_tag] =~ /,{0,1}#{stage}(,|$)/
64
68
  end
65
69
  end
66
70
  servers.flatten
67
71
  end
68
-
69
- def each_region
70
- @ec2.keys.each do |region|
71
- yield @ec2[region]
72
- end
73
- end
74
-
72
+
75
73
  end
76
- end
74
+ end
@@ -2,9 +2,8 @@ module CapEC2
2
2
  class StatusTable
3
3
  include CapEC2::Utils
4
4
 
5
- def initialize(instances, ec2_config)
5
+ def initialize(instances)
6
6
  @instances = instances
7
- @ec2_config = ec2_config
8
7
  output
9
8
  end
10
9
 
@@ -42,7 +41,7 @@ module CapEC2
42
41
  (instance.tags["Name"] || '').green,
43
42
  instance.id.red,
44
43
  instance.instance_type.cyan,
45
- instance.contact_point.blue.bold,
44
+ CapEC2::Utils.contact_point(instance).blue.bold,
46
45
  instance.availability_zone.magenta,
47
46
  instance.tags[roles_tag].yellow,
48
47
  instance.tags[stages_tag].yellow
@@ -15,4 +15,21 @@ namespace :ec2 do
15
15
  ec2_handler.instance_ids
16
16
  end
17
17
 
18
- end
18
+ end
19
+
20
+
21
+ namespace :load do
22
+ task :defaults do
23
+
24
+ set :ec2_config, 'config/ec2.yml'
25
+
26
+ set :ec2_project_tag, 'Project'
27
+ set :ec2_roles_tag, 'Roles'
28
+ set :ec2_stages_tag, 'Stages'
29
+
30
+ set :ec2_access_key_id, nil
31
+ set :ec2_secret_access_key, nil
32
+ set :ec2_region, %w{}
33
+
34
+ end
35
+ end
@@ -1,15 +1,45 @@
1
1
  module CapEC2
2
2
  module Utils
3
3
  def project_tag
4
- @ec2_config["project_tag"] || "Project"
4
+ fetch(:ec2_project_tag)
5
5
  end
6
6
 
7
7
  def roles_tag
8
- @ec2_config["roles_tag"] || "Roles"
8
+ fetch(:ec2_roles_tag)
9
9
  end
10
10
 
11
11
  def stages_tag
12
- @ec2_config["stages_tag"] || "Stages"
12
+ fetch(:ec2_stages_tag)
13
13
  end
14
+
15
+ def self.contact_point(instance)
16
+ instance.public_dns_name || instance.public_ip_address || instance.private_ip_address
17
+ end
18
+
19
+ def load_config
20
+ config_location = File.expand_path(fetch(:ec2_config), Dir.pwd) if fetch(:ec2_config)
21
+ if config_location && File.exists?(config_location)
22
+ config = YAML.load_file fetch(:ec2_config)
23
+ if config
24
+ set :ec2_project_tag, config['project_tag'] if config['project_tag']
25
+ set :ec2_roles_tag, config['roles_tag'] if config['roles_tag']
26
+ set :ec2_stages_tag, config['stages_tag'] if config['stages_tag']
27
+
28
+ set :ec2_access_key_id, config['access_key_id'] if config['access_key_id']
29
+ set :ec2_secret_access_key, config['secret_access_key'] if config['secret_access_key']
30
+ set :ec2_region, config['regions'] if config['regions']
31
+ end
32
+ end
33
+ end
34
+
35
+ def get_regions(regions_array=nil)
36
+ unless regions_array.empty?
37
+ return regions_array
38
+ else
39
+ @ec2 = ec2_connect
40
+ @ec2.regions.map(&:name)
41
+ end
42
+ end
43
+
14
44
  end
15
45
  end
@@ -1,3 +1,3 @@
1
1
  module CapEC2
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,121 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cap-ec2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
5
- prerelease:
4
+ version: 0.0.8
6
5
  platform: ruby
7
6
  authors:
8
7
  - Andy Sykes
8
+ - Robert Coleman
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-05 00:00:00.000000000 Z
12
+ date: 2014-02-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
16
16
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
17
  requirements:
19
- - - ~>
18
+ - - "~>"
20
19
  - !ruby/object:Gem::Version
21
20
  version: '1.3'
22
21
  type: :development
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
24
  requirements:
27
- - - ~>
25
+ - - "~>"
28
26
  - !ruby/object:Gem::Version
29
27
  version: '1.3'
30
28
  - !ruby/object:Gem::Dependency
31
29
  name: rake
32
30
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
31
  requirements:
35
- - - ! '>='
32
+ - - ">="
36
33
  - !ruby/object:Gem::Version
37
34
  version: '0'
38
35
  type: :development
39
36
  prerelease: false
40
37
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
38
  requirements:
43
- - - ! '>='
39
+ - - ">="
44
40
  - !ruby/object:Gem::Version
45
41
  version: '0'
46
42
  - !ruby/object:Gem::Dependency
47
43
  name: aws-sdk
48
44
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
45
  requirements:
51
- - - ! '>='
46
+ - - ">="
52
47
  - !ruby/object:Gem::Version
53
48
  version: '0'
54
49
  type: :runtime
55
50
  prerelease: false
56
51
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
52
  requirements:
59
- - - ! '>='
53
+ - - ">="
60
54
  - !ruby/object:Gem::Version
61
55
  version: '0'
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: capistrano
64
58
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
59
  requirements:
67
- - - ! '>='
60
+ - - ">="
68
61
  - !ruby/object:Gem::Version
69
62
  version: '3.0'
70
63
  type: :runtime
71
64
  prerelease: false
72
65
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
66
  requirements:
75
- - - ! '>='
67
+ - - ">="
76
68
  - !ruby/object:Gem::Version
77
69
  version: '3.0'
78
70
  - !ruby/object:Gem::Dependency
79
71
  name: terminal-table
80
72
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
73
  requirements:
83
- - - ! '>='
74
+ - - ">="
84
75
  - !ruby/object:Gem::Version
85
76
  version: '0'
86
77
  type: :runtime
87
78
  prerelease: false
88
79
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
80
  requirements:
91
- - - ! '>='
81
+ - - ">="
92
82
  - !ruby/object:Gem::Version
93
83
  version: '0'
94
84
  - !ruby/object:Gem::Dependency
95
85
  name: colored
96
86
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
87
  requirements:
99
- - - ! '>='
88
+ - - ">="
100
89
  - !ruby/object:Gem::Version
101
90
  version: '0'
102
91
  type: :runtime
103
92
  prerelease: false
104
93
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
94
  requirements:
107
- - - ! '>='
95
+ - - ">="
108
96
  - !ruby/object:Gem::Version
109
97
  version: '0'
110
98
  description: Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon
111
99
  EC2 instance tags, dynamically building the list of servers to be deployed to.
112
100
  email:
113
101
  - github@tinycat.co.uk
102
+ - github@robert.net.nz
114
103
  executables: []
115
104
  extensions: []
116
105
  extra_rdoc_files: []
117
106
  files:
118
- - .gitignore
107
+ - ".gitignore"
119
108
  - CHANGELOG.md
120
109
  - Gemfile
121
110
  - LICENSE.txt
@@ -124,7 +113,6 @@ files:
124
113
  - cap-ec2.gemspec
125
114
  - lib/cap-ec2/capistrano.rb
126
115
  - lib/cap-ec2/ec2-handler.rb
127
- - lib/cap-ec2/instance.rb
128
116
  - lib/cap-ec2/status-table.rb
129
117
  - lib/cap-ec2/tasks/ec2.rake
130
118
  - lib/cap-ec2/utils.rb
@@ -132,33 +120,27 @@ files:
132
120
  homepage: https://github.com/forward3d/cap-ec2
133
121
  licenses:
134
122
  - MIT
123
+ metadata: {}
135
124
  post_install_message:
136
125
  rdoc_options: []
137
126
  require_paths:
138
127
  - lib
139
128
  required_ruby_version: !ruby/object:Gem::Requirement
140
- none: false
141
129
  requirements:
142
- - - ! '>='
130
+ - - ">="
143
131
  - !ruby/object:Gem::Version
144
132
  version: '0'
145
- segments:
146
- - 0
147
- hash: 1426469508856454138
148
133
  required_rubygems_version: !ruby/object:Gem::Requirement
149
- none: false
150
134
  requirements:
151
- - - ! '>='
135
+ - - ">="
152
136
  - !ruby/object:Gem::Version
153
137
  version: '0'
154
- segments:
155
- - 0
156
- hash: 1426469508856454138
157
138
  requirements: []
158
139
  rubyforge_project:
159
- rubygems_version: 1.8.23
140
+ rubygems_version: 2.2.0
160
141
  signing_key:
161
- specification_version: 3
142
+ specification_version: 4
162
143
  summary: Cap-EC2 is used to generate Capistrano namespaces and tasks from Amazon EC2
163
144
  instance tags, dynamically building the list of servers to be deployed to.
164
145
  test_files: []
146
+ has_rdoc:
@@ -1,11 +0,0 @@
1
- # Monkey patch the AWS SDK to return a variable
2
- # "contact point" we can reach the server on
3
- module AWS
4
- class EC2
5
- class Instance
6
- def contact_point
7
- public_dns_name || public_ip_address || private_ip_address
8
- end
9
- end
10
- end
11
- end