aws s3へフォルダ毎でダウンロードとアップロードする方法

無断転載禁止 aws s3へフォルダ毎でダウンロードとアップロードする方法
aws amazon web service

AWS s3からのフォルダごとの一括ダウンロード&アップロード

AWS s3にアップしている大量の画像ファイルを一括ダウンロードする必要があった。管理コンソールからでは一括操作ができないため、コマンドで行なうAWS CLIを使用することに。AWS CLIはかなり前に他でも使用してたんだけど、何となくわざわざ設定しなおすのもなぁー、と思っていたところ、案外すんなりいったので、メモとして残します。

2016年5月時点、AWSのマネージメントコンソールから、AWS s3の一括ダウンロード、アップロードはできないため、AWS CLIを使用するかアプリなどを使用するしか方法はないようです。

AWS CLIのユーザーアカウントの権限設定

AWSのIAMユーザーの設定

aws cliを使用する前に今回のs3を操作するための専用アカウントを管理コンソールから作成。
画面右上の認証情報からIAMユーザーの使用開始をクリック。
スクリーンショット 2016-05-14 3.02.12

スクリーンショット 2016-05-14 3.02.39

作成完了時に表示される
AWS Access Key ID
AWS Secret Access Key
の2つは後ほど使用するので、
ダウンロードして、忘れないようにメモしておいてください。

それと作成後に左メニューから「ユーザー」→「アクセス許可」から
Amazon s3 Full Access」をアタッチしておくのもお忘れなく。

AWS CLIのインストール

AWSの管理コンソールではフォルダ(バケット)単位での操作ができないため、
aws cliでの操作を行う必要があります。

AWS コマンドラインインターフェイス (CLI) は、AWS サービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数の AWS サービスを制御し、スクリプトを使用してこれらを自動化することができます。
引用元:aws amazon webservices cli

windowsへaws cliのインストール

自分のMBAでは容量が足らないため、会社のwindowsデスクトップPCで操作を行うことに。
まずはwindows8のPCへaws cliのインストールを行う。

以下AWSページからwindows版の64ビットインストーラ―をダウンロードし、特別な設定もなくインストール
http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html#install-msi-on-windows

aws cliの初期設定

インストール完了後、コマンドプロンプトから初期設定を行う。たったの4行。

aws configure
AWS Access Key ID [None]:**********
AWS Secret Access Key []:**********
Default region name []:ap-northeast-1
Default output format []:JSON

ここまでは順調。
次に対象のバケットのリスト表示

aws s3 ls s3://バケット名/

ここまでも問題なし。

UnicodeWarningが出て、振り出しへ

次に実際にバケットのダウンロードをしようとしたところ、下記エラーが表示され、ダウンロードができない事態に!
ユニコードが合わないエラーが出る。
下記でダウンロードを行なおうと、

cd ダウンロードしたいフォルダ
aws s3 cp s3://バケット名/a.txt .

としたところ、下記エラーが表示され、実行されず。

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

ということで今回は原因究明もあまり時間がなく、何かのバージョンの問題だろうと勝手に決めつけ、python経由でインストールをすることに。

pythonの最新版3.5.1をインストール

以下ページからpythonの最新版を落として、
python経由でインストールをすることに。
https://www.python.org/downloads/
特に問題なくインストール完了。

完了後、コマンドプロンプトにて。

pip install awscli

AWS s3のコマンドでのダウンロードとアップロード

s3のバケットから、ローカルへダウンロード

aws s3 cp s3://バケット名/ . --recursive

ローカルから、s3のバケットへアップロード

aws s3 cp フォルダ名 s3://バケット名/バケット名/ --recursive --acl public-read --cache-control "max-age=604800"

いつも思うのだけれど、recursive=再帰的 という言葉は普段使わないので、未だに慣れない。。。

AWS s3のコマンドオプション

オプションの説明は以下

--recursive 再帰的。。。フォルダ以下のファイル全部
--acl public-read 全体に閲覧権限。これがないと表示されないので、WEBの場合は必須。
--cache-control "max-age=604800" キャッシュコントロール。とりあえず7日間。

AWSの管理コンソールからだと、フォルダ(バケット)毎の操作ができないため、aws cliでの操作が必要という話しでした。