S3 バケットとローカルのディレクトリを同期する aws s3 sync コマンドの初歩的な使い方のメモ。
aws コマンドのバージョン。
$ aws --version aws-cli/2.1.21 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off
aws s3 sync コマンドの初歩的な使い方
aws s3 sync コマンドは S3 バケットとローカルのディレクトリを同期する便利なコマンド。
S3 バケットとローカルのディレクトリの同期だけじゃなくて任意の S3 バケットのプリフィックス間でオブジェクトを同期したり S3 バケット間のオブジェクトを同期することもできる。
初歩的な使い方だけどたまに「あれ、どうやるんだっけ」みたいなのをメモしておく。
このあとのコマンドの実行でのローカルのディレクトリとファイル構成はこんな感じでやっていく。
$ tree ./data
./data
├── a.txt
└── hoge
├── a.txt
└── fuga
├── a.txt
└── b.txt
2 directories, 4 files
基本的な使い方
aws s3 sync <同期元> <同期先> みたいに使う。
同期元と同期先はそれぞれローカルならローカルのディレクトリのパスを指定するし S3 バケットなら S3バケットとプリフィックスを指定する。
たとえば同期元がローカルの /home/alice/data で同期先が S3 の alice-s3-bucket バケットの data プリフィックスだったらこんな感じにやる。
$ aws s3 sync /home/alice/data s3://alice-s3-bucket/data
同期元が S3 の alice-s3-bucket バケットの data プリフィックスで同期先がローカルの /home/alice/data だったらこんな感じにやる。
$ aws s3 sync s3://alice-s3-bucket/data /home/alice/data
同期元が S3 の alice-s3-bucket バケットの data プリフィックスで同期先が S3 の alice-s3-bucket バケットの data2 プリフィックス だったらこんな感じにやる。
$ aws s3 sync s3://alice-s3-bucket/data s3://alice-s3-bucket/data2
--dryrun オプション: dry run する
--dryrun オプションを指定すると dry run する。
実際にはファイルやオブジェクトは同期せずに「こんな感じにファイルをアップロードしたりコピーしたり削除するよ」を表示する。
$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data (dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt (dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt (dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt (dryrun) upload: data/hoge/fuga/b.txt to s3://alice-s3-bucket/data/hoge/fuga/b.txt
--delete オプション: 削除を同期する
aws s3 sync コマンドは同期元にないファイルが同期先にあるときは同期先のファイルはそのままで削除はしない。
--delete オプションを指定すると同期元にないファイルが同期先にあるときは同期先のファイルを削除する。
$ rm data/a.txt $ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data $ aws s3 sync --dryrun --delete ./data s3://alice-s3-bucket/data (dryrun) delete: s3://alice-s3-bucket/data/a.txt
--quiet オプション: 出力を抑制する
aws s3 sync コマンドはファイルやオブジェクトに対する操作を表示するけど --quiet オプションを指定するとファイルやオブジェクトに対する操作は表示しない。
$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data (dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt (dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt (dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt (dryrun) upload: data/hoge/fuga/b.txt to s3://alice-s3-bucket/data/hoge/fuga/b.txt $ aws s3 sync --dryrun --quiet ./data s3://alice-s3-bucket/data
--exclude: ファイルやオブジェクトを同期から除外する
--exclude オプションを指定するとファイルやオブジェクトを同期から除外する。
--exclude オプションを指定しないときは a.txt は3ファイルが同期する。
$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data | grep a.txt (dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt (dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt (dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt
--exclude オプションで a.txt を指定すると ./data/a.txt が同期から除外する。
$ aws s3 sync --dryrun --exclude a.txt ./data s3://alice-s3-bucket/data | grep a.txt (dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt (dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt
--exclude a.txt みたいにすると ./data 直下の a.txt だけが同期から除外するけど --exclude '*a.txt' みたいにするとすべての a.txt を同期から除外する。
$ aws s3 sync --dryrun --exclude '*a.txt' ./data s3://alice-s3-bucket/data | grep a.txt
--include: ファイルやオブジェクトを同期から除外しない
--include オプションを指定するとファイルやオブジェクトを同期から除外しない。
--include オプションは --exclude オプションと組み合わせて使う。たとえば --exclude '*a.txt' するとすべての a.txt は同期から除外するけど --exclude '*a.txt' --include hoge/a.txt すると ./data/hoge/a.txt は同期から除外せずにちゃんと同期する。
$ aws s3 sync --dryrun --exclude '*a.txt' ./data s3://alice-s3-bucket/data | grep a.txt $ aws s3 sync --dryrun --exclude '*a.txt' --include hoge/a.txt ./data s3://alice-s3-bucket/data | grep a.txt (dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt
ヘルプを見る
aws s3 sync help を実行するとヘルプが表示する。
自分は AWS CLI のヘルプはブラウザーで マニュアル を読んじゃうので aws s3 sync help はブラウザーが使えないときくらいしか使わない気がする。
$ aws s3 sync help
SYNC() SYNC()
NAME
sync -
DESCRIPTION
Syncs directories and S3 prefixes. Recursively copies new and updated
files from the source directory to the destination. Only creates fold-
ers in the destination if they contain one or more files.
See 'aws help' for descriptions of global parameters.
# (省略)