AWS使いになるための足跡

AWSには前から興味はあったものの、主にPythonを使っているためGAEに流れていて殆ど触っていませんでした。そんな時に、会社でもAWS(EC2)を使うということが決まったため、使い方を学んでいきたいと思います。自分がやっていったことの記録を残していきます。

AWSアカウントの作成

無料ティアがあるので、まずはアカウントを作成して色々とさわってみました。
電話での確認作業がちょっと焦りましたが、なんとかクリアしました。電話での内容が全て英語というのはちょっとしんどかったです。番号入力してという部分が聞こえたら電話機のボタンをプッシュして特に問題なくクリアできたのでよかったです。

管理コンソールからの操作

管理コンソールから操作できる部分で無料ティアの範囲やほとんどお金のかからない機能はまずさわってみました。使用するのに多少お金がかかる部分もありますが、お試しの操作が終わったら削除することでそれほど大きな金額にはなりません。ゲームセンターで小銭を使ったと思えば気にもならない程度です。
ただし、極端にリソースを使用するようなお試しをおこなうと一気に金額が跳ね上がりますので要注意です。

コマンドラインからの操作

コマンドラインから操作が可能という話は聞いていたものの、管理コンソールから入ったため初めはコマンドラインでの操作が全くわかりませんでした。
まずは、認証をクリアしないことにはコマンドを実行できないようであるため、認証の作業から取り掛かります。EC2のUsers Guideに、Getting Started with Command Line Toolsというセクションがあります。こちらの内容に沿って環境の整備を進めます。

以下の操作はMacBookProでおこないました。

  • コマンドのダウンロード
  • ZIPファイルを解凍して適当なディレクトリに配置します(自分は~/opt/におきました)。
  • アクセス証明書の作成
    • ブラウザでAWSページにアクセスし、アカウントのセキュリティ証明書を選択します。
    • X.509証明書を作成します。
    • X.509の秘密鍵ファイルと証明書ファイルの2つを取得します。
  • scpでEC2インスタンスに2つのファイルをコピーします。
    • ~/.ec2/ディレクトリを作成してファイルを配置します。
  • 環境設定の整備
    • JAVA_HOMEを設定します。
    • EC2_HOMEを設定します。
    • EC2_PRIVATE_KEYとEC2_CERTを設定します。環境変数にセットしない場合は、-Cや-Kオプションで都度設定するようです。
    • EC2_URLを設定します。この設定がなくてもec2-describe-regionsコマンドは実行できました。
  • コマンドでの確認

自分は以下のようなファイルを用意して、コマンドを実行する前にsourceで読み込むようにしました。

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Home
export JAVA_HOME
export EC2_HOME=~/opt/ec2-api-tools-1.3-62308
export PATH=${JAVA_HOME}/bin:${EC2_HOME}/bin:$PATH
EC2_PRIVATE_KEY=<private_key filepath>
export EC2_PRIVATE_KEY
EC2_CERT=<cert filepath>
export EC2_CERT
export EC2_URL=https://ec2.us-east-1.amazonaws.com
X.509とは

そもとも、X.509というものがよくわかっていませんでしたので、"X.509 - Wikipedia"で教えてもらいました。X.509は規格であり、公開鍵方式での認証のためのものという認識でよさそうです。

コマンドからEC2インスタンスの作成&EBSのディスク容量を増やす

作成済のAMIよりEC2インスタンスを作成する際に、Root Deviceとして使用しているEBSのディスク容量を増やしたいという要求が発生しました。そこで、ググッてみたところ"Amazon EBSからブートしたEC2インスタンスのディスク容量を増やす&エフェメラルディスクを取り付ける方法 - 元RX-7乗りの適当な日々"にちょうどそれをおこなうための情報が掲載されていたため、参考にさせて頂きました。

ec2-run-instancesで気をつけること

ディスク容量を変更するためには、コマンドからEC2インスタンスを作成するようなのですが、基本的に管理コンソールからしインスタンスを作成したことがないため、何を設定すべきかさっぱりです。そこで、実際にコマンドを実行した際の失敗談を記録しておきます。

インスタンスタイプを指定しないとエラーになることがある

特に何も考えずにami_idのみ指定してコマンドを実行したところ、下記のようなエラーになりました。amiのアーキテクチャと作成するインスタンスアーキテクチャが異なるらしいのですが、どこで指定するのか全くわからなかったため、適当にオプションをつけて試しました。結果えらーがでなくなったのは、作成するインスタンスのタイプ(t1.micro)を指定した場合でした。デフォルトのインスタンスタイプはなんであったのかは不明です。

$ ec2-run-instances ami-74f0061d -b /dev/sda1=:16
Client.InvalidParameterValue: The requested instance type's architecture (i386) does not match the architecture in the manifest for ami-74f0061d (x86_64)
コマンド実行前に設定を考えるべきでした

その後コマンドがエラーなく実行出来るようになったものの、設定が足りないためにその後の操作ができないといったことが多々ありました。そこで、最低限付けるべきオプションをまとめます。

  • -k, --key
    • SSHで接続するためのキーペアの名前を指定します。
  • -t, --instance-type
  • --availability-zone
  • -g, --groupgroup
    • 最低限SSHで接続可能にするためのセキュリティグループを指定します。
-b, --block-device-mappingを付けての実行

そもそもやりたかったデスク容量の変更のために、-bオプションを使用します。コロンにつなぎで希望するディスク容量(16G)を指定します。また、エフェメラルディスクというのも使えるようなので、-bオプションで指定して使えるようにしてみます。結果、自分は以下のようなコマンドになりました。

ec2-run-instances ami-74f0061d -k <keypair> -t m1.large --availability-zone us-east-1d -g default -g group -b /dev/sda1=:16 -b /dev/sdb=ephemeral0

EIPのEC2インスタンスの紐付けはSTOPで切れる

EIPをインスタンスに紐付けて調査をしていたところ、不意にEIPで作業ができなくなりました。インスタンスのSTOP-STARTをおこなったところEIPからインスタンスの紐付けが外れました。当然といえば当然ですねなんですかね。でも、ELBの場合はインスタンスをSTOP-STARTさせても紐付けが外れませんでした。うーん。EIPとELBを一緒に考えるのはよくないのかもですが、ちょっと不便な気がしました。

EBSの速さも気にする必要がありそう

"株式会社アンタス - 次の時代のマーケティングテクノロジーを"が非常に気になりました。そもそもローカルとローカルでないEBSの違いがわかっていません。どれがローカルのになるのか調べる必要がありそうです。instance-store当りがそれなのでしょうか。

OSの時間をJSTで扱う

EC2インスタンス上で時間に関する問題が発覚しました。自分はLinuxのAMIを使用していたのですが、その際の時間がUTCになっていたのです。既存のアプリをEC2にのせる際に、バッチ処理で時間に関する部分があったため、少々困りました。どこかで時間の変換をすればいいのですが、正直アプリには手を入れたくなかったのです。そこで、OSレベルで切り替えてしまえば良いということになりました。UTCからJSTへlocaltimeを切り替えることで対応しました。その際に、"システム時刻をJSTに設定 - linux備忘録"を参考にさせて頂きました。まずは一安心です。

色々さわったから理解できる良記事

多少EC2を使って構築をおこなうようになっため、"Amazon EC2を使う前に知っておきたいこと色々:phpspot開発日誌"の内容がよく分かり、とても参考になることばかりでした。

AutoScalingを学ぶ

"http://blog.serverworks.co.jp/tech/2011/01/17/amazonautoscaling%E6%A9%9F%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/"をツイートで見つけたため、こちらを参考に学んでみたいと思います。