«前の日記(2013-06-11 (Tue)) 最新 次の日記(2014-05-22 (Thu))» 編集

雑記帳


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のサポートが非常に残念なことになっているのはなぜだ。