VM-EC2
view release on metacpan or search on metacpan
lib/VM/EC2.pm view on Meta::CPAN
for my $d (@devices) {
print $d->deviceName,"\n";
print $d->snapshotId,"\n";
print $d->volumeSize,"\n";
}
# run two instances
my @instances = $image->run_instances(-key_name =>'My_key',
-security_group=>'default',
-min_count =>2,
-instance_type => 't1.micro')
or die $ec2->error_str;
# wait for both instances to reach "running" or other terminal state
$ec2->wait_for_instances(@instances);
# print out both instance's current state and DNS name
for my $i (@instances) {
my $status = $i->current_status;
my $dns = $i->dnsName;
print "$i: [$status] $dns\n";
}
# tag both instances with Role "server"
foreach (@instances) {$_->add_tag(Role=>'server');
# stop both instances
foreach (@instances) {$_->stop}
# find instances tagged with Role=Server that are
# stopped, change the user data and restart.
@instances = $ec2->describe_instances({'tag:Role' => 'Server',
'instance-state-name' => 'stopped'});
for my $i (@instances) {
$i->userData('Secure-mode: off');
$i->start or warn "Couldn't start $i: ",$i->error_str;
}
# create an image from both instance, tag them, and make
# them public
for my $i (@instances) {
my $img = $i->create_image("Autoimage from $i","Test image");
$img->add_tags(Name => "Autoimage from $i",
Role => 'Server',
Status=> 'Production');
$img->make_public(1);
}
## KEY MANAGEMENT
# retrieve the name and fingerprint of the first instance's
# key pair
my $kp = $instances[0]->keyPair;
print $instances[0], ": keypair $kp=",$kp->fingerprint,"\n";
# create a new key pair
$kp = $ec2->create_key_pair('My Key');
# get the private key from this key pair and write it to a disk file
# in ssh-compatible format
my $private_key = $kp->private_key;
open (my $f,'>MyKeypair.rsa') or die $!;
print $f $private_key;
close $f;
# Import a preexisting SSH key
my $public_key = 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8o...';
$key = $ec2->import_key_pair('NewKey',$public_key);
## SECURITY GROUPS AND FIREWALL RULES
# Create a new security group
my $group = $ec2->create_security_group(-name => 'NewGroup',
-description => 'example');
# Add a firewall rule
$group->authorize_incoming(-protocol => 'tcp',
-port => 80,
-source_ip => ['192.168.2.0/24','192.168.2.1/24'});
# Write rules back to Amazon
$group->update;
# Print current firewall rules
print join ("\n",$group->ipPermissions),"\n";
## VOLUME && SNAPSHOT MANAGEMENT
# find existing volumes that are available
my @volumes = $ec2->describe_volumes({status=>'available'});
# back 'em all up to snapshots
foreach (@volumes) {$_->snapshot('Backup on '.localtime)}
# find a stopped instance in first volume's availability zone and
# attach the volume to the instance using /dev/sdg
my $vol = $volumes[0];
my $zone = $vol->availabilityZone;
@instances = $ec2->describe_instances({'availability-zone'=> $zone,
'run-state-name' => $stopped);
$instances[0]->attach_volume($vol=>'/dev/sdg') if @instances;
# create a new 20 gig volume
$vol = $ec2->create_volume(-availability_zone=> 'us-east-1a',
-size => 20);
$ec2->wait_for_volumes($vol);
print "Volume $vol is ready!\n" if $vol->current_status eq 'available';
# create a new elastic address and associate it with an instance
my $address = $ec2->allocate_address();
$instances[0]->associate_address($address);
=head1 DESCRIPTION
This is an interface to the 2014-05-01 version of the Amazon AWS API
(http://aws.amazon.com/ec2). It was written provide access to the new
tag and metadata interface that is not currently supported by
Net::Amazon::EC2, as well as to provide developers with an extension
mechanism for the API. This library will also support the Open Stack
open source cloud (http://www.openstack.org/).
The main interface is the VM::EC2 object, which provides methods for
interrogating the Amazon EC2, launching instances, and managing
instance lifecycle. These methods return the following major object
( run in 0.992 second using v1.01-cache-2.11-cpan-39bf76dae61 )