S3 バケットとローカルのディレクトリを同期する AWS CLI の aws s3 sync コマンドの初歩的な使い方のメモ。
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. # (省略)