全力で怠けたい

怠けるために全力を尽くしたいブログ。

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.

# (省略)

参考サイト