aws-ec2 0.2.0 → 0.3.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -2
- data/README.md +13 -16
- data/lib/aws-ec2.rb +1 -0
- data/lib/aws_ec2/ami.rb +15 -0
- data/lib/aws_ec2/cli.rb +2 -0
- data/lib/aws_ec2/help/create.md +8 -0
- data/lib/aws_ec2/help/user_data.md +8 -0
- data/lib/aws_ec2/scripts/ami_creation.sh +27 -0
- data/lib/aws_ec2/template_helper.rb +30 -2
- data/lib/aws_ec2/user_data.rb +1 -7
- data/lib/aws_ec2/util.rb +4 -3
- data/lib/aws_ec2/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4c5bf33bed4b038a859606fca1faf595e8fca5455f3ae4e3c07f3c2329d7c3b
|
4
|
+
data.tar.gz: f57b5c4305db3141a8f8dd1c540669ed2d666403df7d05af6a3ddb36f1d79280
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab78f966ab1614ebe690b16f04d9e053803df832103542686d7697cc60af3e81ea341af447bb42c9fc181b599ac2cfdf268f665138441662a72d683e2da74bb
|
7
|
+
data.tar.gz: 787504de7fb53ae1c7656a420cbede3ae3c44844d21315b488ebd9fe6e005b06256800a6fd03d219ecd28f7e4c50192b9faad59e5ae9be1c6bf99a06d347058f
|
data/CHANGELOG.md
CHANGED
@@ -3,8 +3,13 @@
|
|
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
|
+
## [0.3.0]
|
7
|
+
- Do not merge profile to default profile. This was pretty confusing usage.
|
8
|
+
- Add --ami option which result in automatically creating an ami at the end of
|
9
|
+
the user-data script.
|
10
|
+
|
6
11
|
## [0.2.0]
|
7
|
-
-
|
12
|
+
- Add config files support. example: config/development.yml.
|
8
13
|
|
9
14
|
## [0.1.0]
|
10
|
-
-
|
15
|
+
- Initial release.
|
data/README.md
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
Simple tool to create AWS ec2 instances consistently with pre-configured settings. The pre-configured settings are stored in the profiles folder of the current directory.
|
4
4
|
Example:
|
5
5
|
|
6
|
-
* profiles/default.yml: default settings.
|
7
|
-
* profiles/myserver.yml: myserver settings
|
6
|
+
* profiles/default.yml: default settings. If there is no other matching profile.
|
7
|
+
* profiles/myserver.yml: myserver settings.
|
8
8
|
|
9
9
|
## Usage
|
10
10
|
|
@@ -14,6 +14,13 @@ aws-ec2 create myserver --profile myserver
|
|
14
14
|
|
15
15
|
In a nutshell, the profile parameters are passed to the ruby aws-sdk [AWS::EC2::Client#run_instances](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Client.html#run_instances-instance_method) method. So you can specify any parameter you wish that is available there. To check out what a profile looks like look at the [example default](example/profiles/default.yml)
|
16
16
|
|
17
|
+
You can use ERB in the profile files. Some useful helper methods in the profile files are:
|
18
|
+
|
19
|
+
* user_data: a helper method that allows you to embed a generated user_data script. More details on the user_data helper are provided below.
|
20
|
+
* config:
|
21
|
+
|
22
|
+
The template helpers defined in [template_helper.rb](lib/aws_ec2/template_helper.rb).
|
23
|
+
|
17
24
|
### Convention
|
18
25
|
|
19
26
|
By convention, the profile name matches the first parameter after the create command. So the command above could be shortened to:
|
@@ -34,6 +41,10 @@ The user-data script is generated on the machine that is running the aws-ec2 com
|
|
34
41
|
|
35
42
|
To use the user-data script when creating an EC2 instance, you can use the helper method in the profile.
|
36
43
|
|
44
|
+
### Config
|
45
|
+
|
46
|
+
You can set a config file and define variables in there that are available to in your profiles and user_data scripts.
|
47
|
+
|
37
48
|
## Noop mode
|
38
49
|
|
39
50
|
You can do a test run with the `--noop` flag. This will print out what settings will be used to launch the instance.
|
@@ -49,20 +60,6 @@ Spot instance support natively supported by the AWS run_instances command. Simp
|
|
49
60
|
* [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateSpotMarketOptionsRequest.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateSpotMarketOptionsRequest.html)
|
50
61
|
* [https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Types/SpotMarketOptions.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Types/SpotMarketOptions.html)
|
51
62
|
|
52
|
-
## Spot Fleet Support
|
53
|
-
|
54
|
-
Additionally, spot fleet is supported. Launching a fleet request is slighlyt more complicated but is useful if you are okay with multiple types of instances. The spot instance profile files are stored in the profiles/spot folder. Example:
|
55
|
-
|
56
|
-
* profiles/spot/default.yml: default settings. Takes the lowest precedence.
|
57
|
-
* profiles/spot/myspot.yml: myspot settings get combined with the default settings
|
58
|
-
|
59
|
-
Note the parameters structure of a spot fleet request is different from the parameter structure to run a single instance with the create command above. The profile parameters are passed to the ruby aws-sdk [AWS::EC2::Client#request_spot_fleet](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/EC2/Client.html#request_spot_fleet-instance_method) method. So you can specify any parameter you wish that is available there.
|
60
|
-
|
61
|
-
```sh
|
62
|
-
ec2 spot myspot --profile myspot
|
63
|
-
ec2 spot myspot # same as above by convention
|
64
|
-
```
|
65
|
-
|
66
63
|
## More Help
|
67
64
|
|
68
65
|
```sh
|
data/lib/aws-ec2.rb
CHANGED
data/lib/aws_ec2/ami.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module AwsEc2
|
2
|
+
class Ami
|
3
|
+
def initialize(ami_name)
|
4
|
+
@ami_name = ami_name
|
5
|
+
end
|
6
|
+
|
7
|
+
def user_data_snippet
|
8
|
+
region = `aws configure get region`.strip rescue 'us-east-1'
|
9
|
+
# the shebang line is here in case there's currently an
|
10
|
+
# empty user-data script. If there is not, then it wont hurt.
|
11
|
+
template = IO.read(File.expand_path("../scripts/ami_creation.sh", __FILE__))
|
12
|
+
ERB.new(template, nil, "-").result(binding)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/aws_ec2/cli.rb
CHANGED
@@ -5,6 +5,7 @@ module AwsEc2
|
|
5
5
|
class_option :profile, desc: "profile name to use"
|
6
6
|
|
7
7
|
desc "create NAME", "create ec2 instance"
|
8
|
+
option :ami, desc: "ami name, if specified an ami will be created at the end of user data"
|
8
9
|
long_desc Help.text(:create)
|
9
10
|
def create(name)
|
10
11
|
Create.new(options.merge(name: name)).run
|
@@ -17,6 +18,7 @@ module AwsEc2
|
|
17
18
|
end
|
18
19
|
|
19
20
|
desc "userdata NAME", "displays generated userdata script"
|
21
|
+
option :ami, desc: "ami name, if specified an ami will be created at the end of user data"
|
20
22
|
long_desc Help.text(:user_data)
|
21
23
|
def userdata(name)
|
22
24
|
UserData.new(options.merge(name: name)).run
|
data/lib/aws_ec2/help/create.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
1
|
Examples:
|
2
2
|
|
3
3
|
$ aws-ec2 create my-instance
|
4
|
+
|
5
|
+
If you want to create an ami at the end of of a successful user-data script run you can use the `--ami` option. Example:
|
6
|
+
|
7
|
+
$ aws-ec2 create my-instance --ami myname
|
8
|
+
|
9
|
+
To see the snippet of code that gets added to the user-data script you can use the aws-ec2 userdata command.
|
10
|
+
|
11
|
+
$ aws-ec2 userdata myscript --ami myname
|
@@ -3,3 +3,11 @@ Displays the generated user data script. Useful for debugging since ERB can be r
|
|
3
3
|
Given a user data script in profiles/user-data/myscript.sh, run:
|
4
4
|
|
5
5
|
$ aws-ec2 userdata myscript
|
6
|
+
|
7
|
+
You can have an ami creation snippet of code added to the end of the user data script with the `--ami` option.
|
8
|
+
|
9
|
+
$ aws-ec2 userdata myscript --ami myname
|
10
|
+
|
11
|
+
If you want to include a timestamp in the name you can use this:
|
12
|
+
|
13
|
+
$ aws-ec2 userdata myscript --ami '`date "+myname_%Y-%m-%d-%H-%M"`'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/bin/bash -exu
|
2
|
+
|
3
|
+
# Configure aws cli in case it is not yet configured
|
4
|
+
mkdir -p /home/ec2-user/.aws
|
5
|
+
if [ ! -f /home/ec2-user/.aws/config ]; then
|
6
|
+
cat >/home/ec2-user/.aws/config <<EOL
|
7
|
+
[default]
|
8
|
+
region = <%= region %>
|
9
|
+
output = json
|
10
|
+
EOL
|
11
|
+
fi
|
12
|
+
|
13
|
+
# The aws ec2 create-image command below reboots the instance.
|
14
|
+
# So before rebooting the instance, schedule a job to terminate the instance
|
15
|
+
# in 20 mins after the machine has rebooted
|
16
|
+
cat >~/terminate-myself.sh <<EOL
|
17
|
+
#!/bin/bash -exu
|
18
|
+
INSTANCE_ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
|
19
|
+
aws ec2 terminate-instances --instance-ids \$INSTANCE_ID
|
20
|
+
EOL
|
21
|
+
at now + 1 minutes -f ~/terminate-myself.sh
|
22
|
+
|
23
|
+
# Create AMI Bundle
|
24
|
+
AMI_NAME="<%= @ami_name %>"
|
25
|
+
INSTANCE_ID=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)
|
26
|
+
REGION=$(aws configure get region)
|
27
|
+
aws ec2 create-image --name $AMI_NAME --instance-id $INSTANCE_ID --region $REGION
|
@@ -3,7 +3,7 @@ require "erb"
|
|
3
3
|
|
4
4
|
module AwsEc2
|
5
5
|
module TemplateHelper
|
6
|
-
def user_data(name)
|
6
|
+
def user_data(name, base64=true)
|
7
7
|
# allow user to specify the path also
|
8
8
|
if File.exist?(name)
|
9
9
|
name = File.basename(name) # normalize name, change path to name
|
@@ -11,8 +11,36 @@ module AwsEc2
|
|
11
11
|
name = File.basename(name, '.sh')
|
12
12
|
path = "#{root}/profiles/user-data/#{name}.sh"
|
13
13
|
result = erb_result(path)
|
14
|
+
result = append_ami_creation(result)
|
14
15
|
|
15
|
-
Base64.encode64(result).strip
|
16
|
+
base64 ? Base64.encode64(result).strip : result
|
17
|
+
end
|
18
|
+
|
19
|
+
# provides access to config/* settings as variables
|
20
|
+
# AWS_EC2_ENV=development => config/development.yml
|
21
|
+
# AWS_EC2_ENV=production => config/production.yml
|
22
|
+
def config
|
23
|
+
AwsEc2.config
|
24
|
+
end
|
25
|
+
|
26
|
+
# pretty timestamp that is useful for ami ids.
|
27
|
+
# the timestamp is generated once and cached.
|
28
|
+
def timestamp
|
29
|
+
@timestamp ||= Time.now.strftime("%Y-%m-%d-%H-%M-%S")
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def append_ami_creation(user_data)
|
34
|
+
ami = @options[:ami]
|
35
|
+
|
36
|
+
if ami
|
37
|
+
# assuming that the user-data script is a bash script here for simplicity
|
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
|
43
|
+
user_data
|
16
44
|
end
|
17
45
|
|
18
46
|
def erb_result(path)
|
data/lib/aws_ec2/user_data.rb
CHANGED
@@ -11,13 +11,7 @@ module AwsEc2
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def run
|
14
|
-
|
15
|
-
filename = File.basename(@options[:name], '.sh')
|
16
|
-
end
|
17
|
-
|
18
|
-
filename ||= @options[:name]
|
19
|
-
path = "profiles/user-data/#{filename}.sh"
|
20
|
-
puts erb_result(path)
|
14
|
+
puts user_data(@options[:name], false)
|
21
15
|
end
|
22
16
|
end
|
23
17
|
end
|
data/lib/aws_ec2/util.rb
CHANGED
@@ -24,9 +24,9 @@ module AwsEc2
|
|
24
24
|
|
25
25
|
params_exit_check!(profile_file, default_file)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
params = File.exist?(profile_file) ?
|
28
|
+
load_profile(profile_file) :
|
29
|
+
load_profile(default_file)
|
30
30
|
@profile_params = params
|
31
31
|
end
|
32
32
|
|
@@ -44,6 +44,7 @@ module AwsEc2
|
|
44
44
|
puts "Using profile: #{file}"
|
45
45
|
data = YAML.load(erb_result(file))
|
46
46
|
data ? data : {} # in case the file is empty
|
47
|
+
data.has_key?("run_instances") ? data["run_instances"] : data
|
47
48
|
end
|
48
49
|
|
49
50
|
def profile_name
|
data/lib/aws_ec2/version.rb
CHANGED
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.3.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-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- example/profiles/user-data/dev.sh
|
163
163
|
- exe/aws-ec2
|
164
164
|
- lib/aws-ec2.rb
|
165
|
+
- lib/aws_ec2/ami.rb
|
165
166
|
- lib/aws_ec2/aws_services.rb
|
166
167
|
- lib/aws_ec2/cli.rb
|
167
168
|
- lib/aws_ec2/command.rb
|
@@ -172,6 +173,7 @@ files:
|
|
172
173
|
- lib/aws_ec2/help/create.md
|
173
174
|
- lib/aws_ec2/help/spot.md
|
174
175
|
- lib/aws_ec2/help/user_data.md
|
176
|
+
- lib/aws_ec2/scripts/ami_creation.sh
|
175
177
|
- lib/aws_ec2/spot.rb
|
176
178
|
- lib/aws_ec2/template_helper.rb
|
177
179
|
- lib/aws_ec2/user_data.rb
|