aws-ec2 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/Gemfile.lock +84 -52
- data/README.md +3 -4
- data/aws-ec2.gemspec +3 -0
- data/lib/aws-ec2.rb +7 -4
- data/lib/aws_ec2/ami.rb +7 -8
- data/lib/aws_ec2/cli.rb +12 -10
- data/lib/aws_ec2/command.rb +13 -0
- data/lib/aws_ec2/compile_scripts.rb +30 -0
- data/lib/aws_ec2/core.rb +4 -1
- data/lib/aws_ec2/create.rb +14 -84
- data/lib/aws_ec2/create/params.rb +157 -0
- data/lib/aws_ec2/dotenv.rb +30 -0
- data/lib/aws_ec2/help/ami.md +11 -0
- data/lib/aws_ec2/help/create.md +3 -3
- data/lib/aws_ec2/help/user_data.md +4 -4
- data/lib/aws_ec2/hook.rb +32 -0
- data/lib/aws_ec2/script.rb +26 -0
- data/lib/aws_ec2/scripts/ami_creation.sh +24 -16
- data/lib/aws_ec2/scripts/auto_terminate.sh +95 -0
- data/lib/aws_ec2/template_helper.rb +47 -12
- data/lib/aws_ec2/template_helper/ami_helper.rb +23 -0
- data/lib/aws_ec2/template_helper/partial_helper.rb +71 -0
- data/lib/aws_ec2/version.rb +1 -1
- data/spec/fixtures/demo_project/config/test.yml +9 -0
- data/spec/fixtures/demo_project/profiles/default.yml +33 -0
- data/spec/lib/cli_spec.rb +9 -4
- data/spec/spec_helper.rb +4 -3
- metadata +57 -8
- data/example/profiles/spot/default.yml +0 -14
- data/example/profiles/spot/dev.yml +0 -15
- data/lib/aws_ec2/help/spot.md +0 -3
- data/lib/aws_ec2/spot.rb +0 -81
- data/lib/aws_ec2/user_data.rb +0 -17
- data/lib/aws_ec2/util.rb +0 -64
@@ -1,17 +1,35 @@
|
|
1
1
|
require "base64"
|
2
2
|
require "erb"
|
3
|
+
require "active_support/all"
|
3
4
|
|
4
5
|
module AwsEc2
|
5
6
|
module TemplateHelper
|
7
|
+
# auto load all the template_helpers
|
8
|
+
template_helper_path = File.expand_path("../template_helper", __FILE__)
|
9
|
+
Dir.glob("#{template_helper_path}/*").each do |path|
|
10
|
+
next if File.directory?(path)
|
11
|
+
filename = File.basename(path, '.rb')
|
12
|
+
class_name = filename.classify
|
13
|
+
instance_eval do
|
14
|
+
autoload class_name.to_sym, "aws_ec2/template_helper/#{filename}"
|
15
|
+
include const_get(class_name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
6
19
|
def user_data(name, base64=true)
|
7
20
|
# allow user to specify the path also
|
8
21
|
if File.exist?(name)
|
9
22
|
name = File.basename(name) # normalize name, change path to name
|
10
23
|
end
|
11
24
|
name = File.basename(name, '.sh')
|
12
|
-
path = "#{root}/
|
25
|
+
path = "#{AwsEc2.root}/app/user-data/#{name}.sh"
|
13
26
|
result = erb_result(path)
|
14
|
-
result =
|
27
|
+
result = append_scripts(result)
|
28
|
+
|
29
|
+
# save the unencoded user-data script for easy debugging
|
30
|
+
temp_path = "/tmp/aws-ec2/user-data.txt"
|
31
|
+
FileUtils.mkdir_p(File.dirname(temp_path))
|
32
|
+
IO.write(temp_path, result)
|
15
33
|
|
16
34
|
base64 ? Base64.encode64(result).strip : result
|
17
35
|
end
|
@@ -30,21 +48,36 @@ module AwsEc2
|
|
30
48
|
end
|
31
49
|
|
32
50
|
private
|
33
|
-
def
|
34
|
-
|
35
|
-
|
36
|
-
if
|
37
|
-
|
38
|
-
# TODO: add support for other types of scripts
|
39
|
-
# might be able to do this by wrapping all scripts in cloud-init
|
40
|
-
ami_creation_snippet = AwsEc2::Ami.new(ami).user_data_snippet
|
41
|
-
user_data += ami_creation_snippet
|
42
|
-
end
|
51
|
+
def append_scripts(user_data)
|
52
|
+
# assuming user-data script is a bash script for simplicity
|
53
|
+
script = AwsEc2::Script.new(@options)
|
54
|
+
user_data += script.auto_terminate if @options[:auto_terminate]
|
55
|
+
user_data += script.create_ami if @options[:ami_name]
|
43
56
|
user_data
|
44
57
|
end
|
45
58
|
|
59
|
+
# Load custom helper methods from the project repo
|
60
|
+
def load_custom_helpers
|
61
|
+
Dir.glob("#{AwsEc2.root}/app/helpers/**/*_helper.rb").each do |path|
|
62
|
+
filename = path.sub(%r{.*/},'').sub('.rb','')
|
63
|
+
module_name = filename.classify
|
64
|
+
|
65
|
+
require path
|
66
|
+
self.class.send :include, module_name.constantize
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
46
71
|
def erb_result(path)
|
72
|
+
load_custom_helpers
|
47
73
|
template = IO.read(path)
|
74
|
+
|
75
|
+
# Allow a way to bypass the custom ERB error handling in case
|
76
|
+
# the error is in the lambdagem code.
|
77
|
+
if ENV['DEBUG']
|
78
|
+
return ERB.new(template, nil, "-").result(binding)
|
79
|
+
end
|
80
|
+
|
48
81
|
begin
|
49
82
|
ERB.new(template, nil, "-").result(binding)
|
50
83
|
rescue Exception => e
|
@@ -71,6 +104,8 @@ module AwsEc2
|
|
71
104
|
printf("%#{spacing}d %s\n", line_number, line_content)
|
72
105
|
end
|
73
106
|
end
|
107
|
+
|
108
|
+
puts "\nIf the this error does not make sense and the error is not in the ERB template. Run the command again with DEBUG=1 to show the full lambdagem backtrace"
|
74
109
|
exit 1 unless ENV['TEST']
|
75
110
|
end
|
76
111
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module AwsEc2::TemplateHelper::AmiHelper
|
2
|
+
include AwsEc2::AwsServices
|
3
|
+
|
4
|
+
# Example:
|
5
|
+
#
|
6
|
+
# latest_ami("ruby-2.5.0_*") => ami-122
|
7
|
+
#
|
8
|
+
# Equivalent aws cli test command:
|
9
|
+
#
|
10
|
+
# $ aws ec2 describe-images --owners self --filters="Name=name,Values=ruby-2.5.0_*" | jq '.Images | length'
|
11
|
+
#
|
12
|
+
# Returns latest ami ami
|
13
|
+
def latest_ami(query, owners=["self"])
|
14
|
+
images = ec2.describe_images(
|
15
|
+
owners: owners,
|
16
|
+
filters: [
|
17
|
+
{name: "name", values: [query]}
|
18
|
+
]
|
19
|
+
).images
|
20
|
+
image = images.sort_by(&:name).reverse.first
|
21
|
+
image.image_id
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module AwsEc2::TemplateHelper::PartialHelper
|
2
|
+
def partial_exist?(path)
|
3
|
+
path = partial_path_for(path)
|
4
|
+
path = auto_add_format(path)
|
5
|
+
path && File.exist?(path)
|
6
|
+
end
|
7
|
+
|
8
|
+
# The partial's path is a relative path given without the extension and
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# Given: file in app/partials/mypartial.sh
|
12
|
+
# The path should be: mypartial
|
13
|
+
#
|
14
|
+
# If the user specifies the extension then use that instead of auto-adding
|
15
|
+
# the detected format.
|
16
|
+
def partial(path,vars={}, options={})
|
17
|
+
path = partial_path_for(path)
|
18
|
+
path = auto_add_format(path)
|
19
|
+
|
20
|
+
result = erb_result(path)
|
21
|
+
result = indent(result, options[:indent]) if options[:indent]
|
22
|
+
if options[:indent]
|
23
|
+
# Add empty line at beginning because empty lines gets stripped during
|
24
|
+
# processing anyway. This allows the user to call partial without having
|
25
|
+
# to put the partial call at very beginning of the line.
|
26
|
+
# This only should happen if user is using indent option.
|
27
|
+
["\n", result].join("\n")
|
28
|
+
else
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# add indentation
|
34
|
+
def indent(text, indentation_amount)
|
35
|
+
text.split("\n").map do |line|
|
36
|
+
" " * indentation_amount + line
|
37
|
+
end.join("\n")
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def partial_path_for(path)
|
42
|
+
"#{AwsEc2.root}/app/partials/#{path}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def auto_add_format(path)
|
46
|
+
# Return immediately if user provided explicit extension
|
47
|
+
extension = File.extname(path) # current extension
|
48
|
+
return path if !extension.empty?
|
49
|
+
|
50
|
+
# Else let's auto detect
|
51
|
+
paths = Dir.glob("#{path}.*")
|
52
|
+
|
53
|
+
if paths.size == 1 # non-ambiguous match
|
54
|
+
return paths.first
|
55
|
+
end
|
56
|
+
|
57
|
+
if paths.size > 1 # ambiguous match
|
58
|
+
puts "ERROR: Multiple possible partials found:".colorize(:red)
|
59
|
+
paths.each do |path|
|
60
|
+
puts " #{path}"
|
61
|
+
end
|
62
|
+
puts "Please specify an extension in the name to remove the ambiguity.".colorize(:green)
|
63
|
+
exit 1
|
64
|
+
end
|
65
|
+
|
66
|
+
# Account for case when user wants to include a file with no extension at all
|
67
|
+
return path if File.exist?(path) && !File.directory?(path)
|
68
|
+
|
69
|
+
path # original path if this point is reached
|
70
|
+
end
|
71
|
+
end
|
data/lib/aws_ec2/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
---
|
2
|
+
# image_id: ami-97785bed # Amazon Linux AMI
|
3
|
+
image_id: ami-4fffc834 # Amazon Lambda AMI
|
4
|
+
# https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html
|
5
|
+
instance_type: t2.medium
|
6
|
+
key_name: default
|
7
|
+
max_count: 1
|
8
|
+
min_count: 1
|
9
|
+
user_data:
|
10
|
+
iam_instance_profile:
|
11
|
+
name: DevLinux
|
12
|
+
# public network settings
|
13
|
+
security_group_ids: <%= config["security_group_ids"].inspect %>
|
14
|
+
subnet_id: <%= config["subnets"].shuffle.first %>
|
15
|
+
block_device_mappings:
|
16
|
+
- device_name: /dev/xvda
|
17
|
+
ebs:
|
18
|
+
volume_size: 20
|
19
|
+
instance_market_options:
|
20
|
+
market_type: spot
|
21
|
+
# https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateSpotMarketOptionsRequest.html
|
22
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Types/SpotMarketOptions.html
|
23
|
+
spot_options:
|
24
|
+
max_price: "0.018" # $0.020/hr = $14.40/mo
|
25
|
+
# $0.018/hr = $12.96/mo
|
26
|
+
# valid combinations:
|
27
|
+
# spot_instance_type: persistent
|
28
|
+
# instance_interruption_behavior: hibernate
|
29
|
+
# or
|
30
|
+
# spot_instance_type: one-time
|
31
|
+
# More info: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html
|
32
|
+
spot_instance_type: persistent
|
33
|
+
instance_interruption_behavior: hibernate
|
data/spec/lib/cli_spec.rb
CHANGED
@@ -7,13 +7,18 @@ require "spec_helper"
|
|
7
7
|
# $ rake clean:vcr ; time rake
|
8
8
|
describe AwsEc2::CLI do
|
9
9
|
before(:all) do
|
10
|
-
@args = "--
|
10
|
+
@args = "--noop"
|
11
11
|
end
|
12
12
|
|
13
13
|
describe "aws-ec2" do
|
14
|
-
it "
|
15
|
-
out = execute("exe/aws-ec2
|
16
|
-
expect(out).to include("
|
14
|
+
it "create" do
|
15
|
+
out = execute("exe/aws-ec2 create server #{@args}")
|
16
|
+
expect(out).to include("Creating EC2 instance")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "ami" do
|
20
|
+
out = execute("exe/aws-ec2 ami myimage #{@args}")
|
21
|
+
expect(out).to include("Creating EC2 instance")
|
17
22
|
end
|
18
23
|
end
|
19
24
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
ENV["TEST"] = "1"
|
2
|
-
|
3
|
-
|
4
|
-
#
|
2
|
+
ENV["AWS_EC2_ENV"] = "test"
|
3
|
+
ENV["AWS_EC2_ROOT"] = "spec/fixtures/demo_project"
|
4
|
+
# Ensures aws api never called. Fixture home folder does not contain ~/.aws/credentails
|
5
|
+
ENV['HOME'] = "spec/fixtures/home"
|
5
6
|
|
6
7
|
require "pp"
|
7
8
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-ec2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -52,6 +52,48 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dotenv
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: aws-sdk-ec2
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
55
97
|
- !ruby/object:Gem::Dependency
|
56
98
|
name: bundler
|
57
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,8 +199,6 @@ files:
|
|
157
199
|
- aws-ec2.gemspec
|
158
200
|
- example/profiles/default.yml
|
159
201
|
- example/profiles/spot.yml
|
160
|
-
- example/profiles/spot/default.yml
|
161
|
-
- example/profiles/spot/dev.yml
|
162
202
|
- example/profiles/user-data/dev.sh
|
163
203
|
- exe/aws-ec2
|
164
204
|
- lib/aws-ec2.rb
|
@@ -166,19 +206,26 @@ files:
|
|
166
206
|
- lib/aws_ec2/aws_services.rb
|
167
207
|
- lib/aws_ec2/cli.rb
|
168
208
|
- lib/aws_ec2/command.rb
|
209
|
+
- lib/aws_ec2/compile_scripts.rb
|
169
210
|
- lib/aws_ec2/config.rb
|
170
211
|
- lib/aws_ec2/core.rb
|
171
212
|
- lib/aws_ec2/create.rb
|
213
|
+
- lib/aws_ec2/create/params.rb
|
214
|
+
- lib/aws_ec2/dotenv.rb
|
172
215
|
- lib/aws_ec2/help.rb
|
216
|
+
- lib/aws_ec2/help/ami.md
|
173
217
|
- lib/aws_ec2/help/create.md
|
174
|
-
- lib/aws_ec2/help/spot.md
|
175
218
|
- lib/aws_ec2/help/user_data.md
|
219
|
+
- lib/aws_ec2/hook.rb
|
220
|
+
- lib/aws_ec2/script.rb
|
176
221
|
- lib/aws_ec2/scripts/ami_creation.sh
|
177
|
-
- lib/aws_ec2/
|
222
|
+
- lib/aws_ec2/scripts/auto_terminate.sh
|
178
223
|
- lib/aws_ec2/template_helper.rb
|
179
|
-
- lib/aws_ec2/
|
180
|
-
- lib/aws_ec2/
|
224
|
+
- lib/aws_ec2/template_helper/ami_helper.rb
|
225
|
+
- lib/aws_ec2/template_helper/partial_helper.rb
|
181
226
|
- lib/aws_ec2/version.rb
|
227
|
+
- spec/fixtures/demo_project/config/test.yml
|
228
|
+
- spec/fixtures/demo_project/profiles/default.yml
|
182
229
|
- spec/lib/cli_spec.rb
|
183
230
|
- spec/spec_helper.rb
|
184
231
|
homepage: https://github.com/tongueroo/aws-ec2
|
@@ -206,5 +253,7 @@ signing_key:
|
|
206
253
|
specification_version: 4
|
207
254
|
summary: Simple tool to create AWS ec2 instances
|
208
255
|
test_files:
|
256
|
+
- spec/fixtures/demo_project/config/test.yml
|
257
|
+
- spec/fixtures/demo_project/profiles/default.yml
|
209
258
|
- spec/lib/cli_spec.rb
|
210
259
|
- spec/spec_helper.rb
|
@@ -1,14 +0,0 @@
|
|
1
|
-
---
|
2
|
-
spot_fleet_request_config:
|
3
|
-
iam_fleet_role: arn:aws:iam::123456789012:role/aws-service-role/spotfleet.amazonaws.com/AWSServiceRoleForEC2SpotFleet
|
4
|
-
spot_price: '0.02'
|
5
|
-
target_capacity: 1
|
6
|
-
launch_specifications:
|
7
|
-
- iam_instance_profile:
|
8
|
-
arn: arn:aws:iam::123456789012:instance-profile/IAMProfileName
|
9
|
-
image_id: ami-97785bed
|
10
|
-
instance_type: t2.medium
|
11
|
-
key_name: default
|
12
|
-
security_groups:
|
13
|
-
- group_id: sg-111
|
14
|
-
subnet_id: subnet-111, subnet-222
|
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
spot_fleet_request_config:
|
3
|
-
iam_fleet_role: arn:aws:iam::123456789012:role/aws-service-role/spotfleet.amazonaws.com/AWSServiceRoleForEC2SpotFleet
|
4
|
-
spot_price: '0.017'
|
5
|
-
target_capacity: 1
|
6
|
-
launch_specifications:
|
7
|
-
- iam_instance_profile:
|
8
|
-
arn: arn:aws:iam::123456789012:instance-profile/IAMProfileName
|
9
|
-
image_id: ami-97785bed
|
10
|
-
instance_type: t2.medium
|
11
|
-
key_name: default
|
12
|
-
security_groups:
|
13
|
-
- group_id: sg-111
|
14
|
-
subnet_id: subnet-111, subnet-222
|
15
|
-
user_data: "<%= user_data("dev") %>"
|
data/lib/aws_ec2/help/spot.md
DELETED
data/lib/aws_ec2/spot.rb
DELETED
@@ -1,81 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'active_support/core_ext/hash'
|
3
|
-
|
4
|
-
module AwsEc2
|
5
|
-
class Spot
|
6
|
-
include AwsServices
|
7
|
-
include Util
|
8
|
-
|
9
|
-
def initialize(options)
|
10
|
-
@options = options
|
11
|
-
end
|
12
|
-
|
13
|
-
def run
|
14
|
-
puts "Creating spot instance fleet request..."
|
15
|
-
display_info
|
16
|
-
if @options[:noop]
|
17
|
-
puts "NOOP mode enabled. spot instance fleet request not created."
|
18
|
-
return
|
19
|
-
end
|
20
|
-
|
21
|
-
resp = ec2.request_spot_fleet(params)
|
22
|
-
puts "Spot instance fleet request created"
|
23
|
-
end
|
24
|
-
|
25
|
-
# params are main derived from profile files
|
26
|
-
def params
|
27
|
-
params = load_profiles("spot/#{profile_name}")
|
28
|
-
params = decorate_launch_template_configs(params)
|
29
|
-
params.deep_symbolize_keys
|
30
|
-
end
|
31
|
-
|
32
|
-
# Decorates the launch_template_configs:
|
33
|
-
#
|
34
|
-
# * Ensure that a launch template version is set
|
35
|
-
# * Sets the ec2 tag name
|
36
|
-
def decorate_launch_template_configs(params)
|
37
|
-
launch_template_configs = params["spot_fleet_request_config"]["launch_template_configs"]
|
38
|
-
return params unless launch_template_configs
|
39
|
-
|
40
|
-
# Assume only one launch_template_configs
|
41
|
-
# TODO: add support for multiple launch_template_configs
|
42
|
-
config = launch_template_configs.first
|
43
|
-
spec = config["launch_template_specification"]
|
44
|
-
version = spec["version"]
|
45
|
-
unless version
|
46
|
-
latest_version = latest_version(spec["launch_template_name"])
|
47
|
-
end
|
48
|
-
|
49
|
-
config["launch_template_specification"]["version"] ||= latest_version
|
50
|
-
|
51
|
-
# TODO: figure out how to override a tag for a launch template
|
52
|
-
# # Sets the EC2 tag name.
|
53
|
-
# # Replace all tag_specifications for simplicity.
|
54
|
-
# tag_specifications = [{
|
55
|
-
# resource_type: "instance",
|
56
|
-
# tags: [{ key: "Name", value: @options[:name] }],
|
57
|
-
# }]
|
58
|
-
# config["overrides"] << ["tag_specifications"] << tag_specifications
|
59
|
-
|
60
|
-
# replace all configs
|
61
|
-
params["spot_fleet_request_config"]["launch_template_configs"] = [config]
|
62
|
-
|
63
|
-
params
|
64
|
-
end
|
65
|
-
|
66
|
-
def latest_version(launch_template_name)
|
67
|
-
resp = ec2.describe_launch_template_versions(launch_template_name: launch_template_name)
|
68
|
-
version = resp.launch_template_versions.first
|
69
|
-
version.version_number.to_s # request_spot_fleet expects this to be a String
|
70
|
-
rescue Aws::EC2::Errors::InvalidLaunchTemplateNameNotFoundException => e
|
71
|
-
puts e.message
|
72
|
-
puts "Please double check that the launch template exists"
|
73
|
-
exit
|
74
|
-
end
|
75
|
-
|
76
|
-
def display_info
|
77
|
-
puts "Using the following parameters:"
|
78
|
-
pretty_display(params)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|