たぶん動く...

多分GIS系の人。あくまで個人的見解であり、所属団体を代表するものではありません。

データベースサービスからローカルにdumpファイルを作成せず直接ストレージサービスに格納する (AWS編)

データベースのdumpをS3などのストレージサービスへ格納するとき、Data Pipelineなどのデータ転送サービスを使用するのが常套手段だと思います。

しかし、LAMP環境でDBからdumpを出力、ファイルに保存し、そのファイルをストレージサービスへアップロードと保管することもあると思います。
このとき、EC2に十分な空き容量がないとdumpを取得できませんよね。 コマンドのパイプラインをうまく利用すると、EC2の容量を食うことなく、直接ストレージサービスへアップロードすることができます。

RDSのdumpを直接S3へ出力する

RDS,S3両方にアクセスできるEC2で以下のコマンドを実行する例です。

mysqldump -p -u <USER> -h <DB-instance-identifier>.rds.amazonaws.com <database> <table> | aws s3 cp - s3://<bucket-name>/<dumpfile>.sql

dumpをgzip圧縮し、S3へアップロードする際のコマンド例です。 mysqlのレコードを出力しつつ、gzip圧縮しs3へ格納します。

mysqldump -p -u <USER> -h <DB-instance-identifier>.rds.amazonaws.com <database> <table> | gzip |  aws s3 cp - s3://<bucket-name>/<dumpfile>.sql.gz

S3からdumpを直接RDSへインポートする

RDS,S3両方にアクセスできるEC2で以下のコマンドを実行する例です。

 aws s3 cp s3://<bucket-name>/<dumpfile>.sql - | mysqldump -p -u <USER> -h <DB-instance-identifier>.rds.amazonaws.com <database> <table>

gzip圧縮されたdumpファイルをRDSへ直接インポートする際のコマンド例です。

aws s3 cp s3://<bucket-name>/<dumpfile>.sql - | zcat |  mysql -p -u <USER> -h  <DB-instance-identifier>.rds.amazonaws.com <database> <table>

所感

ローカル (この場合はEC2)にdumpファイルを作成せずストレージサービスへdumpを格納する方法を紹介しました。圧縮する場合はCPU、メモリに負荷がかかります。また、S3に保存する場合はRDSのスペックに依存します。
データベースが大きい場合はデータ転送サービスの利用をお勧めします。

参考文献

rooter.jp