EC2のEBSボリュームからインスタンスを起動できるようになりました

これは実に画期的なことですよ!具体的な話は週末にでもまとめようと思いますが、とりあえずのまとめを今回は業務としてのブログのほうに書かせていただいているので、よければご覧くださいませ。

EC2のEBSボリュームからインスタンスを起動できるようになりました « サーバーワークス技術ブログ

Amazon RDSメモ

※この記事は、Amazon Relational Database Service Developer GuideのAPI Version 2009-10-16版をもとにしています。

Amazon Relational Database Service(以下RDS)は、MySQL 5.1が稼働するサーバーをEC2インスタンスライクに利用することができるサービス。Amazon Web Servicesのアカウントがあれば、Webから申し込みをするだけで、初期費用なしで利用を開始することが可能。

RDSにおける用語

データベースインスタンス (DB Instance)
クラウド内で稼働する個別のデータベース環境。通常のMySQLサーバーだと考えてよいが、SSHでのログインはできない。1つのデータベースインスタンス内には複数のデータベースを作成することができる。
データベースインスタンスの作成時には「マスターユーザー名」と「マスターユーザーのパスワード」を指定する必要がある(起動後も変更可能)。また、通常のMySQLと同様にユーザーの追加や権限の設定を行うこともできる。
データベースインスタンスにアクセスするには、MySQLクライアントライブラリやmysqlコマンドで、データベースインスタンスのDNS名(FQDN)およびポート番号を指定する。
また、EC2インスタンスと同様に、起動時にどのAvailability Zoneで稼働させるかを指定することもできる。
データベースエンジン (Database engine)
データベースインスタンスはMySQL5.1データベースエンジンで稼働する。
将来的には複数のデータベースエンジンをサポートするかもしれないが、現時点ではMySQL 5.1のみがサポートされている。
データベースセキュリティグループ (Database Security Groups)
データベースインスタンスへのネットワークアクセスを制御する。アクセスを許可するリモートホストをCIDRで指定する。
データベーススナップショット (Database Snapshots)
ユーザーにより作成される、いつでもリストア可能なデータベースインスタンスのバックアップ。
データベースパラメータグループ (Database Parameter Groups)
1つ以上のデータベースインスタンスに適用されるエンジンの設定値をまとめたもの。
データベースインスタンスモニタリング(Database Instance Monitoring)
CloudWatch APIを使ってCPU・ストレージ・データベース接続のメトリクスにアクセス可能。

バックアップ

データベースインスタンスのバックアップには、自動バックアップとデータベーススナップショットの2種類がある。自動バックアップはあらかじめ指定した時間帯に自動的にバックアップがとられ、バックアップデータが一定期間だけ保管される。バックアップデータが保管されている間はいつでもリカバリすることができる。データベーススナップショットは、ユーザーが自分で作成するもので、いつでもリストアすることができ、スナップショットはユーザーが削除するまで保管され続ける。

どちらの場合も、バックアップ時に数分間のI/Oフリーズが発生する(原文:A brief I/O freeze (typically lasting a few minutes) will occur during both automated and user-initiated backup operations.)。

自動バックアップ

自動バックアップは、毎日、あらかじめ指定された2時間のバックアップ時間帯(backup window)のどこかでバックアップを自動作成し、保持期限(retention period)の間だけバックアップを保管する。自動バックアップは、新しいデータベースインスタンスを起動した際はデフォルトで有効となる。

自動バックアップを有効にするには、データベースインスタンスのbackup-retention-periodパラメータをゼロ以外の値に設定する。データベースインスタンスの起動後もパラメータの変更は可能。パラメータの値がゼロ以外の値に変更されると、最初のバックアップはただちに行われる。パラメータをゼロに変更すると自動バックアップはオフになり、そのデータベースインスタンスのすべての自動バックアップされたデータは削除される。

自動バックアップを行うバックアップ時間帯はpreferred-backup-windowパラメータで設定する。バックアップ時間帯が設定されていない場合は、システムは自動的に時間帯を設定する(us-east-1リージョンで稼働している場合はUTCの午前3時〜午前5時となる)。バックアップ時間帯の変更はただちに反映されるが、最低でも現在時刻より10分先でなければならない。また、インスタンスの週次メンテナンス時間帯と重なることはできない。

日毎の自動バックアップに加えて、データベースチェンジログも保管される。これにより、最大で直近5分前までの状態に復元することができる。

データベースインスタンスのバックアップはすべて単一の場所(availability zone)に格納される。何らかの理由でデータベースインスタンスが利用不能になると、データベースインスタンスはfailed状態になる。そうなった場合、rds-restore-db-instance-to-point-in-timeコマンドを使い、直近のバックアップを使ってデータベースインスタンスを復元することができる。

データベーススナップショット

データベーススナップショットはユーザーの指示によって作成される。スナップショットはユーザーが削除しない限り残る。

データベーススナップショットを作成するにはrds-create-db-snapshotコマンドを使い、リストアにはrds-restore-db-instance-from-snapshotコマンドを使う。保管されているスナップショットの一覧はrds-describe-db-snapshotsコマンドで表示することができる。

セットアップ

RDSを利用するには、Java 1.5とAmazon RDS Command Line Toolkitが必要。

ダウンロードしたAmazon RDS Command Line Toolkitのzipファイルを展開し、任意のディレクトリに配置する。

$ mv RDSCli-1.0.001 ~/apps

環境変数AWS_RDS_HOMEに、Amazon RDS Command Line Toolkitのディレクトリパスを設定する(必要に応じてシェルの設定ファイルにも記述する)。

$ export AWS_RDS_HOME=$HOME/apps/RDSCli-1.0.001

AWS_RDS_HOME以下のbinディレクトリを環境変数PATHに加える。

$ export PATH=$PATH:$AWS_RDS_HOME/bin

UNIXの場合はbinディレクトリ内のスクリプトに実行権限を与える。

$ chmod +x $AWS_RDS_HOME/bin/*

APIを利用するためにAmazon Web Servicesアカウントの情報を記述したファイルを作成する。雛形として$AWS_RDS_HOME/credential-file-path.templateが用意されているので、これをコピーして使う。

$ cp $AWS_RDS_HOME/credential-file-path.template $AWS_RDS_HOME/credential-file-path

ファイルには、以下のようにAWSアクセスキーIDとAWSシークレットアクセスキーを記述する。

AWSAccessKeyId=アクセスキーID
AWSSecretKey=シークレットアクセスキー

編集したファイルの権限を変更し、他のユーザーに見られないようにする。

$ chmod 600 $AWS_RDS_HOME/credential-file-path

環境変数AWS_CREDENTIAL_FILEに、ファイルのパスを設定する(必要に応じてシェルの設定ファイルにも記述する)。

$ export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path

RDSにアクセスできるか確認するために、データベースインスタンスの一覧を表示する。

$ rds-describe-db-instances --headers

最初はデータベースインスタンスが起動していないため、何も表示されない。この時、以下のように表示された場合は、AWSアカウントのほうでRDSの利用申請がされていないので、先にRDSにサインアップしておく。

$ rds-describe-db-instances --headers
rds-describe-db-instances:  Refused: Subscription to Amazon RDS Service, ProductCode AmazonRDS, required. 
 AWSRequestId:95477738-c2c8-11de-807a-79c03c55f7d4

データベースインスタンスの作成

データベースインスタンスを作成するには、rds-create-db-instanceコマンドを利用する。

$ rds-create-db-instance --db-instance-identifier myinstance \
--allocated-storage 5 \
--db-instance-class db.m1.small \
--engine MySQL5.1 \
--master-username juno \
--master-user-password testtest \
--db-name MyDatabase \
--headers
  • --db-instance-identifierはデータベースインスタンス識別用の名前
  • --allocated-storageは割り当てるストレージ容量(5〜1024GB)
  • --db-instance-classは利用するマシン(db.m1.small, db.m1.large, db.m1.xlarge, db.m2.2xlarge, db.m2.4xlarge)
  • --engine は利用するエンジン
  • --master-username--master-user-passwordはマスターユーザーのログイン情報
  • --db-nameは作成するデータベース名

作成に成功すると、以下のように表示される。

DBINSTANCE  DBInstanceId  Class        Engine    Storage  Master Username  Status    Backup Retention
DBINSTANCE  myinstance    db.m1.small  mysql5.1  5        juno             creating  1               
      SECGROUP  Name     Status
      SECGROUP  default  active
      PARAMGRP  Group Name        Apply Status
      PARAMGRP  default.mysql5.1  in-sync

データベースインスタンスの状態を表示

データベースインスタンスの状態を表示するには、rds-describe-db-instancesコマンドを利用する。

$ rds-describe-db-instances --headers
DBINSTANCE  DBInstanceId  Class        Engine    Storage  Master Username  Status    AZ          Backup Retention
DBINSTANCE  myinstance    db.m1.small  mysql5.1  5        juno             creating  us-east-1d  1
      SECGROUP  default  active
      PARAMGRP  default.mysql5.1  in-sync

上記の場合はStatuscreatingなので、データベースインスタンスはまだ利用可能にはなっていない。サービスイン直後でリクエストが殺到していたせいかもしれないが、インスタンスが利用可能になるまでに20分〜30分ほどかかった。

ネットワークアクセス許可の設定

データベースインスタンスへのアクセスを許可するネットワークを設定するには、rds-authorize-db-security-group-ingressコマンドを利用する。

ネットワークアクセス許可の設定はデータベースセキュリティグループに対して行う必要がある。データベースインスタンスの起動時に特に指定をしなかった場合はdefaultというデータベースセキュリティグループが割り当てられているので、このdefaultグループに対してCIDRでアクセス許可を設定する。

$ rds-authorize-db-security-group-ingress default --cidr-ip xxx.xxx.xx.x/xx --headers
SECGROUP  Name     Description
SECGROUP  default  default    
      IP-RANGE  IP Range         Status
      IP-RANGE  xxx.xxx.xx.x/xx  authorized

データベースインスタンスへのアクセス

以下のようにデータベースインスタンスの状態がavailableとなり、FQDNが表示されたら、データベースへの接続が可能となる。

$ rds-describe-db-instances --headers
DBINSTANCE  DBInstanceId  Created                   Class        Engine    Storage  Master Username  Status     Endpoint Address                                     Port  AZ          Backup Retention
DBINSTANCE  myinstance    2009-10-27T08:25:08.887Z  db.m1.small  mysql5.1  5        juno             available  myinstance.cowx10gz0tao.us-east-1.rds.amazonaws.com  3306  us-east-1d  1               
      SECGROUP  Name     Status
      SECGROUP  default  active
      PARAMGRP  Group Name        Apply Status
      PARAMGRP  default.mysql5.1  in-sync

試しに、mysqlコマンドを使ってローカルマシンから接続する。

$ mysql -h myinstance.cowx10gz0tao.us-east-1.rds.amazonaws.com -P 3306 -u juno -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 65
Server version: 5.1.38-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+------------+
| version()  |
+------------+
| 5.1.38-log |
+------------+
1 row in set (0.18 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| MyDatabase         |
| innodb             |
| mysql              |
| tmp                |
+--------------------+
5 rows in set (0.19 sec)

上記の通り、通常のMySQLサーバーと同様に操作することができる。

データベースインスタンスの削除

データベースインスタンスを削除する場合は、rds-delete-db-instanceコマンドを利用する。

$ rds-delete-db-instance myinstance --skip-final-snapshot true --headers
Once you begin deleting this database, it will no longer be able to accept
connections.
Are you sure you want to delete this database? [Ny]y

削除確認が行われ、yを入力するとデータベースインスタンスの削除が開始される。

インターネットが死ぬ日

インターネットが死ぬ日 (ハヤカワ新書juice)

まだ、読んでいる途中なので感想というわけではないのだけど、インターネット黎明期のエピソードとして、こんな話が書かれている。

これは初のインターネットワームと言われるソフトウェアで、コーネル大学の大学院生、ロバート・タッパン・モーリス・ジュニア(当時23歳)が作ったものだった。彼はニューヨーク州イサカの端末から、まず、MITのコンピューターをワームに感染させた。ワームは感染したマシンにあるアドレスブックを次々にチェックし、インターネット上にある他のコンピューターをみつける。動作はシンプル。自分のコピーを他のマシンに送り、そのマシンですでに動いていたソフトウェアと一緒に自分のコピーを走らせる。これをくり返すだけである。

このワームは、わずか1日の間に当時インターネットに接続されていたコンピューターの5%から10%に感染したと言われている。

(中略)

こんなことをなぜしたのかと尋ねられたモーリスは、インターネットに接続されたマシンの台数を数えたかったと答えた(パソコン通信サービスでは会員数が正確に把握できたが、シンプルなインターネットにはそのようなメカニズムがなかった)。解析してみると、モーリスのプログラムはそのような機能となっていた。ただ、ちょっと間抜けな作りになっていたのだ。きちんと作られていればホストの動作速度が落ちることはなく、注意を集めることもなかっただろう。そうすれば、数日あるいは数ヶ月もインストールされた状態が続き、「存在確認」メッセージをモーリスが指定したマシンに送るなど、さまざまな活動を行い、デジタル的集計が行えたはずであった。

(中略)

モーリスの行動に対しては、コンピューター研究者のコンセンサスとして、一定の処罰に値するが「前途を閉ざすほど厳しい」ものとすべきではないとした。モーリスに対して下された処罰は、まさしくそのようなものだった。モーリスが正式に謝罪したほか、刑事裁判では、3年間の保護観察、400時間の労働奉仕、10,050ドルの罰金が言い渡された。しかしキャリアが失われることはなく、その後モーリスはハーバードに移り、1995年に友人と起業したドットコムスタートアップを1998年、ヤフーに4,900万ドルで売却する。博士号も取得し、現在はMIT教授として活躍している。

ロバート・モーリス、ベンチャー、4,900万ドルで売却、ヤフー…ってViawebをポール・グレアムと設立したロバート・モリスじゃねえか。

Robert Tappan Morris – Wikipediaを読んでみると、

He is best known for creating the Morris Worm in 1988, considered the first computer worm on the Internet.

ビンゴ!