本日も乙

ただの自己満足な備忘録。

Amazon EC2 API ToolsをインストールしてEC2インスタンスを起動する(&ログインするまで)

Amazon Web Services

仕事でAmazon WebServices(AWS)をよく使っています。AWSで仮想サーバ(EC2インスタンス)を立ち上げたり、スナップショット(バックアップ)を作成して復元などが簡単にできるためサーバ構築などに大変便利ですね。 AWSコンポーネント(EC2, RDS, ELBなど)を操作するのにGUI(Management Console)で操作するのですが、APIも提供されており、シェルスクリプト(コマンド)やPHP, Rubyなどのプログラムからも操作することができます。 今回はBashなどのシェル(コマンド)からEC2インスタンスを操作できるツールをインストールし、EC2インスタンスを起動してみます。

今回の目標

サーバ環境

必要なパッケージのインストール

$ 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 はAWSAPIを利用するのに必要なアクセスキー、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番)ポートのみを許可しています。

quick-start

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で以下のように表示されます。

EC2インスタンス起動

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

*1:次回、記事を書く予定です

*2:作成する際にダウンロードしたpemファイルは紛失しないようにしてください