やりたいこと
S3の画像(ファイル)をローカルPC(ubuntu18.04)に同期したい。
環境
- OS: ubuntu18.04
- aws-cli version: 1.18.175
- python3.6.9
$ aws --version
aws-cli/1.18.175 Python/3.6.9 Linux/5.4.0-56-generic botocore/1.19.15
aws-cliのインストール
※以下では環境変数をexportコマンドで設定しているが、毎回やる必要があるため面倒な場合には~/.bashrcなどに設定する。
pipでaws-cliインストールする
awsコマンドを使用する。
awsコマンドはaws-cliをインストールすると使用できるようになる。
ここではpipコマンドにてインストールする方法を記しておく。
$ pip3 install awscli --upgrade --user
# 必要に応じて以下のコマンドでawsコマンドのpathを通す
$ export PATH=~/.local/bin:$PATH
参考: Linux での AWS CLI バージョン 1 のインストール、更新、アンインストール - pip を使用した AWS CLI バージョン 1 のインストールとアンインストール
※他インストール方法についてはここでは割愛するが、参考にさせていただいた記事では他の方法も紹介されている。
以下のコマンドでインストールできたことを確認する。
$ aws --version
aws-cli/1.18.175 Python/3.6.9 Linux/5.4.0-56-generic botocore/1.19.15
※ 今はversion1と互換性の無いversion2が出ているよう。ただし以下の記述をみるとAWS 1のサポートが切れるわけではないので、今回は困らない限りこのまま書く。
AWS CLI バージョン 1 はオリジナルの AWS CLI であり、このサポートは継続されます。ただし、AWS CLI バージョン 2 で導入された主な新機能は、AWS CLI バージョン 1 にバックポートされない場合があります。
AWSの資格情報を設定する
awsコマンドでAWSへのアクセスをするための設定する。
様々な方法があるが、ここでは環境変数でアクセスキーとシークレットキーを設定する。
以下のコマンドで環境変数に資格情報を設定する。
$ export AWS_ACCESS_KEY_ID=<自分のアクセスキー>
$ export AWS_SECRET_ACCESS_KEY=<自分のシークレットキー>
参考:AWS CLI の設定 - AWS CLI を設定する環境変数
※その他の方法や詳細についてはAWS CLI の設定にて
S3の画像を同期する
※ pathなどは問題の無い程度に置換済み
aws s3 syncコマンド
基本的な公文は以下です。
$ aws s3 sync <source> <target> [--options]
s3 sync コマンドはバケットとディレクトリの内容を同期します。または 2 つのバケットの内容を同期します。通常、s3 sync は欠落しているか古くなったファイルやオブジェクトを、ソースとターゲットの間でコピーします。
引用:AWS CLI での高レベル (S3) コマンドの使用 - オブジェクトの同期
今回はaws s3 syncコマンドを用いてs3バケットとローカルのディレクトリを同期させるため、そのように例を書いていく。
基本的な使い方
$ aws s3 sync s3:<Buket名> <local path>
$ aws s3 sync s3://example.jp/ ./
example.jpというバケットの/test/下の画像を./下に同期する。
$ aws s3 sync s3://example.jp/ ./
download: s3://example.jp/img.png to ./img.png
download: s3://example.jp/test/img.png to test/sample.png
download: s3://example.jp/test/img.png to test/sample.jpg
S3のpathを指定して同期
$ aws s3 sync s3://example.jp/test/ ./
example.jpというバケットの/test/下の画像を./下に同期する。
$ aws s3 sync s3:/example.jp/test/ ./
download: s3://example.jp/test/sample.png to ./sample.png
download: s3://example.jp/test/sample.jpg to ./sample.jpg
--exclude,--includeなどのオプションでファイルをフィルタする
$ aws s3 sync s3://example.jp/test/ ./ --exclude "*" --include "*.png"
example.jpというバケットのtest/下から.pngで終わるファイルのみをフィルタして./下に同期する。
$ aws s3 sync s3://example.jp/test/ ./ --exclude "*" --include "*.png"
download: s3://example.jp/test/sample.png to ./sample.png
--includeのみでは意図したとおりに動作しないため注意
以下のように--includeのみの指定では全て取ってきてしまうよう。
あくまで--excludeで除外したものに対しての--includeオプションであるためらしい。
参考:AWS CLI の S3コマンド の include オプションには注意が必要
$ aws s3 sync s3://example.jp/test/ ./ --include "*.png"
download: s3://example.jp/test/sample.png to ./sample.png
download: s3://example.jp/test/sample.jpg to ./sample.jpg
上記の例では--exclude "*"で全てのファイルを除外して、--include "*.png"で全ての中から.pngで終わるファイルのみを同期している。
公式のサンプルには上記のような例も乗っているが注意。
その他のオプションなど
ここではごく一部のみ紹介。
-
--exclude <val>:<val>をファイル名に含むファイルを除外する -
--include <val>:<val>をファイル名に含むファイルを対象に含める -
--delete:ソース(今回はS3内)に存在しないファイルまたはオブジェクトをターゲット(今回はローカルPC)から削除する
この他のオプションや詳細については以下を参考に。
参考:
- AWS CLI での高レベル (S3) コマンドの使用 - オブジェクトの同期
- [AWS CLI Command Reference - sync] (https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)
参考にさせていただいた記事やリファレンスなど
ありがとうございます!