LoginSignup
0
0

More than 3 years have passed since last update.

【AWS】S3のファイルをローカルPCに同期したい【aws-cli】

Last updated at Posted at 2020-12-08

やりたいこと

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 CLI のインストール

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


参考にさせていただいた記事やリファレンスなど

ありがとうございます!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0