Provides an expressive, object-oriented interface to Amazon EC2.
You can setup default credentials for all AWS services via AWS.config:
AWS.config( :access_key_id => 'YOUR_ACCESS_KEY_ID', :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
Or you can set them directly on the EC2 interface:
ec2 = AWS::EC2.new( :access_key_id => 'YOUR_ACCESS_KEY_ID', :secret_access_key => 'YOUR_SECRET_ACCESS_KEY')
EC2 uses instances to run your software.
To run an instance:
ec2.instances.create(:image_id => "ami-8c1fece5")
To get an instance by ID:
i = ec2.instances["i-12345678"] i.exists?
To get a list of instances:
ec2.instances.inject({}) { |m, i| m[i.id] = i.status; m } # => { "i-12345678" => :running, "i-87654321" => :shutting_down }
A security group is a named collection of access rules. These access rules specify which ingress (i.e., incoming) network traffic should be delivered to your instance. All other ingress traffic will be discarded.
To create a security group:
websvr = ec2.security_groups.create('webservers')
Then you can add ingress authorizations. In the following example we add a rule that allows web traffic from the entire internet.
# web traffic websvr.authorize_ingress(:tcp, 80)
You can also specify a port range. Here we are opening FTP traffic:
# ftp traffic websvr.authorize_ingress(:tcp, 20..21)
If you want to limit an authorization to a particular CIDR IP address or list of address, just add them to the authorize_ingress call.
# ssh access websrvr.authorize_ingress(:tcp, 22, '1.1.1.1/0', '2.2.2.2/0')
You can also provide another security group instead of CIDR IP addresses. This allows incoming traffic from EC2 instances in the given security group(s).
# get two existing security groups dbsvrs = ec2.security_groups.filter('group-name', 'db-servers').first websvrs = ec2.security_groups.filter('group-name', 'web-servers').first # allow instances in the 'web-servers' security group to connect # to instances in the 'db-servers' security group over tcp port 3306 dbsvrs.authorize_ingress(:tcp, 3306, websvrs)
There are a few handy shortcuts for allowing pings:
wbsvrs.allow_ping
Just like with authorize_ingress you can pass a security group or a list of CIDR IP addresses to allow ping to limit where you can ping from.
You can also use the same parameters from the examples above to {AWS::EC2::SecurityGroup#revoke_ingress} and {AWS::EC2::SecurityGroup#disallow_ping}.
You can specify other protocols than :tcp
, like :udp and
:icmp.
You can allocate up to 5 elastic IP addresses for each account. You can associate those elastic IP addresses with EC2 instances:
instance = ec2.instances['i-12345678'] ip = ec2.elastic_ips.allocate instance.ip_address # 1.1.1.1 ip.ip_address # 2.2.2.2 instance.associate_elastic_ip(ip) instance.ip_address # 2.2.2.2 instance.disassociate_elastic_ip instance.ip_address # 1.1.1.1
When you are done with an elastic IP address you should release it. In the following example we release all elastic IP addresses that are not currently associated with an instance:
ec2.select{|ip| !ip.associated? }.each(&:release)
Public Amazon Machine Image (AMI) instances have no password, and you need a public/private key pair to log in to them. The public key half of this pair is embedded in your instance, allowing you to use the private key to log in securely without a password.
You can generate a key pair yourself and then send the public part to EC2 using {AWS::EC2::KeyPairCollection#import}. For example:
key_pair = ec2.key_pairs.import("mykey", File.read("~/.ssh/identity.pub"))
You can also ask EC2 to generate a key pair for you. For example:
key_pair = ec2.key_pairs.create("mykey") File.open("~/.ssh/ec2", "w") do |f| f.write(key_pair.private_key) end
Any of the collections in the interface may be filtered by a number of different parameters. For example, to get all the windows images owned by amazon where the description includes the string “linux”, you can do this:
ec2.images.with_owner("amazon"). filter("platform", "windows"). filter("description", "*linux*")
Similarly, you can tag images, instances, security groups, snapshots, and volumes with free-form key-value metadata and filter on that metadata. For example:
ec2.images["ami-123"].tags << "myapp" ec2.images.tagged("myapp") # will include ami-123
Amazon has data centers in different areas of the world (e.g., North America, Europe, Asia, etc.). Correspondingly, EC2 is available to use in different Regions. By launching instances in separate Regions, you can design your application to be closer to specific customers or to meet legal or other requirements. Prices for Amazon EC2 usage vary by Region (for more information about pricing by Region, go to the Amazon EC2 Pricing page). You can use the Ruby SDK to see which regions are available for your account:
ec2.regions.map(&:name) # => ["us-east-1", ...]
The default region is us-east-1
; you can access other regions
like this:
ec2_us_west = ec2.regions["us-west-1"] # starts an instance in eu-west-1 ec2_us_west.instances.create(:image_id => 'ami-3bc9997e')
This makes a call to EC2’s DescribeRegions API to find the endpoint for “us-west-1” – if you just want to configure a different endpoint without making a call to EC2, you can do it like this:
ec2 = AWS::EC2.new(:ec2_endpoint => "ec2.us-west-1.amazonaws.com")
Each Region contains multiple distinct locations called Availability Zones. Each Availability Zone is engineered to be isolated from failures in other Availability zones and to provide inexpensive, low-latency network connectivity to other zones in the same Region. By launching instances in separate Availability Zones, you can protect your applications from the failure of a single location.
You can use the {availability_zones} collection to get information about the available zones available to your account. For example:
ec2.availability_zones.map(&:name) # => ["us-east-1a", ...]
An Amazon Machine Image (AMI) contains all information necessary to boot instances of your software. For example, an AMI might contain all the software to act as a web server (e.g., Linux, Apache, and your web site) or it might contain all the software to act as a Hadoop node (e.g., Linux, Hadoop, and a custom application).
You can use the {images} collection to get information about the images available to your account. For example:
ec2.images.with_owner("amazon").map(&:name)
You can also use the images collection to create new images:
ec2.images.create(:image_location => "mybucket/manifest.xml", :name => "my-image")
@return [AvailabilityZoneCollection] A collection representing
all EC2 availability zones.
# File lib/aws/ec2.rb, line 316 def availability_zones AvailabilityZoneCollection.new(:config => config) end
# File spec/aws/ec2/attachment_spec.rb, line 210 def check_value(value) value.should == :attaching end
@return [ElasticIpCollection] A collection representing all
elastic IP addresses for this account.
# File lib/aws/ec2.rb, line 293 def elastic_ips ElasticIpCollection.new(:config => config) end
# File spec/aws/ec2/resource_tag_collection_spec.rb, line 407 def expect_filters(client) client.should_receive(:describe_tags). with(:filters => [{ :name => "resource-id", :values => ["resource-id"] }, { :name => "resource-type", :values => ["resource-object"] }, { :name => "key", :values => ["foo", "baz"] }]) end
@return [ImageCollection] A collection representing
all Amazon Machine Images available to your account.
# File lib/aws/ec2.rb, line 322 def images ImageCollection.new(:config => config) end
@return [InstanceCollection] A collection representing all instances
# File lib/aws/ec2.rb, line 281 def instances InstanceCollection.new(:config => config) end
@return [KeyPairCollection] A collection representing all key pairs.
# File lib/aws/ec2.rb, line 298 def key_pairs KeyPairCollection.new(:config => config) end
# File spec/aws/ec2/tag_collection_spec.rb, line 42 def mock_resources [ double("tag1", :resource_type => "security-group", :resource_id => "sg-0e64f367", :key => "webserver", :value => nil), double("tag2", :resource_type => "instance", :resource_id => "i-7f636513", :key => "stage", :value => "production"), double("tag3", :resource_type => "image", :resource_id => "image-id", :key => "foo", :value => "bar"), double("tag4", :resource_type => "some-weird-resource", :resource_id => "resource-id", :key => "baz", :value => "bla"), double("tag4", :resource_type => "some-fantasy-resource", :resource_id => "resource-id", :key => "boo", :value => "boo") ] end
# File spec/aws/ec2/image_spec.rb, line 295 def modify_params(modification) { :image_id => "ami-123", :launch_permission => modification } end
@return [RegionCollection] A collection representing all EC2
regions.
# File lib/aws/ec2.rb, line 310 def regions RegionCollection.new(:config => config) end
@return [ReservedInstancesCollection] A collection representing all
purchased reserved instance offerings.
# File lib/aws/ec2.rb, line 334 def reserved_instances ReservedInstancesCollection.new(:config => config) end
@return [ReservedInstancesOfferingCollection] A collection representing all
reserved instance offerings that may be purchased.
# File lib/aws/ec2.rb, line 340 def reserved_instances_offerings ReservedInstancesOfferingCollection.new(:config => config) end
# File spec/aws/ec2/instance_collection_spec.rb, line 327 def run_instance options = {} collection.create(options.merge(:image_id => 'ami-123')) end
@return [SecurityGroupCollection] A collection representing all security
groups.
# File lib/aws/ec2.rb, line 287 def security_groups SecurityGroupCollection.new(:config => config) end
# File spec/aws/ec2/instance_collection_spec.rb, line 337 def should_receive_sg_ids *ids client.should_receive(:run_instances). with(hash_including(:security_group_ids => ids)). and_return(resp) end
# File spec/aws/ec2/instance_collection_spec.rb, line 331 def should_receive_sg_names *names client.should_receive(:run_instances). with(hash_including(:security_groups => names)). and_return(resp) end
@return [SnapshotCollection] A collection representing
all EBS snapshots available to your account.
# File lib/aws/ec2.rb, line 346 def snapshots SnapshotCollection.new(:config => config) end
# File spec/aws/ec2/instance_spec.rb, line 87 def stub_exists(resp) stub_response_instance(resp, resource.id, double("instance")) end
# File spec/aws/ec2/elastic_ip_spec.rb, line 39 def stub_member(resp, member) resp.stub(:address_index). and_return(Hash[[[member.public_ip, member]]]) end
# File spec/aws/ec2/security_group_spec.rb, line 49 def stub_response_group(resp, id, group) resp.stub(:security_group_index). and_return(Hash[[[id, group]]]) end
# File spec/aws/ec2/instance_spec.rb, line 29 def stub_response_instance(resp, id, instance) reservation = double("reservation", :instances_set => [instance]) resp.stub(:instance_index). and_return(Hash[[[id, instance]]]) resp.stub(:reservation_index). and_return(Hash[[[id, reservation]]]) resp.stub(:reservation_set). and_return([reservation]) end
# File spec/aws/ec2/availability_zone_collection_spec.rb, line 31 def stub_two_members(resp) resp.stub(:availability_zone_info). and_return([double("az1", :region_name => "foo", :zone_name => "az1"), double("az2", :region_name => "bar", :zone_name => "az2")]) end
# File spec/aws/ec2/attachment_spec.rb, line 207 def stub_value(response_attachment) response_attachment.stub(:status).and_return("attaching") end
@return [VolumeCollection] A collection representing
all EBS volumes available to your account.
# File lib/aws/ec2.rb, line 328 def volumes VolumeCollection.new(:config => config) end