aws-ami 0.0.3 → 0.0.7
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.
- data/bin/aws-ami +5 -13
- data/lib/aws_ami/ami.rb +29 -13
- data/lib/aws_ami/formation.json +6 -1
- metadata +3 -3
data/bin/aws-ami
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
require "rubygems"
|
4
4
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'aws_ami')
|
5
5
|
|
6
|
-
|
7
6
|
require 'optparse'
|
8
7
|
|
9
8
|
options = {}
|
@@ -38,6 +37,10 @@ OptionParser.new do |opts|
|
|
38
37
|
options[:publish_to_account] = v
|
39
38
|
end
|
40
39
|
|
40
|
+
opts.on("-t", "--timeout [TIMEOUT]", "Change default timeout of waiting install script run finished, default is 600 seconds") do |t|
|
41
|
+
options[:timeout] = t
|
42
|
+
end
|
43
|
+
|
41
44
|
opts.on('-h', '--help') do
|
42
45
|
puts opts
|
43
46
|
exit(0)
|
@@ -59,16 +62,5 @@ if options[:dry]
|
|
59
62
|
exit
|
60
63
|
end
|
61
64
|
|
62
|
-
[:name, :region, :install_script, :key_name, :base_ami].each do |n|
|
63
|
-
raise "Must provide #{n}" unless options[n]
|
64
|
-
end
|
65
|
-
|
66
|
-
# ENV variables:
|
67
|
-
# AWS_ACCESS_KEY_ID
|
68
|
-
# AWS_SECRET_ACCESS_KEY
|
69
|
-
|
70
65
|
ami = AWS::AMI.new(options)
|
71
|
-
ami.build
|
72
|
-
'KeyName' => options[:key_name],
|
73
|
-
'InstallScript' => File.read(options[:install_script]),
|
74
|
-
"BaseAMI" => YAML.load(File.read(options[:base_ami]))[options[:region]])
|
66
|
+
ami.build
|
data/lib/aws_ami/ami.rb
CHANGED
@@ -3,31 +3,47 @@ require 'logger'
|
|
3
3
|
|
4
4
|
module AWS
|
5
5
|
class AMI
|
6
|
+
# name: AMI name
|
6
7
|
# region: aws region of the new AMI
|
8
|
+
# key_name: AWS EC2 ssh key name for accessing ec2 instance for debuging problems
|
9
|
+
# install_script: a script file can be run on the ec2 instance that is launched from base ami to install packages
|
10
|
+
# base_ami: a yml file describes base AMI used for building new AMI for each region
|
11
|
+
# timeout: Timeout for running install script, default 600
|
12
|
+
# publish_to_account: publish the AMI to this account if need
|
7
13
|
# assume_yes: true for deleting stack when creating image failed
|
8
14
|
def initialize(options={})
|
9
|
-
@
|
10
|
-
@region = options[:region]
|
15
|
+
@name = options[:name] || raise("Must have a name for the AMI")
|
16
|
+
@region = options[:region] || raise("Must specify aws region")
|
17
|
+
@key_name = options[:key_name] || raise("Please specify aws ssh key name, so that you can debug problem when something goes wrong")
|
18
|
+
@install_script = File.read(options[:install_script]) || raise("Must provide install packages script file")
|
19
|
+
|
20
|
+
@base_ami = YAML.load(File.read(options[:base_ami]))[@region] || raise("Must provide base ami yml file for each region")
|
21
|
+
|
22
|
+
@timeout = options[:timeout] || '600'
|
23
|
+
@assume_yes = options[:assume_yes] || false
|
11
24
|
@publish_to_account = options[:publish_to_account]
|
12
25
|
@test = options[:test]
|
13
26
|
end
|
14
27
|
|
15
|
-
|
16
|
-
|
17
|
-
# BaseAMI: the base AMI id for the new AMI, for example:
|
18
|
-
# "ami-0d153248" for the "ubuntu/images/ebs/ubuntu-precise-12.04-amd64-server-20121001" in us-west-1 region
|
19
|
-
# KeyName: the ssh key name for accessing the ec2 instance while building the AMI, this is only used when you need to debug problems
|
20
|
-
# InstallScript: the script installs everything need for the AMI, from 2048 to 16k bytes depending on the base ami provided
|
21
|
-
def build(name, parameters)
|
22
|
-
stack = cloudformation.stacks.create("build-#{name}-ami",
|
28
|
+
def build
|
29
|
+
stack = cloudformation.stacks.create("build-#{@name}-ami",
|
23
30
|
load_formation,
|
24
31
|
:disable_rollback => true,
|
25
|
-
:parameters =>
|
32
|
+
:parameters => {
|
33
|
+
'Timeout' => @timeout,
|
34
|
+
'KeyName' => @key_name,
|
35
|
+
'InstallScript' => @install_script,
|
36
|
+
"BaseAMI" => @base_ami
|
37
|
+
})
|
26
38
|
logger.info "creating stack"
|
27
39
|
wait_until_created(stack)
|
28
40
|
begin
|
29
41
|
instance_id = stack.resources['EC2Instance'].physical_resource_id
|
42
|
+
instance = ec2.instances[instance_id]
|
30
43
|
if @test
|
44
|
+
puts "Build AMI Stack created"
|
45
|
+
puts "EC2 instance dns name: #{instance.dns_name}, ip address: #{instance.ip_address}"
|
46
|
+
puts "continue to create AMI Image? [y/n]"
|
31
47
|
unless gets.strip == 'y'
|
32
48
|
logger.info "delete stack and stop"
|
33
49
|
stack.delete
|
@@ -36,7 +52,7 @@ module AWS
|
|
36
52
|
logger.info "continue to create image"
|
37
53
|
end
|
38
54
|
logger.info "creating image"
|
39
|
-
image =
|
55
|
+
image = instance.create_image(@name, :description => "Created at #{Time.now}")
|
40
56
|
sleep 2 until image.exists?
|
41
57
|
logger.info "image #{image.id} state: #{image.state}"
|
42
58
|
sleep 5 until image.state != :pending
|
@@ -63,7 +79,7 @@ module AWS
|
|
63
79
|
logger.info "add permissions for #{@publish_to_account}"
|
64
80
|
image.permissions.add(@publish_to_account.gsub(/-/, ''))
|
65
81
|
end
|
66
|
-
logger.info "Image #{name}[#{image.id}] created"
|
82
|
+
logger.info "Image #{@name}[#{image.id}] created"
|
67
83
|
end
|
68
84
|
|
69
85
|
private
|
data/lib/aws_ami/formation.json
CHANGED
@@ -13,6 +13,11 @@
|
|
13
13
|
"BaseAMI": {
|
14
14
|
"Description": "Base AMI for the new AMI",
|
15
15
|
"Type": "String"
|
16
|
+
},
|
17
|
+
"Timeout": {
|
18
|
+
"Description": "Timeout for waiting EC2 instance complete the install script",
|
19
|
+
"Type": "Number",
|
20
|
+
"Default": "600"
|
16
21
|
}
|
17
22
|
},
|
18
23
|
|
@@ -56,7 +61,7 @@
|
|
56
61
|
"Type" : "AWS::CloudFormation::WaitCondition",
|
57
62
|
"Properties" : {
|
58
63
|
"Handle" : { "Ref" : "myWaitHandle" },
|
59
|
-
"Timeout" : "
|
64
|
+
"Timeout" : { "Ref" : "Timeout" }
|
60
65
|
}
|
61
66
|
}
|
62
67
|
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-ami
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -42,7 +42,7 @@ files:
|
|
42
42
|
homepage: http://github.com/ThoughtWorksStudios/aws-ami
|
43
43
|
licenses:
|
44
44
|
- MIT
|
45
|
-
post_install_message: run aws-ami -h for
|
45
|
+
post_install_message: run 'aws-ami -h' for how to use
|
46
46
|
rdoc_options: []
|
47
47
|
require_paths:
|
48
48
|
- lib
|
@@ -63,6 +63,6 @@ rubyforge_project:
|
|
63
63
|
rubygems_version: 1.8.24
|
64
64
|
signing_key:
|
65
65
|
specification_version: 3
|
66
|
-
summary: AWS AMI
|
66
|
+
summary: A tool for creating AWS AMI from a base AMI and an install packages script
|
67
67
|
test_files: []
|
68
68
|
has_rdoc:
|