EC2 インスタンス上のデータをバックアップするのに root しか読み取り権限がないファイルやディレクトリをどうコピーするか、という問題にあたった。Amazon Linux では root のログインを禁止しているため何らかの方法でユーザをスイッチしなくてはならない。んで、rsync のマニュアルを読み返して考えたところ --rsync-path
オプションで rsync
を sudo
で実行すれば良いことに気づいた。
なお、このサーバは踏み台を利用しており、ホストや秘密鍵の設定などは ssh/config
に書いてあるためそれを -e "ssh -Fssh/config"
で呼び出している。--compress
は無くてもいいが EC2 インスタンスからグローバルへの転送は料金がかかるので圧縮しておいた方がコストが減らせる。
rsync -av --progress --compress \ --no-o --no-g --no-p \ --copy-unsafe-links \ -e "ssh -Fssh/config" \ --rsync-path="sudo rsync" \ remote:/path/to/source/ /path/to/destination/
--no-o
、--no-g
、--no-p
はそれぞれ --no-owner
、--no-group
、--no-perms
の省略形。-a
オプションは -rlptgoD
の省略形であるが、このうち o
、g
、p
を打ち消す(-a
を使わずに -rltD
でもいいだろう)。打ち消している理由はバックアップ先のメディアが FAT32 でそもそもパーミッションという概念が無く、「パーミッション変更できまへん」エラーが大量に出るから。本来であれば EXT4 や XFS などの Linux ファイルシステムが望ましい(今回はクライアントからの要望で USB メモリ標準のフォーマットを使用した)。