AWS使いになるための足跡
AWSには前から興味はあったものの、主にPythonを使っているためGAEに流れていて殆ど触っていませんでした。そんな時に、会社でもAWS(EC2)を使うということが決まったため、使い方を学んでいきたいと思います。自分がやっていったことの記録を残していきます。
AWSアカウントの作成
無料ティアがあるので、まずはアカウントを作成して色々とさわってみました。
電話での確認作業がちょっと焦りましたが、なんとかクリアしました。電話での内容が全て英語というのはちょっとしんどかったです。番号入力してという部分が聞こえたら電話機のボタンをプッシュして特に問題なくクリアできたのでよかったです。
管理コンソールからの操作
管理コンソールから操作できる部分で無料ティアの範囲やほとんどお金のかからない機能はまずさわってみました。使用するのに多少お金がかかる部分もありますが、お試しの操作が終わったら削除することでそれほど大きな金額にはなりません。ゲームセンターで小銭を使ったと思えば気にもならない程度です。
ただし、極端にリソースを使用するようなお試しをおこなうと一気に金額が跳ね上がりますので要注意です。
コマンドラインからの操作
コマンドラインから操作が可能という話は聞いていたものの、管理コンソールから入ったため初めはコマンドラインでの操作が全くわかりませんでした。
まずは、認証をクリアしないことにはコマンドを実行できないようであるため、認証の作業から取り掛かります。EC2のUsers Guideに、Getting Started with Command Line Toolsというセクションがあります。こちらの内容に沿って環境の整備を進めます。
以下の操作はMacBookProでおこないました。
- コマンドのダウンロード
- "Amazon EC2 AMI Tools"よりZIPファイルをダウンロードします。
- ZIPファイルを解凍して適当なディレクトリに配置します(自分は~/opt/におきました)。
- アクセス証明書の作成
- scpでEC2インスタンスに2つのファイルをコピーします。
- ~/.ec2/ディレクトリを作成してファイルを配置します。
- 環境設定の整備
- コマンドでの確認
自分は以下のようなファイルを用意して、コマンドを実行する前に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)
コマンド実行前に設定を考えるべきでした
その後コマンドがエラーなく実行出来るようになったものの、設定が足りないためにその後の操作ができないといったことが多々ありました。そこで、最低限付けるべきオプションをまとめます。
-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/"をツイートで見つけたため、こちらを参考に学んでみたいと思います。