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
上記の場合はStatusがcreatingなので、データベースインスタンスはまだ利用可能にはなっていない。サービスイン直後でリクエストが殺到していたせいかもしれないが、インスタンスが利用可能になるまでに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を入力するとデータベースインスタンスの削除が開始される。
