Skip to content

Instantly share code, notes, and snippets.

@toritori0318
Created May 7, 2011 16:59
Show Gist options
  • Select an option

  • Save toritori0318/960642 to your computer and use it in GitHub Desktop.

Select an option

Save toritori0318/960642 to your computer and use it in GitHub Desktop.
ec2にsshしやすくするスクリプト?
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long qw/GetOptions :config auto_help/;
use Config::Pit;
use Net::Amazon::EC2;
use Term::ReadLine;
# デフォルト値の設定
my $pitname = 'aws_info';
my $region = '';
my $user = '';
my $tags = '';
# オプションの処理
GetOptions(
'pitname=s' => \$pitname,
'region=s' => \$region,
'user=s' => \$user,
'tags=s' => \$tags,
);
my ($aws_access_key_id, $aws_secret_access_key, $pem_file, $conf_region, $conf_user) = do {
@{ Config::Pit::get( $pitname, require => {
'aws_access_key_id' => 'AWS ACCESS KEY ID',
'aws_secret_access_key' => 'AWS SECRET ACCESS KEY',
'pem_file' => 'PEM FILE PATH',
} ) }{ qw/aws_access_key_id aws_secret_access_key pem_file region user / };
};
# デフォルト値の設定(引数優先)
$region = ($conf_region) ? $conf_region : 'ap-northeast-1' if !$region;
$user = ($conf_user) ? $conf_user : 'ec2-user' if !$user;
my $ec2 = Net::Amazon::EC2->new(
AWSAccessKeyId => $aws_access_key_id,
SecretAccessKey => $aws_secret_access_key,
region => $region,
);
sub main{
my $running_instances = $ec2->describe_instances;
my @instances = ();
foreach my $reservation (@$running_instances) {
foreach my $instance ($reservation->instances_set) {
push @instances, $instance if $instance->instance_state->name eq 'running' && $instance->name =~/$tags/;
}
}
if(scalar @instances == 0) {
print "Not Found Running Instance. \n";
exit;
} elsif(scalar @instances == 1) {
exec_ssh($pem_file, $user, $instances[0]->dns_name);
exit;
}
my $no = 0;
printf ("No.%2d %-20s %-20s\n" , ++$no, $_->name, $_->instance_id) for @instances;
my $term = Term::ReadLine->new('Input Number');
while (1) {
my $input = $term->readline('Input No > ');
last if $input =~ /^(q|quit|exit)$/;
if ($input !~ /\d+/ || !$instances[$input-1]) {
print "Invalid Number. \n";
next;
}
exec_ssh($pem_file, $user, $instances[$input-1]->dns_name);
last;
}
}
sub exec_ssh {
my ($pem_file, $loginuser, $dns_name) = @_;
my @cmd = ('ssh', '-i', $pem_file, '-l', $loginuser, $dns_name);
print join(' ', @cmd), "\n";
exec(join(' ', @cmd));
}
main();
__END__
=head1 SYNOPSIS
ssh_ec2.pl [options]
Options:
--help display help message
--pitname pit name (default : aws_info)
--region ec2 region (default : ap-northeast-1 [tokyo])
--user ssh login user (default : ec2-user)
--tags ec2 instance tags
Requies:
Config::Pit
Format
"aws_info":
"aws_access_key_id": 'AAAAAAAAAAAAAAAAAAA'
"aws_secret_access_key": 'BBBBBBBBBBBBBBBBBB'
"pem_file": '/home/user/.ec2/keypair.pem'
"region": 'ap-northeast-1' (option)
"user": 'appuser' (option)
Create One Liner
perl -MConfig::Pit -e'Config::Pit::set("aws_info", data=>{ aws_access_key_id => "AAAAAAAAAAAAAAAAAAA", aws_secret_access_key => "BBBBBBBBBBBBBBBBBB", pem_file => "/home/user/.ec2/keypair.pem" })';
=cut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment