その s3 cp、s3 sync でいいかも
みなさんは普段AWS CLIを使っていますか?
私は日常的にこんなコマンドを使っていました。
aws s3 cp ./images s3://my-s3-bucket/images --recursive
これは、手元のimagesディレクトリを全てS3のimagesディレクトリにコピーするという手順です。
一回の実行なら良いのですが、
- 定期的に実行する必要がある
- いつも本当にアップロードしたいのは数ファイルだけ
- ファイル数が増えてきて、全部アップロードするには実行時間が気になるように
- さらにS3のバージョニングをしている場合、無駄に期限切れファイルが増えて、ストレージ利用料も増える
という課題がありました。
変更されたファイルだけ自動でアップロードされるコマンドがあったらいいのに…
それが今回ご紹介するs3 syncコマンド!使い方は簡単、
aws s3 sync ./images s3://my-s3-bucket/images
とするだけ、--recursiveフラグもいりません。勝手にディレクトリごと同期してくれます。
「同期ってことは、ファイルが勝手に消されたりしそうで怖いです」
安心してください。デフォルトでは勝手に削除されることはありません。
手元で消したファイルをS3側でも消したいときだけ、--deleteフラグをセットすることで実現できます。
「消えるファイルが事前にわからないと不安です」
--dryrunフラグを付けると、どんな変更がされるかを表示してくれます!削除されるファイルがある場合はこのように表示されます:
$ aws s3 sync ./images s3://my-s3-bucket/images --delete --dryrun
(dryrun) delete: s3://my-s3-bucket/images/delete-sample-image.png
感想
いつも時間がかかっていたファイルのアップロードが爆速になって大変快適です。
余談ですが、s3 syncを初めて調べたとき、思いのほかオプションが多くてびっくりしました。