プログラマでありたい

おっさんになっても、プログラマでありつづけたい

Amazon EC2のインスタンスの起動と停止

久々にAmazon EC2を使ってインスタンスの起動の仕方が解らなくなっていたので、再度メモしておきます。

インスタンの選択

お好みのamiを選びましょう。

$ ec2-describe-images -o self -o amazon
IMAGE   ami-20b65349    ec2-public-images/fedora-core4-base.manifest.xml       amazon   available       public
IMAGE   ami-22b6534b    ec2-public-images/fedora-core4-mysql.manifest.xml      amazon   available       public
IMAGE   ami-23b6534a    ec2-public-images/fedora-core4-apache.manifest.xml     amazon   available       public
IMAGE   ami-25b6534c    ec2-public-images/fedora-core4-apache-mysql.manifest.xmlamazon  available       public
IMAGE   ami-26b6534f    ec2-public-images/developer-image.manifest.xml  amazon available        public
IMAGE   ami-2bb65342    ec2-public-images/getting-started.manifest.xml  amazon available        public
IMAGE   ami-36ff1a5f    ec2-public-images/fedora-core6-base-x86_64.manifest.xmlamazon   available       public
IMAGE   ami-bd9d78d4    ec2-public-images/demo-paid-AMI.manifest.xml    amazon available        public  A79EC0DB

インスタンスの起動

起動時に必ず作成したRSA Keyペアを指定しましょう。
そうしないとログインできません。

$ ec2-run-instances ami-f51aff9c -k gsg-keypair 
RESERVATION	r-837bacea	021010746129	default
INSTANCE	i-adc763c4	ami-f51aff9c			pending	gsg-keypair2	0		m1.small	2008-09-01T15:10:17+0000	us-east-1b	aki-a71cf9ce	ari-a51cf9cc

起動中は、ステータスがペンディングになります。

インスタンスのステータス確認

接続するためのURLを確認します。

$ ec2-describe-instances i-adc763c4
RESERVATION	r-837bacea	021010746129	default
INSTANCE	i-adc763c4	ami-f51aff9c	ec2-**-***-235-158.compute-1.amazonaws.com	domU-12-31-39-00-78-86.compute-1.internal	running	gsg-keypair2	m1.small	2008-09-01T15:10:17+0000	us-east-1b	aki-a71cf9ce	ari-a51cf9cc

ログイン

認証に作成したRSA Keyペアを指定します。

$ssh -i gsg-keypair root@ec2-**-***-235-158.compute-1.amazonaws.com
INSTANCE	i-adc763c4	ami-f51aff9c	

許可ポートの設定

初期状態では、全てのポートが閉じられているため、初回のみ必要になります。
(SSHとHTTPを解放する例)

$ec2-authorize default -p 22
$ec2-authorize default -p 80

停止

立ち上げている間は、ずっと課金されます。
停止の仕方は次の通りです。

$ec2-terminate-instances i-adc763c4

Amazon EC2/S3の使い方目次

週末プログラマに朗報 Amazon Elastic Block Store(EBS)

 ちょっとスルーしていましたが、先週発表されたAmazon Elastic Block Store(EBS)。かなり嬉しいサービスです。EBSの詳細内容は、codezineさんのエントリーを引用させて頂いて省略しますが、EC2から使えるストレージサービスです。Amazon S3が既にあるではという意見もあるかと思えますが、EBSはファイルシステムとして扱えるためマウント等が出来ます。これに対してS3はAPIを経由して使用する為、MySQL等のデータ領域に使うという方法は中々難しいのです。EC2のファイル領域を使えばという話もありますが、EC2は基本インスタンスを落としたら、それまでの内容は保持しません。イメージ化するというのも一つの手ですが、大容量のデータ領域に対しては不向きです。
 で、表題の件です。なぜ週末プログラマにとって嬉しいかという点です。前述の通り、EC2はインスタンスを落とすと内容は消されます。
なので内容を保持したまま開発用サーバとして使うには、24時間365日インスタンスを立ち上げておく必要があります。そうなると、EC2の使用料は情け容赦なく発生します。だいたい一月に8千円くらい。データ領域をEBSを使用するように変更すれば、必要な時だけインスタンスを立ち上げれば済みます。費用についても恐らく月額1千円いかでしょう。ローカルに開発サーバを用意すれば良いというのもありますが、ネットワークさえ使えればいつでもアクセスできるのはありがたいです。特にSVNのリポジトリのようなものは。またEC2のデータ領域だけS3にバックアップをして、必要な時だけ復元するという方法はありますが無精者の私には少し手間です


 という訳で、ほぼサンデープログラマの私にとっては、とても良いニュースです。環境構築して、またレポートしたいと思います。


以下、CodezineのEBSの紹介。完結で解り易いです。
Amazon、超巨大ストレージサービス「Amazon Elastic Block Store」ついに公開

 EBSは、Amazonが提供するホスティングサービスAmazon EC2から使用するストレージサービス。高可用、高性能なブロックデバイスのストレージを、EC2のインスタンスから利用できる。既存のストレージサービス「Amazon S3」と異なり、API経由ではなく、実際の外部ストレージのようにアクセスすることができるため、EC2に障害が発生しても書き込まれたデータが失われない。

 ファイルシステムをフォーマットし、マウントして利用することはもちろん、直接Rawデバイスとしてアクセスすることも可能。もちろん、EBSボリュームにMySQLなどのデータベースを作成することもできる。また、Amazon S3にスナップショットとしてデータをバックアップすることも可能となっている。


 使い方については、id:rx7さんが「最近発表されたストレージサービスAmazon EBS(Elastic Block Store)をEC2から利用する」が詳しく説明しておられます。



Amazon EC2/S3の使い方目次

お勧めのAmazon EC2のPublic AMIs

 EC2のAMIは、デフォルトで出て来るのはFedore Core4ベースでかなり古いです。
幾つか試してみて良かったAMIを紹介します。

Fedora Core 8 i386 with Ruby on Rails 2, Mongrel, Nginx, MySQL

Fedore Core8をベースにRuby on Rails 2とMySQLが入っています。
イメージ化出来る/dev/sda1の部分も10G近くあるのもポイント高いです。

ami-a93adfc0

root@domU-12-31-39-00-C6-12[~]: df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  2.2G  7.3G  23% /
/dev/sda2             147G  188M  140G   1% /mnt
Fedora 7 Base Install

その名のとおり、素のFedore core7が入っています。好きなようにカスタマイズ出来ます。
/dev/sda1が小さいのが痛い。

ami-c69471af

-bash-3.2# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1            1008M  657M  301M  69% /
none                  851M     0  851M   0% /dev/shm
/dev/sda2             147G  188M  140G   1% /mnt
32bit Fedora 8 with Fedora 8 Xen Kernel (2.6.21.7-2.fc8xen)

XenカーネルベースのFedora core8です。
今選ぶなら、これかなと思います。

ami-f51aff9c

[root@domU-12-31-39-00-C1-16 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  1.1G  8.3G  12% /
/dev/sda2             147G  188M  140G   1% /mnt
none                  854M     0  854M   0% /dev/shm

Amazon EC2/S3の使い方目次

Amazon EC2関係のリンク集

気が付いたベースで、Amazon EC2/S3関係のリンクを追加していこうと思います。

masuidrive on rails

技評で執筆されている増井さんのブログのec2タグ。

実際にアマゾンが使っているのと同じ仮想サーバを無料で試せる「Right Scale」を使ってみた

Amazon EC2の管理画面を売りにしているサービス。最初のうちは、いらないか。

Amazon ec2のエコノミー、月72ドルでレンタルするのと、999ドルのマシンを買うのはどちらが得か?

中島さんの考察。EC2とサーバー買うのがどちらが得か。面白い。個人ユーザの興味としては、レンタルサーバとの比較が面白いかな

Amazon EC2/S3を使ってみた - まとめ - RX-7乗りの適当な日々

秀逸なまとめです。この方、かなり昔からEC2関係のエントリーを書かれていて、私も色々参考にさせて頂きました。

Amazon EC2/S3の使い方目次

Amazon EC2/S3の使い方目次

Amazon EC2の申し込み
Amazon EC2の接続準備
Amazon EC2のインスタンスの起動でよく使うオプション
Amazon EC2のマニュアル
Amazon EC2 Command Line Toolのセットアップ
Amazon EC2のインスタンスの起動と停止
Amazon EC2のPublic AMIsを選ぶ
Amazon EC2とyum
Amazon EC2にmecab
Amazon EC2のインスタンスと独自ドメインと紐付ける
Amazon S3 OrganizerでAmazon S3を使ってみる
Amazon EC2インスタンスの保存
Amazon EC2の料金計算
週末プログラマに朗報 Amazon Elastic Block Store(EBS)
Amazon Elastic Block Store (EBS)を使ってみた
Amazon Elastic Block Store (EBS)上に、Subversionのリポジトリを置く
Amazon Elastic Block Store(EBS)でmysqlの設定をする
Amazon EC2でFedora Coreのタイムゾーンを変更する
Amazon EC2をGUIで操作する公式管理ツール AWS Management Console
WinSCPでAmazon EC2にファイルを転送する方法

Amazon S3 OrganizerでAmazon S3を使ってみる

Amazon EC2は、Amazon S3を使う事が前提です。ファイルの操作はコマンドラインや、HTTPのGET,PUT,DELETEで行うことが出来るのですが、流石に面倒くさいです。そんな時の為に、GUIツールを使いましょう。
Amazon S3 Firefox Organizer(S3Fox) :: Firefox Add-ons
FireFoxのアドオンとして提供されています。
インストールしたら、ツール->S3 Organizerで起動します。


後は、Manage AccountからAccount Name,Access Key,Secret Keyの3つを設定すれば使えます。Account Nameは自分の識別用ですので何でも大丈夫です。Access Key,Secret Keyは、AWS Access Identifiersにログインすれば確認できます。


Amazon EC2/S3の使い方目次

Amazon S3 - Simple Storage Service

思い立ってAmazon S3に申し込んでみた。
早速サンプルアプリで遊んで見る。

サンプルアプリは、perl,java,php,rubyと一通り揃っている。
勝手知ったるphpで試してみる。
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=126&categoryID=47

ReadMeを読むと、Crypt_HMACとHTTP_Requestが必要とのこと。
ちなみにHTTP_RequestはNet_SocketとNet_URLを必要としている。
Pearからダウンロードして、サンプルコードを展開。
あっさり動く。ただし、入力項目の意味が解らない。

入力項目は、
AWSAccessKeyId
SecretAccessKey
Bucket
Key
Content-Type
Operation
Access Control Policy
File to PUT

AWSAccessKeyIdとSecretAccessKeyは、申し込み時に送られて来たので問題なし。
Content-TypeとOperation,Access Control Policy,File to PUTは想像がつく。
BucketとKeyは何を指す??
マニュアルを読んでみる。

Buckets

Objects are stored in buckets. The bucket provides a unique namespace for management of objects contained in the bucket. Each bucket you create is owned by you for purposes of billing, and you will be charged storage fees for all objects stored in the bucket and bandwidth fees for all data read from and written to the bucket. There is no limit to the number of objects that one bucket can hold. Since the namespace for bucket names is global, each developer is limited to owning 100 buckets at a time.

Objects

Objects are the fundamental entities stored in Amazon S3. Objects are composed of object data and metadata. The data portion is opaque to Amazon S3. The metadata is a set of name-value pairs that describe the object. These include some default metadata such as the date last modified, and standard HTTP metadata such as Content-Type. The developer may also specify custom metadata at the time the Object is stored.

Keys

A key is the unique identifier for an object within a bucket. Every object in a bucket has exactly one key. Since a bucket and key together uniquely identify each object, Amazon S3 can be thought of as a basic data map between "bucket + key" and the object itself. Every object in Amazon S3 can be uniquely addressed through the combination of the Service endpoint, bucket name, and key, as in http://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl, where "doc" is the name of the bucket, and "2006-03-01/AmazonS3.wsdl" is the key.

Bucketは、表領域やテーブルのようなもの。Keyは、Bucket中のオブジェクトを指定するもの。つまりBucket+Keyで一意のオブジェクトを指定出来るようだ。

それぞれ適当にtestと入力して、「Go」をクリック

すると、以下の内容を含んだ実行結果が。

AccessDenied
AWS authentication requires a valid Date or x-amz-date header

有効な日付かx-amz-date headerを必要としていますとのこと。
謎??

ソースを見てみると

// Note that version HTTP_Request 1.3.0 has a BUG in it! Change line
// 765 from:
// (HTTP_REQUEST_METHOD_POST != $this->_method && empty($this->_postData) && empty($this->_postFiles))) {
// to:
// (HTTP_REQUEST_METHOD_POST == $this->_method && empty($this->_postData) && empty($this->_postFiles))) {
// Without this change PUTs with non-empty content-type will fail!

えらい根本的なバグ仕込んでいるなぁ。HTTP_Request
検証もせずに盲目的に信じて、ソースを修正してみる。

しかし、やっぱり駄目。
USAで申し込んで、日本のサーバからアクセスしているせいか??
全く同じものを、USAのサーバに入れて実行してみると、

AccessDenied
Access Denied

今度は純粋にAccessが拒否されているっぽい。
Bucketsについて、もう一度マニュアルを調べてみる。
他の部分に以下の用な記述が。

Buckets
Objects are stored in buckets. Buckets can store an unlimited number of objects. Amazon designed S3 so that you could easily keep all of your objects in a single bucket if you like. Bucket names are strings that must be at 3 bytes long, and less than 255 characters long. For now, the names can contain ASCII letters, numbers, underscores and dashes. In the future, we may allow non-ASCII bucket names.

The bucket namespace is shared between all users of Amazon S3; no two buckets can have the same name. Each bucket has an owner, identified as the developer whose AWS Access Key ID was used to authenticate at the time the bucket was created. Bucket ownership is not transferable. Each developer is restricted to owning 100 buckets at a time.

Empty buckets can be deleted. Once a bucket is deleted, its name can be reused.

 どうやらbucket名はAmazon S3ユーザ間で共有されているようだ。つまり、ユーザ+bucket+keyでオブジェクトの識別ではなく、bucket+keyでオブジェクトを識別するということ。さっき、表領域かテーブルと言ったが、表領域の方が概念として近いようだ。そして、そもそもこのアプリにはbucketを作る機能がない。
 で、問題はどうやってbucketを作るのか?
SOAPとRESTでPutする方法は書いていた。まずは、そっちをやらないとあかんみたい。