S3バケット配下をまとめてローカルにダウンロードする

# 動機
AWSのS3にファイルを置いて何らかのサービス・アプリを使用していたけれど、当分使用しない、でも次使うときのためにそのまま残しておきたいと思ったのですが、AWSマネジメントコンソールの操作では、複数のファイルを一気に落とせないみたいなんですね。なのでここではS3バケットの配下をそのままローカルにダウンロードする方法についてまとめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/5c47a51f-1617-42cb-a9d9-ce7d77a034e7.png)

# はじめに
本記事では、AWS CLIのコマンドをたたいてAmazon S3からバケット配下をローカルにダウンロードする方法についてまとめます。

# 手順
1. IAMユーザーの作成
2. ローカルにAWSCLIを準備
3. AWSCLIの設定
4. ダウンロードの実行

# 1.IAMユーザーの作成
- ユーザーの作成
- ユーザーに与えるポリシー（権限）の作成
    - STSの利用権限（アクセストークン発行のため）
    - S3リソースの操作権限
- ポリシーをユーザーにアタッチ

### ユーザーの作成
AWSマネジメントコンソールからIAMを検索し、左のメニューから「**アクセス管理**」>「**ユーザー**」を選択します。続いてユーザー作成ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/91e3e628-469c-4af8-8a03-c24675b700fa.png)

好きなユーザー名を設定します。今回は「backetDownloader」としました。次の許可を設定では特に何も触らずに「**次へ**」を選択し、確認画面で「**ユーザーの作成**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/894b81f5-3dfe-4349-bc3a-a26fbf72edf4.png)

これでユーザー「backetDownloader」が作成できました！
しかしこのままではこのユーザーは何も権限がなく、AWS上のあらゆるリソースやエンティティを操作、アクセスすることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/8d6a2dd2-c8f1-4884-9802-05663cfe2d73.png)



### ユーザーに与えるポリシーの作成
そこで、ユーザーに与える**ポリシー**（**権限**）を作成します。
IAMの左のメニューから「**アクセス管理**」>「**ポリシー**」を選択し、右上のポリシーの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/0a66769b-0a2e-4df8-acea-034fe75c91e0.png)

#### STSの利用権限
AWSCLIからIAMユーザーに設定した権限を利用したコマンド実行を行うには、アクセスキーが必要になります。
ポリシーの作成画面から以下の情報を入力します。

サービス：**STS**
アクション：**AssumeRole**
リソース：**特定（ARNは先ほど作成したIAMユーザーのARNを設定）**
※リソースについて「**すべて**」を選択してもよいですが、セキュリティ上推奨されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/45a35be7-2656-43e8-97bf-40df59bfa6be.png)

IAMユーザーのARNは、IAM > ユーザー から対象のユーザーをクリックすることで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/128a055f-5a69-4c9a-b028-ea3deaf50d97.png)

ポリシーの名称を設定して作成完了です。今回は「UseSts」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/35c79a82-92d6-4b0c-ba4d-c99a274b72e2.png)


#### S3リソースの操作権限
今回はS3バケット配下のオブジェクトの一括保存を行いたいので、必要な権限は以下になります。
| アクセス許可　| 概要 |
|:------------:|:----|
|s3:GetObject|特定のオブジェクト（ファイル）を S3 バケットから取得（ダウンロード）するためのアクセス許可です。このアクションを許可することで、ユーザーやサービスは指定されたオブジェクトを読み取ることができます。|
|s3:ListBucket|S3 バケット内のオブジェクト一覧を取得するためのアクセス許可です。このアクションを許可することで、ユーザーやサービスはバケット内のオブジェクトのリストを取得できます。|

さて、再度ポリシーの作成画面を開き、今度は以下のように設定します。
サービス：**S3**
アクション：**GetObject**, **ListBucket**
リソース：**特定（ダウンロードするS3バケットのARNを設定）**
※複数のバケットに対してアクセス権限を付与したい場合は「**すべて**」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/8f08f323-054e-4b9a-815d-87bc0f04e209.png)

ポリシー名称を設定して作成完了です。今回は「DownloadBucket1」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/8c0e983a-1e29-41df-b3b1-5504a44c78e4.png)

### ポリシーをユーザーにアタッチ
最後に、作成したポリシーをユーザーに付与（アタッチ）します。
IAMの左のメニューからユーザーを選択し、先ほど作成した「backetdownloader」を選択します。
少し下にドラッグして「**許可ポリシー**」の欄から「**許可を追加**」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/19ea5e8b-11ce-4e54-bdce-dfcb942f1b26.png)

許可を追加の画面から、「**ポリシーを直接アタッチする**」を選択します。
アタッチするポリシーの検索ができるため、先ほど作成した UseSts と Downloadbacket1 をアタッチします。リスト左のチェックボックスをクリックすることで追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/6d66780b-328b-4834-ad01-50a02e56063d.png)

問題ないことを確認したらアタッチを完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/377b3ac1-9370-4150-bf1d-b17c10cda881.png)

以下のように正常にポリシーがアタッチされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/17eefa50-aa47-4ab8-a0c8-b0e5c6827124.png)


# 2. ローカルにAWSCLIを準備
AWS CLI がインストールされていない場合は、公式ドキュメント を参照してインストールしてください。

私はWSL（つまりLinux）で実施しました。
まず必要に応じてapt-getのアップデート。
```shell:WSL Console
> sudo apt-get update
```
続いて、AWS CLIをインストールします。
```shell:WSL Console
> sudo apt install awscli
```
以下のコマンドを入力し、インストールされていることを確認します。
```shell:WSL Console
> aws --version
aws-cli/1.22.34 Python/3.10.6 Linux/5.15.167.4-microsoft-standard-WSL2 botocore/1.23.34
```

# 3. AWSCLIの設定
AWS CLIにアクセスキーを設定し、作成したユーザーがAWSCLIを通してS3を操作できるようにします。

### アクセスキーの発行
IAMの左のメニューからユーザーを選択し、作成したユーザー（backetdownloader）を選択します。さらに「**セキュリティ認証情報**」>「**アクセスキー**」>「**アクセスキーを作成**」 を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/c249f01e-21b4-4896-aff3-776462544227.png)

今回はCLIを使用するので「**コマンドラインインターフェイス (CLI)**」を選択し、**上記のレコメンデーションを理解し、アクセスキーを作成します** にチェックを入れてアクセスキーを発行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/1cf09a83-5d4a-488d-84e0-509c16e0d49b.png)

無事アクセスキーが発行できました。アクセスキーとシークレットアクセスキーはAWS CLIに入力するので、完了ボタンを押さずに次の手順に移ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/574ee756-c506-4b58-b681-346027bf9992.png)

### AWSCLIの設定
以下のコマンドを押下し、アクセスキーなどの情報を順番に入力します。
```shell:WSL Console
> aws configure
AWS Access Key ID [None]:アクセスキー
AWS Secret Access Key [None]:シークレットアクセスキー
Default region name [None]:us-east-1（s3のリージョン）
Default output format [None]:json
```

# 4. ダウンロードの実行
いよいよダウンロードを実行します。以下のコマンドを入力してください。
backetA という名称のバケットの場合、以下のように指定します。
```shell:WSL Console
> aws s3 sync s3://backetA local_backetA（ダウンロード先のパス）
```
この結果、local_backetA というディレクトリに backetA 配下のオブジェクトがダウンロードされます。

# トラブルシューティング
```shell:WSL Console
fatal error: An error occurred (AccessDenied) when calling the ListObjectsV2 operation: 
User: arn:aws:iam::860719471829:user/backetdownloader is not authorized to perform:
s3:ListBucket on resource: "arn:aws:s3:::pubbucket15" because no identity-based policy
allows the s3:ListBucket action
```

上記エラーが発生した場合、S3側で「**ListBucket**」が許可されていない可能性があります。
ダウンロードしたいS3バケットを開き、「**アクセス許可**」の中の「**ブロックパブリックアクセス (バケット設定)**」および「**バケットポリシー**」を確認してください。
「**ブロックパブリックアクセス (バケット設定)**」について、今回作成したポリシーでアクセス可能なように設定してください。（以下ではオフにしている）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1041760/02e2a594-d9af-4af6-999a-c210d0d7d4cc.png)

また、「バケットポリシー」について、**s3:ListBucket**, **s3:GetObject**の2つのActionを許可してください。
```json:ダウンロードしたバケットのバケットポリシーの例
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:ListBucket",
				"s3:GetObject"
			],
			"Resource": [
				"arn:aws:s3:::bucketA(バケット名)",
				"arn:aws:s3:::bucketA(バケット名)/*"
			]
		}
	]
}
```

# まとめ
色々と書いていますが、結局やりたいことは簡潔で、それを成し遂げるために何に対してどのような権限を与えなければいけないかというところですね。

### 目的
AWSCLIのコマンドを使用してS3バケット配下をローカルにダウンロードしたい

### 必要な準備
- **IAMユーザー**
    - AWSCLIからアクセスできるようにするためのポリシー
    - S3バケットに対してアクセス・ダウンロードできるようにするポリシー

&#13;&#10;
- **S3バケット**
    - ユーザーがアクセス可能なようにするためのバケットポリシー

###実行内 容容
作成したユーザーとしてコマンドを発行し、S3バケット配下をダウンロード