aws-ec2 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/CHANGELOG.md +10 -0
- data/README.md +19 -15
- data/docs/example/app/user-data/bootstrap.sh +0 -12
- data/lib/aws_ec2/cli.rb +8 -3
- data/lib/aws_ec2/core.rb +25 -4
- data/lib/aws_ec2/create.rb +19 -9
- data/lib/aws_ec2/help/upload.md +3 -2
- data/lib/aws_ec2/profile.rb +10 -1
- data/lib/aws_ec2/script.rb +19 -3
- data/lib/aws_ec2/script/compile.rb +2 -2
- data/lib/aws_ec2/script/compress.rb +1 -1
- data/lib/aws_ec2/script/templates/ami_creation.sh +12 -0
- data/lib/aws_ec2/script/templates/auto_terminate.sh +11 -0
- data/lib/aws_ec2/script/templates/auto_terminate_after_timeout.sh +5 -0
- data/lib/aws_ec2/script/templates/cloudwatch.sh +3 -0
- data/lib/aws_ec2/script/templates/extract_aws_ec2_scripts.sh +48 -0
- data/lib/aws_ec2/script/upload.rb +1 -1
- data/lib/aws_ec2/scripts/auto_terminate.sh +10 -91
- data/lib/aws_ec2/scripts/auto_terminate/after_timeout.sh +18 -0
- data/lib/aws_ec2/scripts/auto_terminate/functions.sh +128 -0
- data/lib/aws_ec2/scripts/auto_terminate/functions/amazonlinux2.sh +10 -0
- data/lib/aws_ec2/scripts/auto_terminate/functions/ubuntu.sh +11 -0
- data/lib/aws_ec2/scripts/auto_terminate/setup.sh +31 -0
- data/lib/aws_ec2/scripts/cloudwatch.sh +22 -0
- data/lib/aws_ec2/scripts/cloudwatch/configure.sh +74 -0
- data/lib/aws_ec2/scripts/cloudwatch/install.sh +4 -0
- data/lib/aws_ec2/scripts/cloudwatch/service.sh +19 -0
- data/lib/aws_ec2/scripts/shared/functions.sh +44 -0
- data/lib/aws_ec2/setting.rb +15 -4
- data/lib/aws_ec2/template/helper/core_helper.rb +46 -7
- data/lib/aws_ec2/template/helper/ssh_key_helper.rb +1 -1
- data/lib/aws_ec2/version.rb +1 -1
- data/spec/fixtures/demo_project/config/settings.yml +22 -0
- data/spec/lib/cli_spec.rb +0 -7
- data/spec/lib/params_spec.rb +71 -0
- metadata +21 -3
- data/lib/aws_ec2/scripts/ami_creation.sh +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 479b890e45d465cd48dad82e9063f5b9ef3074ca05a47461f68ed93ce8b0fd55
|
4
|
+
data.tar.gz: 062a19ef9048e2ff0e284f97b1e1a21a7c44034642ac5639dfef53581f61c23a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e0452f43bb90b093a39e889a65b581620532ac7dc8803e70d74c5b2a0dc56da645273bcf7814aee9de09d666cc61f05305ab94132e7d745d0b69994b27d3cf3
|
7
|
+
data.tar.gz: 3731a44ca9cd7597fbee6f36cb62817ce801fb9404c26f05a7c98f8ade9303f487eca36df301e1c27f0e92d405f8e4f44ac10527fcb1ed32137c3454f865e73d
|
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,16 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [1.1.0]
|
7
|
+
- Merge pull request #5 from tongueroo/auto-terminate
|
8
|
+
- allow AWS_RDS_CODE_VERSION env variable
|
9
|
+
- restructure way scripts work for sanity
|
10
|
+
- bash scripts: ami_creation.sh and auto_terminate.sh
|
11
|
+
- support only amazonlinux2 and ubuntu
|
12
|
+
|
13
|
+
## [1.0.1]
|
14
|
+
- update ordering of the info displayed
|
15
|
+
|
6
16
|
## [1.0.0]
|
7
17
|
- Merge pull request #1 from tongueroo/cli-template-upgrade
|
8
18
|
- Merge pull request #2 from tongueroo/render_me_pretty
|
data/README.md
CHANGED
@@ -54,10 +54,10 @@ Directory | Description
|
|
54
54
|
------------- | -------------
|
55
55
|
app/helpers | Custom helpers methods. Define them as modules and their methods are made available whenever ERB is available: `profiles`, `app/scripts`, `app/user-data` files, etc. For example, you would define a `module FooHelper` in `app/helpers/foo_helper.rb`.
|
56
56
|
app/partials | Your partials that can to be included in other scripts. This is used in conjunction with the `partial` helper method. With great power comes great responsibility. It is recommended to use partials sparely to keep scripts more straightforward.
|
57
|
-
app/scripts | Where you define common scripts that can be used to configure the server. These scripts can be automatically uploaded to an s3 bucket for later downloading in your user-data script by setting the `
|
57
|
+
app/scripts | Where you define common scripts that can be used to configure the server. These scripts can be automatically uploaded to an s3 bucket for later downloading in your user-data script by setting the `s3_folder` settings option.
|
58
58
|
app/user-data | Your user-data scripts that are used to bootstrap EC2 instance.
|
59
|
-
config/[AWS_EC2_ENV].yml | The config file where you set configs that you want available in your templating logic. Examples are: `config/development.yml` and `config/production.yml`. You access the config variables with the `<%= config["var"] %>` helper.
|
60
59
|
app/user-data/layouts | user-data scripts support layouts. You user-data layouts go in here.
|
60
|
+
config/[AWS_EC2_ENV].yml | The config file where you set configs that you want available in your templating logic. Examples are: `config/development.yml` and `config/production.yml`. You access the config variables with the `<%= config["var"] %>` helper.
|
61
61
|
profiles | Your profile files. These files mainly contain parameters that are passed to the aws-sdk run_instances API method.
|
62
62
|
tmp | Where the generated scripts get compiled to. You can manually invoke the compilation via `aws-ec2 compile` to inspect what is generated. This is automatically done as part of the `aws-ec2` create command.
|
63
63
|
|
@@ -71,8 +71,9 @@ user_data | Allows you to embed a generated user_data script. More details on t
|
|
71
71
|
config | Access to the variables set in config/[AWS_EC2_ENV].yml. Examples are `config/development.yml` and `config/production.yml`.
|
72
72
|
latest_ami | Returns an AMI id by searching the AMI name pattern and sorting in reverse order. Example: `latest_ami("ruby-2.5.0_*")` would return the latest ruby AMIs are named with timestamps at the end like so: `ruby-2.5.0_2018-01-30-05-36-02` and `ruby-2.5.0_2018-01-29-05-36-02`.
|
73
73
|
search_ami | Returns a collection of AMI image objects based on a search pattern. The query searches on the AMI name.
|
74
|
+
extract_scripts | Use this in your bash script to extract the `app/scripts` files that get uploaded to s3.
|
74
75
|
|
75
|
-
For a full list of all the template helpers check out: [aws_ec2/
|
76
|
+
For a full list of all the template helpers check out: [lib/aws_ec2/template/helper](lib/aws_ec2/template/helper).
|
76
77
|
|
77
78
|
You can also define custom helpers in the `app/helpers` folder as ruby modules with the naming convention `*_helper.rb`. For example, you would define a `module FooHelper` in `app/helpers/foo_helper.rb`. Custom helpers are first-class citizens and have access to the same variables, methods, and scope as built-in helpers.
|
78
79
|
|
@@ -152,9 +153,6 @@ subnets:
|
|
152
153
|
- subnet-789
|
153
154
|
security_group_ids:
|
154
155
|
- sg-123
|
155
|
-
scripts_s3_bucket: mybucket # enables s3 uploading of generated app/scripts
|
156
|
-
# compile_clean: true # uncomment to automatically remove the
|
157
|
-
# compiled scripts in tmp after aws-ec2 create
|
158
156
|
```
|
159
157
|
|
160
158
|
The variables are accessed via the `config` helper method. Here's a filtered example where it shows the relevant part of a profile: `profiles/default.yml`:
|
@@ -167,17 +165,23 @@ subnet_id: <%= config["subnets"].shuffle %>
|
|
167
165
|
...
|
168
166
|
```
|
169
167
|
|
170
|
-
#### Config Options
|
171
|
-
|
172
|
-
There are some config options that change the behavior of the ec2-aws:
|
173
|
-
|
174
|
-
Option | Description
|
175
|
-
--- | ---
|
176
|
-
scripts_s3_bucket | Set this to the bucket name where you want the generated scripts in app/scripts and app/user-data to be uploaded to. The upload sync happens right before the internal to run_instances call that launches the instance. If you need more custom logic, you can use the `before_run_instances` hook, covered in the Hooks section.
|
177
|
-
|
178
168
|
### Settings
|
179
169
|
|
180
|
-
A `config/settings.yml` file controls the internal behavior of aws-ec2. It is different from config files which are meant for user defined varibles. Settings variables are for internal use.
|
170
|
+
A `config/settings.yml` file controls the internal behavior of aws-ec2. It is different from config files which are meant for user defined varibles. Settings variables are for internal use. Example:
|
171
|
+
|
172
|
+
```yaml
|
173
|
+
development:
|
174
|
+
# By setting s3_folder, aws-ec2 will automatically tarball and upload your scripts
|
175
|
+
# to set. You then can then use the extract_scripts helper method to download
|
176
|
+
# the scripts onto the server.
|
177
|
+
s3_folder: boltops-infra-stag/ec2
|
178
|
+
# compile_clean: true # uncomment to clean at the end of a compile
|
179
|
+
# extract_scripts:
|
180
|
+
# to: "/opt"
|
181
|
+
# as: "ec2-user"
|
182
|
+
|
183
|
+
production:
|
184
|
+
```
|
181
185
|
|
182
186
|
### Hooks
|
183
187
|
|
@@ -1,18 +1,6 @@
|
|
1
1
|
#!/bin/bash -exu
|
2
2
|
|
3
|
-
exec > >(tee "/var/log/user-data.log" | logger -t user-data -s 2>/dev/console) 2>&1
|
4
3
|
export HOME=/root # user-data env runs in weird shell where user is root but HOME is not set
|
5
|
-
<% pubkey_path = "#{ENV['HOME']}/.ssh/id_rsa.pub" -%>
|
6
|
-
<% if File.exist?(pubkey_path) -%>
|
7
|
-
<% pubkey = IO.read(pubkey_path).strip -%>
|
8
|
-
# Automatically add user's public key
|
9
|
-
echo <%= pubkey %> >> ~/.ssh/authorized_keys
|
10
|
-
echo <%= pubkey %> >> /home/ec2-user/.ssh/authorized_keys
|
11
|
-
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
|
12
|
-
<% else %>
|
13
|
-
# WARN: unable to find a ~/.ssh/id_rsa.pub locally on your machine. user: <%= ENV['USER'] %>
|
14
|
-
# Unable to automatically add the public key
|
15
|
-
<% end -%>
|
16
4
|
|
17
5
|
sudo yum install -y postgresql
|
18
6
|
|
data/lib/aws_ec2/cli.rb
CHANGED
@@ -3,19 +3,24 @@ module AwsEc2
|
|
3
3
|
class_option :noop, type: :boolean
|
4
4
|
class_option :profile, desc: "profile name to use"
|
5
5
|
|
6
|
+
common_options = Proc.new do
|
7
|
+
option :auto_terminate, type: :boolean, default: false, desc: "automatically terminate the instance at the end of user-data"
|
8
|
+
option :cloudwatch, type: :boolean, default: false, desc: "enable cloudwatch logging, only supported for amazonlinux"
|
9
|
+
end
|
10
|
+
|
6
11
|
desc "create NAME", "create ec2 instance"
|
7
12
|
long_desc Help.text(:create)
|
8
13
|
option :ami_name, desc: "when specified, an ami creation script is appended to the user-data script"
|
9
|
-
option :auto_terminate, type: :boolean, default: false, desc: "automatically terminate the instance at the end of user-data"
|
10
|
-
option :source_ami, desc: "override the source image_id in profile"
|
11
14
|
option :randomize, type: :boolean, desc: "append random characters to end of name"
|
15
|
+
option :source_ami, desc: "override the source image_id in profile"
|
16
|
+
common_options.call
|
12
17
|
def create(name)
|
13
18
|
Create.new(options.merge(name: name)).run
|
14
19
|
end
|
15
20
|
|
16
21
|
desc "ami NAME", "launches instance and uses it create AMI"
|
17
22
|
long_desc Help.text(:ami)
|
18
|
-
|
23
|
+
common_options.call
|
19
24
|
def ami(name)
|
20
25
|
Ami.new(options.merge(name: name)).run
|
21
26
|
end
|
data/lib/aws_ec2/core.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'pathname'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
module AwsEc2
|
4
5
|
module Core
|
@@ -11,10 +12,6 @@ module AwsEc2
|
|
11
12
|
Setting.new.data
|
12
13
|
end
|
13
14
|
|
14
|
-
def env
|
15
|
-
ENV['AWS_EC2_ENV'] || 'development'
|
16
|
-
end
|
17
|
-
|
18
15
|
def root
|
19
16
|
path = ENV['AWS_EC2_ROOT'] || '.'
|
20
17
|
Pathname.new(path)
|
@@ -26,5 +23,29 @@ module AwsEc2
|
|
26
23
|
exit
|
27
24
|
end
|
28
25
|
end
|
26
|
+
|
27
|
+
@@env = nil
|
28
|
+
def env
|
29
|
+
return @@env if @@env
|
30
|
+
env = env_from_profile(ENV['AWS_PROFILE']) || 'development'
|
31
|
+
env = ENV['AWS_EC2_ENV'] if ENV['AWS_EC2_ENV'] # highest precedence
|
32
|
+
@@env = env
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
# Do not use the Setting class to load the profile because it can cause an
|
37
|
+
# infinite loop then if we decide to use AwsEc2.env from within settings class.
|
38
|
+
def env_from_profile(aws_profile)
|
39
|
+
settings_path = "#{AwsEc2.root}/config/settings.yml"
|
40
|
+
return unless File.exist?(settings_path)
|
41
|
+
|
42
|
+
data = YAML.load_file(settings_path)
|
43
|
+
env = data.find do |_env, setting|
|
44
|
+
setting ||= {}
|
45
|
+
profiles = setting['aws_profiles']
|
46
|
+
profiles && profiles.include?(aws_profile)
|
47
|
+
end
|
48
|
+
env.first if env
|
49
|
+
end
|
29
50
|
end
|
30
51
|
end
|
data/lib/aws_ec2/create.rb
CHANGED
@@ -12,18 +12,19 @@ module AwsEc2
|
|
12
12
|
def run
|
13
13
|
Profile.new(@options).check!
|
14
14
|
|
15
|
-
puts "Creating EC2 instance #{@name}..."
|
16
|
-
display_info
|
17
|
-
|
18
15
|
Hook.run(:before_run_instances, @options)
|
19
16
|
sync_scripts_to_s3
|
20
17
|
|
18
|
+
puts "Creating EC2 instance #{@name.colorize(:green)}"
|
19
|
+
display_ec2_info
|
21
20
|
if @options[:noop]
|
22
21
|
puts "NOOP mode enabled. EC2 instance not created."
|
23
22
|
return
|
24
23
|
end
|
25
|
-
run_instances(params)
|
26
|
-
|
24
|
+
resp = run_instances(params)
|
25
|
+
instance_id = resp.instances.first.instance_id
|
26
|
+
display_spot_info(instance_id)
|
27
|
+
puts "EC2 instance #{@name} created: #{instance_id} 🎉"
|
27
28
|
puts "Visit https://console.aws.amazon.com/ec2/home to check on the status"
|
28
29
|
end
|
29
30
|
|
@@ -33,10 +34,11 @@ module AwsEc2
|
|
33
34
|
handle_ec2_service_error!(e)
|
34
35
|
end
|
35
36
|
|
36
|
-
# Configured by config/
|
37
|
-
# Example: config/
|
37
|
+
# Configured by config/settings.yml.
|
38
|
+
# Example: config/settings.yml:
|
38
39
|
#
|
39
|
-
#
|
40
|
+
# development:
|
41
|
+
# s3_folder: my-bucket/folder
|
40
42
|
def sync_scripts_to_s3
|
41
43
|
if AwsEc2.settings["s3_folder"]
|
42
44
|
Script::Upload.new(@options).run
|
@@ -48,7 +50,15 @@ module AwsEc2
|
|
48
50
|
@params ||= Params.new(@options).generate
|
49
51
|
end
|
50
52
|
|
51
|
-
def
|
53
|
+
def display_spot_info(instance_id)
|
54
|
+
resp = ec2.describe_instances(instance_ids: [instance_id])
|
55
|
+
spot_id = resp.reservations.first.instances.first.spot_instance_request_id
|
56
|
+
return unless spot_id
|
57
|
+
|
58
|
+
puts "Spot instance request id: #{spot_id}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def display_ec2_info
|
52
62
|
puts "Using the following parameters:"
|
53
63
|
pretty_display(params)
|
54
64
|
|
data/lib/aws_ec2/help/upload.md
CHANGED
@@ -2,8 +2,9 @@ Examples:
|
|
2
2
|
|
3
3
|
$ aws-ec2 upload
|
4
4
|
|
5
|
-
Compiles the app/scripts and app/user-data files to the tmp folder. Then uploads the files to an s3 bucket that is configured in config/
|
5
|
+
Compiles the app/scripts and app/user-data files to the tmp folder. Then uploads the files to an s3 bucket that is configured in config/settings.yml. Example s3_folder setting:
|
6
6
|
|
7
7
|
```yaml
|
8
|
-
|
8
|
+
development:
|
9
|
+
s3_folder: my-bucket/folder # enables auto sync to s3
|
9
10
|
```
|
data/lib/aws_ec2/profile.rb
CHANGED
@@ -25,7 +25,16 @@ module AwsEc2
|
|
25
25
|
|
26
26
|
puts "Using profile: #{file}".colorize(:green)
|
27
27
|
text = RenderMePretty.result(file, context: context)
|
28
|
-
|
28
|
+
begin
|
29
|
+
data = YAML.load(text)
|
30
|
+
rescue Psych::SyntaxError => e
|
31
|
+
tmp_file = file.sub("profiles", "tmp")
|
32
|
+
IO.write(tmp_file, text)
|
33
|
+
puts "There was an error evaluating in your yaml file #{file}".colorize(:red)
|
34
|
+
puts "The evaludated yaml file has been saved at #{tmp_file} for debugging."
|
35
|
+
puts "ERROR: #{e.message}"
|
36
|
+
exit 1
|
37
|
+
end
|
29
38
|
data ? data : {} # in case the file is empty
|
30
39
|
data.has_key?("run_instances") ? data["run_instances"] : data
|
31
40
|
end
|
data/lib/aws_ec2/script.rb
CHANGED
@@ -8,23 +8,39 @@ module AwsEc2
|
|
8
8
|
@options = options
|
9
9
|
end
|
10
10
|
|
11
|
+
def add_to_user_data!(user_data)
|
12
|
+
user_data
|
13
|
+
end
|
14
|
+
|
15
|
+
def auto_terminate_after_timeout
|
16
|
+
load_template("auto_terminate_after_timeout.sh")
|
17
|
+
end
|
18
|
+
|
11
19
|
def auto_terminate
|
20
|
+
# set variables for the template
|
12
21
|
@ami_name = @options[:ami_name]
|
13
22
|
load_template("auto_terminate.sh")
|
14
23
|
end
|
15
24
|
|
25
|
+
def cloudwatch
|
26
|
+
load_template("cloudwatch.sh")
|
27
|
+
end
|
28
|
+
|
16
29
|
def create_ami
|
17
|
-
# set
|
30
|
+
# set variables for the template
|
18
31
|
@ami_name = @options[:ami_name]
|
19
32
|
@region = `aws configure get region`.strip rescue 'us-east-1'
|
20
33
|
load_template("ami_creation.sh")
|
21
34
|
end
|
22
35
|
|
36
|
+
def extract_aws_ec2_scripts
|
37
|
+
load_template("extract_aws_ec2_scripts.sh")
|
38
|
+
end
|
39
|
+
|
23
40
|
private
|
24
41
|
def load_template(name)
|
25
|
-
template = IO.read(File.expand_path("
|
42
|
+
template = IO.read(File.expand_path("script/templates/#{name}", File.dirname(__FILE__)))
|
26
43
|
text = ERB.new(template, nil, "-").result(binding)
|
27
|
-
"#" * 60 + "\n#{text}"
|
28
44
|
end
|
29
45
|
end
|
30
46
|
end
|
@@ -20,14 +20,14 @@ class AwsEc2::Script
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def compile_folder(folder, layout_path=false)
|
23
|
-
puts "Compiling app/#{folder}
|
23
|
+
puts "Compiling app/#{folder} to tmp/app/#{folder}.".colorize(:green)
|
24
24
|
Dir.glob("#{AwsEc2.root}/app/#{folder}/**/*").each do |path|
|
25
25
|
next if File.directory?(path)
|
26
26
|
next if path.include?("layouts")
|
27
27
|
|
28
28
|
result = RenderMePretty.result(path, layout: layout_path, context: context)
|
29
29
|
tmp_path = path.sub(%r{.*/app/}, "#{BUILD_ROOT}/app/")
|
30
|
-
puts " #{tmp_path}"
|
30
|
+
puts " #{tmp_path}" if @options[:verbose]
|
31
31
|
FileUtils.mkdir_p(File.dirname(tmp_path))
|
32
32
|
IO.write(tmp_path, result)
|
33
33
|
end
|
@@ -4,7 +4,7 @@ class AwsEc2::Script
|
|
4
4
|
class Compress < AwsEc2::Base
|
5
5
|
def compress
|
6
6
|
reset
|
7
|
-
puts "Tarballing #{BUILD_ROOT}/app/scripts folder to scripts.tgz"
|
7
|
+
puts "Tarballing #{BUILD_ROOT}/app/scripts folder to scripts.tgz".colorize(:green)
|
8
8
|
tarball_path = create_tarball
|
9
9
|
save_scripts_info(tarball_path)
|
10
10
|
puts "Tarball created at #{tarball_path}"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash -eux
|
2
|
+
|
3
|
+
# Create AMI Bundle
|
4
|
+
AMI_NAME="<%= @ami_name %>"
|
5
|
+
INSTANCE_ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
|
6
|
+
REGION=$(aws configure get region)
|
7
|
+
# Note this will cause the instance to reboot. Not using the --no-reboot flag
|
8
|
+
# to ensure consistent AMI creation.
|
9
|
+
SOURCE_AMI_ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/ami-id)
|
10
|
+
echo "$SOURCE_AMI_ID" > /var/log/source-ami-id.txt
|
11
|
+
mkdir -p /opt/aws-ec2/data
|
12
|
+
aws ec2 create-image --name "$AMI_NAME" --instance-id "$INSTANCE_ID" --region "$REGION" > /opt/aws-ec2/data/ami-id.txt
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash -eux
|
2
|
+
|
3
|
+
/opt/aws-ec2/auto_terminate/setup.sh
|
4
|
+
|
5
|
+
<% if @options[:auto_terminate] -%>
|
6
|
+
<% if @options[:ami_name] %>
|
7
|
+
/opt/aws-ec2/auto_terminate.sh later
|
8
|
+
<% else %>
|
9
|
+
/opt/aws-ec2/auto_terminate.sh now # terminate immediately
|
10
|
+
<% end -%>
|
11
|
+
<% end -%>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/bin/bash -eux
|
2
|
+
|
3
|
+
# Downloads and extract the scripts.
|
4
|
+
# The extracted folder from github looks like this:
|
5
|
+
# branch-name.tar.gz => aws-ec2-branch-name
|
6
|
+
# master.tar.gz => aws-ec2-master
|
7
|
+
# v1.0.0.tar.gz => aws-ec2-1.0.0
|
8
|
+
function extract_aws_ec2_scripts() {
|
9
|
+
local temp_folder
|
10
|
+
local url
|
11
|
+
local filename
|
12
|
+
|
13
|
+
rm -rf /opt/aws-ec2 # clean start
|
14
|
+
|
15
|
+
temp_folder="/opt/aws-ec2-temp"
|
16
|
+
rm -rf "$temp_folder"
|
17
|
+
mkdir -p "$temp_folder"
|
18
|
+
|
19
|
+
(
|
20
|
+
cd "$temp_folder"
|
21
|
+
|
22
|
+
<%
|
23
|
+
# Examples:
|
24
|
+
# AWS_EC2_CODE=v1.0.0
|
25
|
+
# AWS_EC2_CODE=master
|
26
|
+
# AWS_EC2_CODE=branch-name
|
27
|
+
#
|
28
|
+
# https://github.com/tongueroo/aws-ec2/archive/v1.0.0.tar.gz
|
29
|
+
# https://github.com/tongueroo/aws-ec2/archive/master.tar.gz
|
30
|
+
code_version = ENV['AWS_EC2_CODE']
|
31
|
+
code_version ||= "v#{AwsEc2::VERSION}"
|
32
|
+
%>
|
33
|
+
url="https://github.com/tongueroo/aws-ec2/archive/<%= code_version %>.tar.gz"
|
34
|
+
filename=$(basename "$url")
|
35
|
+
folder="${filename%.tar.gz}" # remove extension
|
36
|
+
folder="${folder#v}" # remove leading v character
|
37
|
+
folder="aws-ec2-$folder" # IE: aws-ec2-1.0.0
|
38
|
+
|
39
|
+
wget "$url"
|
40
|
+
tar zxf "$filename"
|
41
|
+
|
42
|
+
mv "$temp_folder/$folder/lib/aws_ec2/scripts" /opt/aws-ec2
|
43
|
+
rm -rf "$temp_folder"
|
44
|
+
chmod a+x -R /opt/aws-ec2
|
45
|
+
)
|
46
|
+
}
|
47
|
+
|
48
|
+
extract_aws_ec2_scripts
|
@@ -19,7 +19,7 @@ class AwsEc2::Script
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def upload(tarball_path)
|
22
|
-
puts "Uploading scripts.tgz (#{filesize}) to #{s3_dest}"
|
22
|
+
puts "Uploading scripts.tgz (#{filesize}) to #{s3_dest}".colorize(:green)
|
23
23
|
obj = s3_resource.bucket(bucket_name).object(key)
|
24
24
|
start_time = Time.now
|
25
25
|
if @options[:noop]
|