雑記帳
2013-11-12 (Tue) [長年日記]
■ [AWS][Ruby] Amazon RDSスナップショットのリージョン間コピー
2013-10-31に、RDSのスナップショットをリージョン間コピーする機能が追加されたので、早速試してみた。
今回も例によって、AWS SDK for Rubyを使ってみたいと思う。AWS SDK for Rubyは11月8日にリリースされたv1.25.0を使う。このリリースでは、この機能に対応した高レベルAPIは対応されていない*1。しかし、今回のAPIの変更点は、CopyDBSnapshotのパラメータで取れるSnapshot IDの値のみであり、既存のAPIが実行できるのであれば、問題なく利用できるはずなので、それを実際にためそうと思う。
今回は、東京リージョンからシンガポールリージョンにコピーを行う。コードは次のようになる。
rds = AWS::RDS.new(:region => 'ap-southeast-1') rds.client.copy_db_snapshot( :source_db_snapshot_identifier => 'arn:aws:rds:ap-northeast-1:<your_account_number>:snapshot:<snapshot_id>', :target_db_snapshot_identifier => '<snapshot_id>' )
ポイントは2つ。APIを実行する先のリージョンは、コピー先のリージョンであること。逆にするとエラーになる。もう一つは、コピー元のスナップショットを指定する際に、ARNを使うこと。リージョン間コピーの場合、APIの対象がリージョンをまたぐことになる。APIはリージョン単位で実行されるため、ARNを使って別リージョンにあるリソースを指定する、ということになる。
その他注意するべき点として、リージョン間コピーは、同時にひとつのスナップショットのみ実行可能となる。同時並行的には実行できない(試していないけど、コピー先となるリージョンが別であれば可能だと思う)。
ちなみに、東京からシンガポールに送ったときは比較的高速で、10 GB前後であれば初回のコピーは30分もかからなかった。また、同じインスタンスの別スナップショットを送ると、差分のみの転送になるので、更に高速になる。テストを実施した時に、先に最新のスナップショットをコピーしてから、少し古いスナップショットをコピーしたら、ちゃんと差分のみの転送になったようで、やはり高速だった。
*1 AWS SDK for RubyはRDSのサポートが非常に残念なことになっているのはなぜだ。