レベル: 初級 Prabhakar Chaganti, CTO, Ylastic, LLC
2008年 10月 14日 Amazon Web サービス™を利用したクラウド・コンピューティングについて学ぶ連載「Amazon Web サービスを利用したクラウド・コンピューティング」では、スケーラブルで信頼性の高いアプリケーションを設計し、構築する上で Amazon Web サービスがどのように強力な代替手段を提供するかを探っていきます。今回の記事では、Amazon EC2 (Elastic Compute Cloud) が提供する仮想サーバーを紹介します。EC2 を利用することで、アプリケーションの需要に応じて即座にアプリケーションのコンピューティング要件を構成して容量を調整するのが容易になる仕組みを学んでください。
Amazon EC2
Amazon EC2 (Elastic Compute Cloud) は、Amazon が提供するクラウド・コンピューティングのベースとなるプラットフォームです。EC2 は、個人やビジネスのニーズに応じて仮想インスタンスをいつでも簡単に作成、起動、そしてプロビジョニングできるようにします。課金の対象となるのはこうしたインスタンスで、インスタンスのタイプと実際に使用した時間が基準になります。さらに、これらの仮想サーバーは、Amazon が所有するデータセンター内のセキュアな環境で稼働します。
EC2 によって、Web スケールのアプリケーションに以下の機能を提供することができます。
- コンピューティング要件を即座に構成する機能
- 需要に応じて容量を調節する機能
Web が主導する現在の世界で非常に重要な命題となっているのは、サイトが Yahoo のフロント・ページで紹介された場合、トラフィックが津波のように急増し、その 1 時間後には急激に減少するといった事態に対処することですが、今や容量を弾性のある (エラスティックな) 方法で増減することができます。この新しいエラスティック・コンピューティング・モデルには、以下の優れた特徴があります。
- 信頼性
- EC2 は、インスタンスを簡単にプロビジョニングできるだけでなく、インスタンスが不要になった時点で簡単に破棄できるように設計されています。
- 単純さ
- 単純な概念をベースとした EC2 は、システムの設計に柔軟性をもたらします。必要なビルディング・ブロックはすべて Amazon が提供するため、アプリケーションの使用場面に応じてこれらのビルディング・ブロックを自由に組み合わせることができます。
- セキュリティー
- EC2 は高度なセキュリティーを提供するように設計されています。インスタンスはすべて Amazon のセキュアなデータセンター内部で実行されます。ユーザーがファイアウォール・ルールを構成して、信頼できるグループだけがアクセスできるように制限することもできます。
- 弾性
- アプリケーションに弾性をもたらすために、インスタンスを異なる地理的ロケーションに配置したり、短期間だけ存続するインスタンスとは別のライフサイクルを持つ永続ストレージ・ボリュームを使用したりすることもできます。
- 低コスト
- EC2 サービスはその料金により、サーバーのあらゆるニーズに対応するための経済的かつ強力な手段となります。
フレームワーク
このセクションでは、EC2 フレームワークを支える概念について説明します。
AMI (Amazon Machine Image)
AMI とはパッケージ化された Linux® ベースのサーバー環境のことで、あらゆるソフトウェアまたはアプリケーションを実行することができます。EC2 が提供するエラスティック・コンピューティング環境の中核となるのは、この AMI です。EC2 の現行リリースでサポートするのは Linux ベースの AMI ですが、OpenSolaris を EC2 環境のオペレーティング・システムとして使用する上での初期サポートも用意されています。
マシン・イメージには以下の 3 種類があります。
| 専用 | ユーザーが作成したイメージは、デフォルトで、そのユーザーの専用イメージとなります。専用イメージを起動するためのアクセス権は、他のユーザーにも付与することができます。 |
|---|
| 公開 | ユーザーが作成し、Amazon Web サービスのコミュニティーにリリースされたイメージ。そのため、誰もがそのイメージをベースとしたインスタンスを起動して自由自在に使用することができます。Amazon Web Services Developer Community Web サイトに、すべての公開イメージの一覧があります。 |
|---|
| 有料 | 特定の機能を提供するイメージを作成して、Amazon の料金に加え、使用した時間ごとに支払う意志のある誰もが起動できるようにすることができます。 |
|---|
Amazon では、マシン・イメージの作成および管理を簡易化するコマンドライン・ツールをいくつか用意しています。イメージ自体は Amazon S3 (Simple Storage Service) に保存されます。イメージを EC2 に登録した時点で、そのイメージには一意の ID が割り当てられます。この ID は、イメージを識別し、そのイメージからインスタンスを起動するために使用することができます。独自のイメージを作成する方法は何通りかあります。例えば独自のイメージの土台として既存の公開イメージを使用し、以下のワークフローに従って新しい AMI を作成することができます。
- 既存の AMI から、SSH (Secure Socket Shell) キーのペアを使用してインスタンスを起動します。
- インスタンスに SSH で接続します。
- 必要に応じてインスタンスをカスタマイズします。
- Amazon のツールを使用して、実行中のインスタンスを新規 AMI に再バンドルします。
- Amazon のツールを使用して、バンドルを S3 にアップロードして保存します。
- Amazon のツールを使用して、この新規イメージを EC2 に登録します。
- 新規イメージから新しいインスタンスを起動し、満足が行くまでカスタマイズと再バンドルを繰り返します。
別の選択肢として、EC2 コミュニティーから一般公開されているスクリプトのいずれかを使用して新規 AMI を作成するという方法もあります。スクリプトを使うと、一から AMI を作成することができます。よく使用されているスクリプトには以下のものがあります。
- Eric Hammond によって提供されている Ubuntu および Debian ベースの AMI 作成スクリプト。彼のサイトに用意されているビルド済みのイメージを使用することも、スクリプトを使って一からイメージを作成することもできます。
- Ruby on Rails アプリケーションのベースとして機能するイメージをお探しの場合は、Paul Dowman が提供しているスクリプトを使うと、EC2 で Rails アプリケーションを実行するための Ubuntu ベースのイメージを作成することができます。
- RightScale でも、独自のイメージを一から作成するためのスクリプトを Ubuntu ベースと CentOS ベースの両方で用意しています。
インスタンス
インスタンスとは、AMI をテンプレートとして使用した実行中の仮想インスタンスのことです。インスタンスの起動、インスタンスに関する詳細の表示、インスタンスの終了は、Amazon が提供するツールを使用して行います。また、さまざまな言語の各種のサード・パーティー・ライブラリーを使用してインスタンスのライフサイクルを制御することもできます。
インスタンスのベースは 32-bit または 64-bit プラットフォームのいずれか、そしてそのタイプは以下に示すいずれかにすることができます。Amazon では、各インスタンス・タイプにも ECU (EC2 Compute Unit) を基準に料金を設定しています。ECU あたりのプロセッサー容量は、1.0-1.2 GHz の 2007 Opteron または 2007 Intel® Xeon™ プロセッサーに相当します。インスタンス・タイプ別の詳細については、「料金」セクションを参照してください。
- スモール・インスタンス (m1.small)
- 1.7 GB メモリー、ECU×1 (1 ECU の仮想コア×1)、160 GB インスタンス・ストレージ、32-bit プラットフォーム、中程度の I/O パフォーマンス
- ラージ・インスタンス (m1.large)
- 7.5 GB メモリー、ECU×4 (2 ECU の仮想コア×2)、850 GB インスタンス・ストレージ、64-bit プラットフォーム、高度な I/O パフォーマンス
- エクストララージ・インスタンス (m1.xlarge)
- 15 GB メモリー、ECU×8 (2 ECU の仮想コア×4)、1,690 GB インスタンス・ストレージ、64-bit プラットフォーム、高度な I/O パフォーマンス
- ミディアム・インスタンス (c1.medium)
- 1.7 GB メモリー、ECU×5 (2.5 ECU の仮想コア×2)、350 GB インスタンス・ストレージ、32-bit プラットフォーム、中程度の I/O パフォーマンス
- エクストララージ・インスタンス (c1.xlarge)
- 7 GB メモリー、ECU×20 (2.5 ECU の仮想コア×8)、1,690 GB インスタンス・ストレージ、64-bit プラットフォーム、高度な I/O パフォーマンス
インスタンスに対しては、実際の使用時間に基づいて料金が請求されるようになっており、アプリケーションの現行の負荷に応じて、使用するコンピューティング能力を簡単に増減することができます。つまり、前もって多くのコンピューティング能力を確保しておく必要はなくなるということです。
セキュリティー・グループ
EC2 環境内で起動されたインスタンスはすべて、セキュリティー・グループ内で実行されます。各セキュリティー・グループが定義するファイアウォール・ルールにより、そのグループ内で実行されるインスタンスに対するアクセス制限が指定されます。アクセスを許可または制限するには、IP アドレス、あるいは CIDR (Classless Inter-Domain Routing) ルールを使用することができます。CIDR の場合、ポートの範囲と転送プロトコルを指定することができます。また、指定のセキュリティー・グループに対してアクセスを制御することもできます。つまり、これらのセキュリティー・アクセス・グループ内で実行されているインスタンスに対して、自分のインスタンスへのアクセスが自動的に許可または拒否されるように設定することもできます。
セキュリティー・キー・ペア
セキュリティー・キー・ペアとは、インスタンスの起動時に指定される SSH 公開鍵/秘密鍵のペアのことです。起動後のインスタンスのいずれかのコンソールに実際にログインするには、これらのキーが必要となります。起動されたインスタンスには EC2 によってキー・ペアのうちの公開鍵が提供されるので、ユーザーが秘密鍵を使用することで、そのインスタンスに SSH で接続することができます。
セキュリティー・キー・ペアは、Amazon Web サービスのアクセス・キー ID やセキュリティー・キー (アカウント情報ページで入手可能) とは異なります。アクセス・キー ID とセキュリティー・キーは、API を使用して Amazon Web サービスに対するリクエストを行っているユーザーを一意に識別するために使用されます。一方、セキュリティー・キー・ペアの主な用途は、ユーザーがパスワードを入力しなくても、セキュアにインスタンスにログインできるようにすることです。
Availability Zone
EC2 は耐障害性を提供するため、異なる地理的ロケーションにある複数のデータセンターから構成されています。そのため、ユーザーが起動するインスタンスは異なるロケーションに配置することができます。これらのロケーションは地理的な地域で、その地域のなかには複数の独立したゾーン、Availability Zone があります。EC2 の現行リリースでアクセスできるのは、3 つの Availability Zone がある米国東部の 1 つの地域です。Amazon では地域内のそれぞれの Availability Zone を、他の Availability Zone 内で発生した障害には影響されることがないように設計しています。
インスタンスをそれぞれに独立した Availability Zone で起動することによって、1 つのロケーションで障害が発生してもアプリケーションを障害から保護することができます。インスタンスを起動するときに Availability Zone を指定しなければ、Amazon がその時点でのシステムのヘルスと処理能力に応じて自動的に Availability Zone を選択します。
Elastic IP アドレス
インスタンスは起動時に、EC2 からプライベート IP アドレスとパブリック IP アドレスが自動的に割り当てられます。パブリック IP アドレスは当然、インターネット経由でインスタンスにアクセスするために使われます。ただしこのアドレスは、インスタンスを起動するたびに変更されます。ある種の動的 DNS マッピングを使用して DNS 名を IP アドレスに関連付けている場合には、アドレス変更がインターネットで伝搬されるまでに 24 時間かかることも考えられます。この問題を解決するために EC2 が導入したのが、Elastic IP アドレスという概念です。それぞれの Elastic IP アドレスは、特定のインスタンスに対してではなく、EC2 アカウントに対して関連付けられた静的 IP アドレスです。そのためアカウントを EC2 に明示的に返却するまでは、Elastic IP アドレスは永久にアカウントに関連付けられます。
また、Elastic IP アドレスをインスタンス間で割り当て直すこともできます。このため、インスタンスに障害が発生した場合、別のインスタンスを起動して Elastic IP アドレスを割り当て直す (つまり既存のインスタンスを使用する) だけで、素早くインスタンスの障害に対処することができます。ただし、常に 1 つの Elastic IP アドレスは、1 つのインスタンスにしか割り当てることができません。
EBS (Elastic Block Store)
Amazon が生み出した新しい形の永続ストレージ、EBS では、実行中のインスタンスにブロック・レベルのデバイスとして接続できるボリュームを作成することができます。また、これらのボリュームからスナップショットを作成し、後でスナップショットからボリュームを再現することも可能です。各スナップショットは、特定の時点でのそのボリュームの状態を表します。そのため、インスタンスの有効期限が過ぎても存続させておかなければならないファイルやデータを EBS ボリュームに保存し、そのボリュームをあらゆるインスタンスに対して接続および接続解除することができます。
1 つの欠点は、各 EBS ボリュームは一度に 1 つのインスタンスにしか接続できないことです。ただし、任意の 1 つのインスタンスに多数の異なるボリュームを接続することは可能です。EBS ボリュームは、それぞれに関連付けられた Availability Zone に配置されます。ボリュームが接続されているインスタンスは、そのボリュームと同じ Aavailability Zone 内になければなりません。1 アカウントが持てる EBS ボリューム数は 20 に制限されていますが、これを超えるボリュームが必要な場合には、Amazon Web サービスに制限数の増加を要求することができます。
料金
EC2 の料金は、4 つの基準に従って計算されます。
最新の料金については、Amazon EC2 を調べてください。また、Amazon Web Services Simple Monthly Calculator を使用して、EC2 やその他の Amazon Web サービスの月々の使用料を計算することもできます。
EC2 の開始手順
EC2 を使い始めるには、まず Amazon Web サービスのアカウントにサインアップする必要があります。Amazon Web サービスのアカウントの作成手順については、連載第 2 回で詳しく説明しました。アカウントを入手したら、以下のステップに従ってアカウントの Amazon EC2 サービスを有効にする必要があります。
- Amazon Web サービスのアカウントにログインします。
- Amazon EC2 までナビゲートします。
- ページ右側の Sign Up For Amazon EC2 をクリックします。
- 必要な情報を入力し、サインアップ・プロセスを完了します。
Amazon Web サービスのどのサービスと通信するにも、その手段としては SOAP インターフェースまたはクエリー/REST インターフェースのいずれかが使用されます。この記事に記載する例では、クエリー/REST インターフェースを使用して EC2 と通信します。アクセス・キーを取得する必要が出てきたら、Web Services Account 情報ページで AWT Access Identifiers を選択してアクセス・キーを入手してください。
これで、Amazon Web サービスを使用するための準備が完了し、アカウントに対して EC2 サービスが有効になりました。
EC2 の操作
ここで説明する例では、Amazon が提供するコマンドライン・ツールと、サード・パーティーによるオープンソースの Ruby ライブラリー right_aws の両方を使用して EC2 を操作します。この記事全体を通して、以下の作業を行います。
- ローカル EC2 開発環境をセットアップします。
- 既存の AMI を起動します。
- AMI をカスタマイズして
right_aws ライブラリーと必要なその他のソフトウェアをインストールします。
- AMI を再バンドルし、AMI を S3 にアップロードして登録します。
- カスタマイズした新しい AMI を起動します。
- Ruby シェルで小さなコード・スニペットを実行して、
right_aws API の使い方を覚えます。
ローカル EC2 開発環境をセットアップする
Amazon EC2 ツールには Java™ 技術が必要となるため、Java がインストールされていることを確認してください。
- Amazon EC2 AMI Tools と Amazon EC2 API Tools をダウンロードします。
- ダウンロードしたツールのアーカイブを任意のディレクトリーに解凍します。
- 環境変数をいくつか設定し、解凍したツールのディレクトリーをシェルのパスに追加することで、コマンドラインからツールを実行するときにツールが実際に見つかるようにします。リスト 1 はその一例です。
以下のコマンドは、Linux 用です。Microsoft® Windows® を使用している場合には、同等のコマンドに置き換えてください。EC2 X.509 証明書と EC2 秘密鍵ファイルは、アカウント情報ページからダウンロードすることができます。
リスト 1. EC2 開発環境のセットアップ
$ export EC2_HOME=path_to_the_directory_with_the_tools
$ export JAVA_HOME=path_to_the_directory_with_your_java_sdk
# Add the directory to your PATH
$ export PATH=$PATH:$EC2_HOME/bin
# Export variables with the paths to your private key file and X.509 certificate
$ export EC2_PRIVATE_KEY=path_to_your_private_key
$ export EC2_CERT=path_to_your_x509_certificate
|
- すべてが正しくセットアップされていることを確認するために、以下に示すコマンドを実行して EC2 コマンドライン・ツールのバージョンを表示させます。
リスト 2. セットアップの確認
$ ec2-ami-tools-version
1.3-20041 20071010
|
- 次に SSH キー・ペアを作成する必要があります。このキー・ペアは、インスタンスを起動してコマンドライン・シェルからそのインスタンスに接続する際に必要になります。リスト 3 に示すコマンドは、新しいキー・ペアを作成し、続いてキー・ペアの名前、フィンガープリント、秘密鍵のデータを画面に出力するコマンドです。
リスト 3. 新規 SSH キー・ペアの作成
$ ec2-add-keypair devworks
KEYPAIR devworks 29:d1:90:7b:3d:a4:99:52:41:e0:1f:21:d5:20:97:d3:f0:33:fd:76
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAyxaeXt6nb+qzboVW/3ax7An8CUJjDqwNi/PZm4lGOAzOHGnuPlDXeh1GpJ9f
hky7Bg6VEY2VfS5G6UtmIzsGf/JlquzVl/x3uyriOzeCIw+m07aSgUOBn3qW/74IZxYYkxCYdBci
eZeKpr8Mpvuz2sfurRzQOkUeHyuEaiD1RRS7DGxxUXfpVYhGjPltfNW2xRSMLTaOZzRwRdS0cHUU
hC+GOKFDkp8nqQpd8iGUtp2G2DI1pxRN4MbeFZHWMh5tcIo1NTc7pkFPGEwrq6pO6gIsEOLqGpTL
+2AxJY5WToZQoTWieOVwLpjJU9fnufRs0Mt/M/TP6SGK/YkrQOprOwIDAQABAoIBAFj1UGvX9dnl
IbHAwInoUSlGelsH9GIB5XEvYFtr9xEoMsRpdk1flfNMjZwgn3Qxeh6+Fnf438lUkwUv3M6D1WYI
JJaJZUpM8ZlPwIcV2nBHM9k6+NOcYVQdG7VsZTvahusscssvMw+13KsLtpwSVwb3WsoDfAZ6LiaT
Jk5in20hTiipC0pz0K9DgQ//76r20ysUFpCymj4EvQrRkk5kBtsiMixsJzimpUOrSmrRHcORKEin
FKM6y/DFE33zhP8BNDQRaDLGni0Ip+/jP3EHmia41SSbnwzRcbXMfH5fL3KAyRsCE0ocHY+cjUng
HPYxl1ffdLZuEW3wJDQFuTS/v4ECgYEA9r7HVVnrS2303zclzCTGen/W/SVbpflSKEYJOZpa8RtQ
uFMOewfkTbBzfavLMVBYB8uAmcWIz5JAFSzlBaKDRCnouUeeDiDJVJd8Asbn1gCE8UVETUOthy50
R90RTtPNMmyP7AnoSMTuzsbwVORus7IJvceWHQBB4KCh652UansCgYEA0rSmvdquidkXf5iFpebc
6Wh/qy+L1dkgz7+HTZIMW7kxA4EfJFnqaQRPqJ5XYcLvk2IzxNQKJlZvtBhCfVYhPJ2uB2Yqxv0p
0LXGC01fZSyhbYGfaxVymA3HMc2ULBbaFMyhO7l7zkz+G+qkylych59zJBSoUxSFStpgNL7NhkEC
gYAPJIorLMeJ64eZo1LIgoFDx1C0XHSRbQmjuxiZ1mU6YsjDZyV+W2+hbPDJh5+CuUGNyOlthnfs
9TbFlenAPMb9iezkYgbLKyvv6xQLP5W+xm1iOTQF4d9mam1sc566TblMHOmAPONqg9t8CS16qEI6
+PQsF3GY+gkQ9gq54QPYvQKBgDgwjsrQd30xVI/lV7a/Uyg3gtxe6JaVuadNN0LbcMpBH64EkA58
oANzb97SoxDiEEuog4+40CAbKtzHH2wXPPPSROeaOkwolS8gWnkHICp19XKjf6Tp6k5cVkOUxC/h
xDSJwXGQ7FA+vgEp2NpSSjfssKLtk1ncfhNRGxjVzS9BAoGBALbBLS4Nbjs2Fco+okNQPNfJNSvW
yWV7a6ngfRzW8B+BO6V1QRIR44bwv/Z74oQ7ttt8KoZENB5yzZwaVWpFlOjSO/4Nx++Ef4pY5aPS
zNpXcXCZgUdA67qmOILvrG7bnDR60dcBZVBl7CjnpTlccg7MD4CBsFJx+hGRPD2yIV94
-----END RSA PRIVATE KEY-----
|
-----BEGIN RSA PRIVATE KEY----- で始まる部分をローカル・ファイルに保存します。この部分が、インスタンスを起動して SSH でアクセスする際に使用する秘密鍵となります。保存したファイルは必ず、非公開にして安全に保管してください。この鍵でインスタンスを起動した後に、その鍵を失くしてしまった場合、シェルを使ってインスタンスに接続できなくなります。鍵ファイルには pk-devworks という名前を付け、ファイルのアクセス権を変更することで、より安全に保管されるようにします。
リスト 4. 秘密鍵に対するアクセス権の変更
これで、開発環境のセットアップは完了です。
最初のインスタンスを起動する
これから、RightScale によって提供されている公開イメージのうち、CentOS をベースとしたイメージから最初のインスタンスを起動します。このイメージの AMI ID は ami-d8a347b1 です。
リスト 5. インスタンスの起動
$ ec2-run-instances –k devworks -n 1 ami-d8a347b1
RESERVATION r-2691404f 710193521658 default
INSTANCE i-7f923516 ami-d8a347b1 pending
devworks 0 m1.small 2008-09-07T18:05:34+0000
us-east-1c aki-9b00e5f2
|
新たに起動したインスタンスは必ず pending 状態になります。この状態は起動がまだ完了していない状態なので、インスタンスをアドレス指定することはできません。この状態で確認できるのは、インスタンスに関する以下の詳細です。
- 起動時刻 — このインスタンスが起動された時刻。UTC 形式で表示されます。
- インスタンスのタイプ — 上記の例では、インスタンスの起動時にそのタイプを指定していないため、EC2 が自動的にデフォルトのタイプ m1.small を選択しています。
- Availability Zone — 上記の例では、インスタンスの起動時に Availability Zone を指定していないため、EC2 が現行システムのヘルスおよび可用性を基に Availability Zone を選択しています。
- カーネル — このインスタンスが使用する Linux カーネルも表示されます。カーネルはインスタンスを起動する際に指定することができます。指定しない場合には、デフォルトのカーネルを使用した AMI が事前構成されます。
- セキュリティー・グループ — 上記の例では、インスタンスは
default セキュリティー・グループに配置されます。独自のセキュリティー・グループを作成してアクセス権を与え、そのグループにインスタンスを配置することもできます。その場合には、インスタンスを起動するときにセキュリティー・グループを指定する必要があります。インスタンスを起動した後にセキュリティー・グループの名前を変更することはできませんが、グループに対する権限はインスタンス起動後でも変更することができます。
ここで、実行中のインスタンスの一覧を表示して各インスタンスの現在の状態を確認します。
リスト 6. インスタンスの一覧
$ ec2-describe-instances
RESERVATION r-2691404f 710193521658 default
INSTANCE i-7f923516 ami-d8a347b1 ec2-67-202-28-68.compute-1.amazonaws.com
domU-12-31-38-00-34-C8.compute-1.internal running devworks 0
m1.small 2008-09-07T18:05:34+0000 us-east-1c aki-9b00e5f
|
この一覧から、インスタンスが実行中であることがわかります。また、このインスタンスに関する以下の詳細も追加されています。
- パブリック DNS 名 — このインスタンスにインターネット経由で接続するために使用する DNS 名。
- プライベート DNS 名 — Amazon のデータセンター環境内の EC2 のローカル・ネットワーク内にあるこのインスタンスを解決するために使用する DNS 名。
最初のインスタンスに SSH を使用して接続する
インスタンスに SSH 接続するには、そのインスタンスの秘密鍵とパブリック DNS 名を使用します。
リスト 7. インスタンスへの SSH 接続
$ ssh -i pk-devworks root@ec2-67-202-28-68.compute-1.amazonaws.com
The authenticity of host 'ec2-67-202-28-68.compute-1.amazonaws.com (10.252.59.54)'
can't be established.
RSA key fingerprint is ae:e5:00:54:75:65:1c:c5:44:53:72:b9:e0:b5:26:a9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-67-202-28-68.compute-1.amazonaws.com,10.252.59.54'
(RSA) to the
list of known hosts.
[root@domU-12-31-38-00-34-C8:~]
|
上記のコードでログインした後にエラー・メッセージが表示される場合もありますが、このメッセージは無視して構いません。この AMI が起動後に実行するカスタム RightScale スクリプトが見つからないというだけです。
インスタンスをカスタマイズして再バンドルする
RightScale AMI は極めて包括的であり、この AMI をベース・イメージとして使用する上で必要なすべてのものが含まれています。EC2 コマンドライン・ツールも、すでに /home/ec2 ディレクトリーにインストールされています。
- セキュリティー証明書を追加します。追加するセキュリティー証明書は、リスト 1 で使用したのと同じファイルです。
リスト 8. インスタンスへの証明書のコピー
- このイメージを独自のプライベート EC2 イメージとして使用できるように環境変数を設定します。/etc/profile.d/env.sh ファイルを編集して、それぞれの環境変数を設定してください。アカウント番号とアクセス・キーは Web Services Account 情報ページから入手することができます。証明書と秘密鍵は、上記のステップでインスタンスにコピーしたファイルです。
リスト 9. インスタンス環境のカスタマイズ
$ vim /etc/profile.d/env.sh
export EC2_HOME=/home/ec2
export EC2_CERT=
export EC2_PRIVATE_KEY=
export AWS_ACCOUNT_NUMBER=
export AWS_ACCESS_KEY_ID=
export AWS_SECRET_ACCESS_KEY=
export PATH=$PATH:/home/ec2/bin/
# Turn off the rightscripts so you don’t get the error on login.
$ chkconfig --level 4 rightscale off
# Change the login message
$ echo “Welcome to my devworks test EC2 image” > /etc/motd
|
- このイメージにはすでに Ruby がインストールされていますが、この記事の後のステップで EC2 を操作するために使用する Ruby ライブラリーはインストールする必要があります。まずインストール済みの gem を更新してから、
right_aws gem とその他の必要な依存関係をインストールします。
リスト 10. Ruby gem のインストール
$ gem update
$ gem install right_aws
|
- このインスタンスを再バンドルし、S3 にアップロードして EC2 に登録する準備ができたところで、まずはインスタンスを
devworks-ec2 という名前で再バンドルします。/mnt フォルダーと /tmp フォルダーは無視してください。また、EC2 秘密鍵、EC2 セキュリティー証明書、そして Amazon Web サービスのアカウント番号を指定する必要もあります。
リスト 11. インスタンスの再バンドル
$ ec2-bundle-vol -d /mnt -c /home/ec2/your_ec2_x509_cert
-k /home/ec2/your_ec2_private_key -u your_aws_account_number
-e /mnt,/tmp -s 10240 -r i386 -p devworks-ec2
|
- 再バンドルのプロセスが完了すると、/mnt ディレクトリーに一連のファイルが作成されます。S3 にアップロードするのは、新しく作成された AMI を構成するこれらのファイルです。この新規イメージは、ユーザーが指定するバケットに配置されます。以下のコマンドに含まれる
–b パラメーターを、S3 内でイメージ・ファイルの保存先とするバケットの名前に置き換えてください。
リスト 12. S3 へのイメージのアップロード
$ ec2-upload-bundle -b your_s3_bucket -m /mnt/devworks-ec2.manifest.xml
-a your_aws_access_key -s your_aws_secret_key
|
- これで、AMI は無事に S3 に保存されました。後は AMI を EC2 に登録し、このイメージを後で起動するときに使用する AMI の ID を取得するだけです。
リスト 13. EC2 へのイメージの登録
$ ec2-register -K /home/ec2/your_ec2_private_key
-C /home/ec2/your_ec2_x509_cert your_s3_bucket/devworks-ec2.manifest.xml
IMAGE ami-58c42031
|
- SSH セッションを終了し、実行中のインスタンスを終了します。
リスト 14. インスタンスの終了
$ ec2-terminate-instances i-7f923516
INSTANCE i-7f923516 running shutting-down
|
次のセクションでは新しく作成した AMI から新規インスタンスを起動します。記事の残りではこの新規インスタンスと right_aws ライブラリーを使って、EC2 を詳しく調べていきます。
Ruby による EC2 の詳細調査
RightScale が提供している Ruby ライブラリー right_aws を利用すれば、Ruby を使用して Amazon EC2 サービスにアクセスすることができます。RightScale 自らの製品で使用されている、この歴戦のライブラリーは、最近導入された EBS を含め、EC2 のあらゆる側面を網羅しています。right_aws がパッケージ化されている rubygem には、HTTP ライブラリー RightScale:HttpConnection も含まれており、確実に再試行およびエラー処理が行われます。この記事で取り上げるのは right_aws ライブラリーが提供する EC2 機能だけなので、API の全容をつかむためにライブラリー付属のドキュメントを読むことを是非ともお薦めします。そして right_aws ライブラリーとそのサポート・ライブラリー right_http_connection 両方のさまざまな構成オプションを調べてください。
ここで使用する Rightscale::Ec2 クラスは、EC2 を操作するための主要なインターフェースを提供します。Ruby ライブラリーを利用するための手段としては irb コンソールを使用します。ここでは、Rightscale::Ec2 オブジェクトにメッセージを送信し、EC2 がそのメッセージ対して返すレスポンスを調べていきます。EC2 の概念を探るこの手順を通して、right_aws ライブラリーの API についても理解が深まるはずです。
- 新規に作成した AMI からインスタンスを起動します。インスタンスが実行中になったら、インスタンスに SSH で接続してください。その後、インスタンス内部で irb コンソールの使用を開始します。
リスト 15. 新規インスタンスの起動およびインスタンスへの SSH 接続
$ ec2-run-instances -k devworks -n 1 ami-58c42031
RESERVATION r-5795443e 710193521658 default
INSTANCE i-1a9e3973 ami-58c42031 pending devworks 0
m1.small 2008-09-07T21:06:37+0000 us-east-1c aki-9b00e5f2
$ ec2-describe-instances
RESERVATION r-949544fd 710193521658 default
INSTANCE i-5a9d3a33 ami-58c42031
ec2-75-101-208-95.compute-1.amazonaws.com
domU-12-31-38-00-78-04.compute-1.internal
running devworks 0 m1.small
2008-09-07T21:14:27+0000 us-east-1c aki-9b00e5f2
$ ssh -i pk-devworks root@ec2-75-101-208-95.compute-1.amazonaws.com
|
- Ruby シェルを起動し、
Rightscale::Ec2 オブジェクトを作成します。
リスト 16. Ruby シェルおよび新規 Rightscale::Ec2 オブジェクト
$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'right_aws'
=> true
irb(main):003:0> @ec2 = Rightscale::Ec2.new(
ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
|
ここからは、新しく作成した変数 @ec2 を使用して EC2 を詳しく調べていきます。この例ではライブラリーのデフォルト構成を使用します。使用可能な構成オプションのリストについては、ライブラリーに付属のドキュメントを参照してください。
- インスタンスのリストを取得しにいくと、それぞれに各インスタンスの詳細を提供するハッシュの配列が返されます。この応答フォーマットは、このライブラリーのほぼすべての API 呼び出しが従う共通のパターンです。リスト 17 に一例を示します。
リスト 17. インスタンスの詳細の表示
irb(main):004:0> @ec2.describe_instances()
=> [{:aws_launch_time=>"2008-09-07T21:14:27.000Z", :aws_kernel_id=>"aki-9b00e5f2",
:ssh_key_name=>"devworks", :aws_reservation_id=>"r-949544fd",
:aws_availability_zone=>"us-east-1c",
:aws_state=>"running", :aws_instance_id=>"i-5a9d3a33", :aws_groups=>["default"],
:aws_image_id=>"ami-58c42031",
:aws_product_codes=>[], :dns_name=>"ec2-75-101-208-95.compute-1.amazonaws.com",
:aws_state_code=>"16",
:private_dns_name=>"domU-12-31-38-00-78-04.compute-1.internal",
:aws_instance_type=>"m1.small",
:aws_reason=>"", :ami_launch_index=>"0"}]
|
- 次はイメージのリストを取得します。
リスト 18. イメージの詳細の表示
irb(main):005:0> @ec2.describe_images_by_owner([ENV['AWS_ACCOUNT_NUMBER']])
=> [{:aws_location=>"ylastic_images/devworks-ec2.manifest.xml",
:aws_kernel_id=>"aki-9b00e5f2", :aws_state=>"available", :aws_is_public=>false,
:aws_architecture=>"i386", :aws_id=>"ami-58c42031", :aws_image_type=>"machine"}]
|
- インスタンスを配置したり、インスタンスへのアクセスを制限または許可したりするために使用するセキュリティー・グループを作成します。
リスト 19. 新規セキュリティー・グループの作成およびグループの詳細の表示
irb(main):006:0> @ec2.create_security_group("devworks",
"Devworks Article Security Group")
=> true
irb(main):008:0> @ec2.describe_security_groups()
=> [{:aws_group_name=>"devworks", :aws_description=>"Devworks Article Security
Group",
:aws_perms=>[]}]
|
- 新規セキュリティー・キー・ペアを作成し、アカウントのすべてのキー・ペアを表示します。
リスト 20. 新規セキュリティー・キー・ペアの作成およびキー・ペアの表示
irb(main):018:0> @ec2.create_key_pair('mykeypair')
=> {:aws_key_name=>"mykeypair",
:aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa",
:aws_material=>"-----BEGIN RSA PRIVATE KEY-----
\nMIIEpAIBAAKCAQEAyRdAvihBXDu30o2uvQ1h8xdIRLHs0RjQWK4Yw5Y5DkaS41EEjnDwjO6sEY5l\n
IXSuzVj1nkZ1VMPuVR3hIXHCMJLaAO77TaXZVC9yymIUAyTcQ1+hoVLlrCuVI3dEY21WQNTEbtkI\nlI
xMW+UhkiaKrGHmt2yYLjr754KGt7pNCpRwxPXB7brlpQ3qpapkr7XrKZppvWoG8MCmPIFx8P0K\no8Cd
mnF9lEdns6uaJZmfs4Ls9HZHpsmn0r42GbOAkJEkj7nE5zc3rXYpmCBZhjyHus0iXjS/n9oL\nHWhV0a
wagjvmsQgJPYqEsBeO5pDb2IOZq5okQie1YJTd1m8k8k7m9wIDAQABAoIBAQCK0lWssOem\nP8fAQHVg
J+v1wJ3wZpBhLWsvvUh1RbCvzUK8UQL/PrKh6Ga7W/0u4nmGY6J0mJmJYhWXhyATUZBI\nrih3uoOccC
Eff/4T/y9nmDvC+zL+xtatTA0SRdTdeu6vpPLSv1uwCUbxrbXGSnszVAbNm9dXGvsq\nMK7GCYQEB4p4
FtJolDqGZdWAj1u5/AGjbCI+PbkbCAro55Sqnl95WAlogdQFmgxljWl9TEIsbrHf\nYZHtKHlm1lvyeB
QdVmwLT9S7ufI1J/GAevRxrG2iEkx/IJWYGnQE0P2bXa6Ry90UyvWRPS6Zi/MD\nfWoFAxnB6Ryssr+S
IAfpG6SGuM55AoGBAOr7yPcvg/66f/Xd3CbpmI8lIfsXBb9xki3pIEfYAWD/\n2ToxpRYPTgrwwB1ufo
NPr7U1QfzJvAvlTXWkfp4oUnssi5sXw1okZmm01hT0j0FNvsgMG6zD8Z/9\nmgrVrH+tBxVoYqrPM/WB
dnYhQXEGQq+UF2uPqoKDbsl3DkftXTBrAoGBANsTdLfHmRidkLCRKfSj\nUrbJOSsU6RWGFuoqgD+DZL
ngKBTaBTd6TVONSR2JvpVJo5hyiAXQ/jQ1XtsPAuJR6fiiRvDfgF7j\n1lp1tsFpNYx2R4+eqoLrHgIC
Ak1Ke8tWyoD3NgQ4FO9TDfW+QHn0dpLeWdNMUd2a1GVKp4hIoJal\nAoGBAITqMryO5eyZ9XNPMQ3Zp+
+gI15xoVCunu7VJOs+ZVlGnsrp9eVKdux9TU3YiDsiQdMP8ulX\n+sQHyg63It+3EyCVC8qIYHmGiV9V
aJql0rovjbB+GNFabDwBKLbkMhRt/MnBJ75SQaOmvSkImomh\n7up9q9mtg9cbHPlcHHnW65VNAoGAKi
+Y7jrVVFQjJJ0PgzhgGSqug4lHSQnFJ9p/T7uxjcmIblt9\nXa2Dbm9qgPGhbYX8psKHRvdzvAH6/hvp
5kL31xUIrCGdyqf9AvZf9uaXlTDBnvpiw0sbQC+62b9a\nD1HrNOJl2HIkNeG8cnHsYI+etbFzgqjTqu
TBua+iiy/RHLECgYALIDqaAcd7o4V+ws+WG1G9vTlc\nJ6/sBpu3JyKMSdJYlbgIbvHgrfbKhEYuNh/H
XNdrI6oeW9eAruqHlH+OlUx0tCg4VIeQsz/b7kPS\nY14OMAswuHHyqlZIqK4Xy/R6SQmsc/CUXWPk5I
UesJk5f1V1NXIqqwv6+nlEucdjgYUd5w==\n-----END RSA PRIVATE KEY-----"}
irb(main):020:0> @ec2.describe_key_pairs()
=> [{:aws_key_name=>"mykeypair",
:aws_fingerprint=>"c6:62:22:9e:99:05:6a:17:13:06:e0:86:f9:55:2a:78:ff:99:6b:fa"}]
|
- EBS ボリュームを新規に作成します。このボリュームの Availability Zone には
us-east-1c を指定してください。ボリュームが作成されて使用可能になると、同じ Availability Zone 内で実行中のインスタンスにしかボリュームを接続できなくなります。ボリュームの初期状態は「作成中 (creating)」です。プロセスが完了すると、ボリュームの状態は「使用可能 (available)」になります。
リスト 21. 新規 EBS ボリュームの作成およびボリュームの表示
irb(main):024:0> @ec2.create_volume('', 1, 'us-east-1c')
=> {:aws_status=>"creating", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008,
:zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
irb(main):026:0> @ec2.describe_volumes()
=> {:aws_status=>"available", :aws_created_at=>Mon Sep 08 00:29:35 UTC 2008,
:zone=>"us-east-1c", :aws_size=>1, :snapshot_id=>nil, :aws_id=>"vol-2f34d146"}
|
- このボリュームをブロック・デバイス
/dev/sdj として現行インスタンスに接続し、実際に使用できるように ext3 ファイル・システムでフォーマット設定します。
リスト 22. 新規 EBS ボリュームの接続とファイル・システムの作成
irb(main):031:0> @ec2.attach_volume('vol-2f34d146', 'i-5a9d3a33', '/dev/sdj')
=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj",
:aws_attachment_status=>"attaching", :aws_id=>"vol-2f34d146",
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}
$ mkfs.ext3 /dev/sdj
mke2fs 1.39 (29-May-2006)
/dev/sdj is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
|
- 新しくフォーマット設定されたブロック・デバイスをファイル・システムのフォルダーにマウントします。
リスト 23. ローカル・ディレクトリーへのボリュームのマウントとその使用
$ mount /dev/sdj /mnt/my-vol
$ echo “Hello Devworks” > /mnt/my-vol/test.txt
# cat /mnt/my-vol/test.txt
Hello Devworks
|
これで、この EBS ボリュームはシステム上の他のブロック・デバイスとまったく同じように使用できるようになりました。このボリュームに対して読み取り、書き込み操作を実行することができます。ボリュームを使用し終わったら、実行中のインスタンスからボリュームを接続解除し、後で必要に応じて別のインスタンスあるいは同じインスタンスに再接続することができます。これはまさに、EC2 の実用性レベルをさらに引き上げる永続ストレージです。インスタンスの有効期限が切れた後も存続させておかなければならない貴重なデータベース・データを Web サーバー・ログに保存するために使用する他にも、この有用な EBS ボリュームにはさまざまな活用方法があります。
EBS ボリュームのスナップショットを作成し、その時点でのボリュームの内容を保持させることができます。スナップショット自体は自動的に S3 に保存され、EC2 がスナップショットを作成すると蓄積されていきます。ボリュームの最初のスナップショットはボリューム全体のコピーですが、その後のスナップショットには変更セットのみが保存されます。現在、Amazon Web サービスのアカウントあたりのスナップショット数は 500 に制限されています。500 を超えるスナップショットを維持する必要がある場合には、アカウントの制限拡大を要求することができます。
リスト 24. EBS ボリュームからのスナップショットの作成
irb(main):007:0> @ec2.create_snapshot('vol-2f34d146')
=> {:aws_status=>"pending", :aws_volume_id=>"vol-2f34d146",
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"",
:aws_id=>"snap-13db3c7a"}
|
スナップショットは、EC2 がバックグラウンドで作成します。スナップショットが正常に作成されていることを確認するために、定期的にすべてのスナップショットの一覧を表示することができます。
リスト 25. EBS スナップショットの一覧の表示
irb(main):008:0> @ec2.describe_snapshots()
=> [{:aws_status=>"completed", :aws_volume_id=>"vol-2f34d146",
:aws_started_at=>Mon Sep 08 00:49:15 UTC 2008, :aws_progress=>"100%",
:aws_id=>"snap-13db3c7a"}]
|
最後に、ボリュームは、インスタンスから接続解除することができます。接続解除したボリュームは、後で同じインスタンスに再び接続することも、別のインスタンスに接続することもできます。
リスト 26. EBS ボリュームの接続解除
irb(main):006:0> @ec2.detach_volume('vol-2f34d146')
=> {:aws_instance_id=>"i-5a9d3a33", :aws_device=>"/dev/sdj",
:aws_attachment_status=>"detaching", :aws_id=>"vol-2f34d146",
:aws_attached_at=>Mon Sep 08 00:34:03 UTC 2008}
|
まとめ
この記事では Amazon の EC2 サービスを紹介し、その基本概念を説明しました。そしてこの EC2 を操作するためのオープンソースの Ruby ライブラリー、right_aws が提供する機能もいくつか説明しました。この記事では多岐にわたって説明しましたが、EC2 は非常に大きく複雑なトピックです。是非とも Amazon EC2 Developer Guide を読んで、詳しい情報を入手することをお薦めします。
連載「Amazon Web サービスを利用したクラウド・コンピューティング」の第 4 回では、Amazon SQS (Simple Queue Service) によるクラウド内での信頼性の高いメッセージングについて説明します。
参考文献 学ぶために
製品や技術を入手するために
- IBM 製品の評価版をダウンロードして、DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を使ってみてください。
議論するために
著者について  | 
|  | Prabhakar Chaganti が CTO を務める Ylastic は、EC2、S3、SQS、SimpleDB を含めたユーザーの AWS クラウド・コンピューティング環境全体を設計、管理、モニターするための統一インターフェースを構築している新興企業です。彼は最近、『Xen Virtualization』および『GWT Java AJAX Programming』という 2 冊の本を書いています。VMware Global Virtual Appliance Challenge では、最も革新的な仮想アプライアンスに贈られるコミュニティー特別賞も受賞しています。 |
記事の評価
|