仕事でAmazon WebServices(AWS)をよく使っています。AWSで仮想サーバ(EC2インスタンス)を立ち上げたり、スナップショット(バックアップ)を作成して復元などが簡単にできるためサーバ構築などに大変便利ですね。 AWSのコンポーネント(EC2, RDS, ELBなど)を操作するのにGUI(Management Console)で操作するのですが、APIも提供されており、シェルスクリプト(コマンド)やPHP, Rubyなどのプログラムからも操作することができます。 今回はBashなどのシェル(コマンド)からEC2インスタンスを操作できるツールをインストールし、EC2インスタンスを起動してみます。
今回の目標
- Amazon EC2 API Tools をインストールする
- コマンドからEC2インスタンスを起動できるようにする
- EC2インスタンスにSSHログインできるようにする
サーバ環境
- CentOS 6.4
必要なパッケージのインストール
$ sudo yum -y install java-1.6.0-openjdk
ファイルのダウンロード
$ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
$ unzip ec2-api-tools.zip
ファイルの設置
どこに置いてもいいのですが、/awsというディレクトリを作成してそこに先ほどのツール郡を置きます。
$ sudo mkdir /aws
$ sudo mv ec2-api-tools-1.6.7.4 /aws/ec2
パスの設定
コマンドが使えるようにパスを通します。
# ~/.bashrc
# Amazon API Tools
PATH=$PATH:/aws/ec2/bin
環境変数の設定
コマンドを実行するのに必要な環境変数を設定します。
# .bashrc
# Amazon API Tools
PATH=$PATH:/aws/ec2/bin
# AWS Command Line Tools
export AWS_ACCESS_KEY="xxxxxxxxxxxxxxxxxxx"
export AWS_SECRET_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export JAVA_HOME=/usr/lib/jvm/jre
export EC2_AMITOOL_HOME=/aws/ec2
export EC2_HOME=/aws/ec2
export EC2_URL="https://ec2.ap-northeast-1.amazonaws.com"
export EC2_REGION="ap-northeast-1"
AWS_ACCESS_KEY はAWSのAPIを利用するのに必要なアクセスキー、AWS_SECRET_KEY はシークレットキーです。 これらのキーはAWSのManagementConsoleから発行してください *1。
.bashrcを読みこめば完了です。
$ source ~/.bashrc
動作確認
EC2インスタンスが使えるリージョン(地域)を一覧表示させるコマンド(ec2-describe-regions)を実行します。
$ ec2-describe-regions
REGION eu-west-1 ec2.eu-west-1.amazonaws.com
REGION sa-east-1 ec2.sa-east-1.amazonaws.com
REGION us-east-1 ec2.us-east-1.amazonaws.com
REGION ap-northeast-1 ec2.ap-northeast-1.amazonaws.com
REGION us-west-2 ec2.us-west-2.amazonaws.com
REGION us-west-1 ec2.us-west-1.amazonaws.com
REGION ap-southeast-1 ec2.ap-southeast-1.amazonaws.com
REGION ap-southeast-2 ec2.ap-southeast-2.amazonaws.com
正しく設定されていれば、リージョンの一覧が表示されるはずです。
コマンドからEC2インスタンスを起動する
EC2インスタンスを設定し起動するには、ec2-run-instancesコマンドを使います。
AMIの選択
ec2-run-instancesコマンドを使うには、AMIから起動する必要があるため、どのAMIから起動するかを決めます。 すでにAMIを作成していて、そのAMIから起動したい場合は、そのAMI ID(ami-xxxxxxxx)を選択してください。 今回はAMIが無いので、Community AMIs を含めたAMIから探します。例としてamzn-ami-pv-2014.03.0.x86_64-ebs というAMIから起動することにします。AMI IDは、ami-a1bec3a0 です。
$ ec2-describe-images -x all | grep IMAGE | grep amzn-ami-pv-2014.03.0.x86_64-ebs
IMAGE ami-a1bec3a0 amazon/amzn-ami-pv-2014.03.0.x86_64-ebs amazon available public x86_64machine aki-176bf516 ebs paravirtual xen
SecurityGroupの作成
SecurityGroupというファイアウォール(iptablesみたいなもの)を作成します。 今回はquick-startという簡単なSecurityGroupを作成しました。SSH(22番)ポートのみを許可しています。
Key Pairの作成
EC2インスタンスは公開鍵認証なので、Key Pairとよばれる秘密鍵を作成します。 今回はjicomanという名前で作成しました*2。
EC2インスタンスの起動
ようやくEC2インスタンスを起動します。
$ ec2-run-instances ami-a1bec3a0 \
--instance-count 1 \
--group quick-start \
--key jicoman \
--instance-type t1.micro \
--instance-initiated-shutdown-behavior stop \
--availability-zone ap-northeast-1c \
--region ap-northeast-1
RESERVATION r-bbb38ebd 031388413724 quick-start
INSTANCE i-b34a53b5 ami-a1bec3a0 pending jicoman 0 t1.micro 2014-04-01T15:48:43+0000 ap-northeast-1c aki-176bf516 monitoring-disabled ebs paravirtual xen sg-d3576ad2 default false
正しく実行されると、EC2インスタンスが起動します。 インスタンスID(i-b34a53b5)は後ほど、停止や削除に使います。
下記、オプションの解説です。
オプション | 説明 |
---|---|
--instance-count | 起動するEC2インスタンスの数 |
--group | EC2インスタンスを所属させるSecurityGroup名 |
--key | EC2インスタンスにSSHログインするためのKeyPair名 |
--instance-type | 起動するEC2インスタンスのインスタンスタイプ |
--instance-initiated-shutdown-behavior | EC2インスタンスを停止できるようにするかどうか |
--availability-zone | 起動するEC2インスタンスに所属させるアベイラビリティゾーン(AZ) |
--region | 起動するEC2インスタンスに所属させるリージョン |
EC2インスタンスが起動されると、ManagementConsoleで以下のように表示されます。
SSHログインする
起動したEC2インスタンスにログインしてみます。 デフォルトのユーザはec2-userです。
秘密鍵(.pem)のファイルパーミッションを変更
Key Pairを作成した時にダウンロードした秘密鍵(例としてjicoman.pem)のファイルパーミッションを変更します。 変更せず644(-rw-r--r--)などにするとSSH接続時に以下のようなエラーが表示されます。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/hoge/.ssh/jicoman.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/hoge/.ssh/jicoman.pem
Permission denied (publickey).
$ chmod 600 /home/hoge/.ssh/jicoman.pem
SSHコマンドを実行します。
$ ssh -i /home/hoge/.ssh/jicoman.pem ec2-user@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
No packages needed for security; 19 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-xxx-xxx-xxx-xxx ~]$
接続するEC2インスタンスのホスト名(Public DNS)は起動する度に変更されますので随時確認してください。
EC2インスタンスを停止(stop)する
AWSは従量課金なので起動時間が長いほど請求金額が高くなりますので使い終わったら停止(stop)または削除(terminate)してください。 コマンドでEC2インスタンスを停止してみます。EC2インスタンスからログアウト(exit)して下記のコマンドを実行します。
$ ec2-stop-instances i-b34a53b5
INSTANCE i-b34a53b5 running stopping
ec2-stop-instancesコマンドを使うときに、先ほどのEC2インスタンスのインスタンスIDを指定します。
EC2インスタンスを削除(terminate)する
EC2インスタンスをstopさせれば課金されることはありませんが、使い終わったら削除(terminate)しておいた方が(精神的に)安全でしょう。
EC2インスタンスをTerminteするには、ec2-terminate-instances コマンドを実行します。
$ ec2-terminate-instances i-b34a53b5
INSTANCE i-b34a53b5 stopped terminated
最後に
コマンドからEC2インスタンスを操作できるようになりました。 EC2インスタンスの他にもELBやRDSなどのツールも提供されており、設定すれば同じように操作することができます。 次回は先ほど設定したアクセスキーとシークレットキーの取得方法を取り上げたいと思います。
参考URL
- Commands (CLI Tools)
- コマンド一覧です。コマンドで色んなことができます
- Amazon Elastic Compute Cloud ドキュメント