AWS S3の特定bucketにCLIやAPIでアクセスする設定

AWS S3の特定のbucketに、CLIやAPIからアクセスキーIDとシークレットアクセスキーでアクセスする設定を行います。

全体像は以下のようなイメージです。まず、s3testwsというバケットをつくります。そしてs3testwsuserというユーザーをつくり、アクセスキーIDとシークレットアクセスキーを生成します。
そして、バケットポリシーでこのバケットs3testwsに対してユーザーs3testwsuserのアクセス権限を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e5fee8d9-a8a0-2e3c-903e-0602105e1375.png)

#1 バケットの作成
以下のようにバケットを作成します。リージョンはap-northeast-1を選び、パブリックアクセスをすべてブロックしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/93cd002a-d893-efd0-b4e2-dac046bdad60.png)

テスト用にtest.csvというファイルをアップロードしておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d91a9221-cd1b-21a3-7b28-18f5e294f26b.png)

#2 ユーザーの作成

以下のようにユーザーを作成します。「プログラムによるアクセス」にチェックをいれて、アクセスキーIDとシークレットアクセスキーを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/03960526-c5a2-3293-d36c-16e041b030e5.png)

グループやアクセス権限、タグは設定なしで構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fafa9c0d-577e-edbf-9d60-83680b381a37.png)

アクセスキーIDとシークレットアクセスキーをメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e15f6c92-ff7b-efad-9356-10e6fd7f6411.png)

AWS CLIからアクセスしてみます。この時点では権限がないのでアクセスできないはずです。
aws configure --profile s3testwsuser

先ほどのアクセスキーIDとシークレットアクセスキーを設定し、リージョンはap-northeast-1に設定します。

```
C:\temp>aws configure --profile s3testwsuser
AWS Access Key ID [None]: AXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

まだアクセス権限を与えていないので、s3://s3testwsをlsすると失敗します。

```
C:\temp>aws s3 ls --profile s3testwsuser s3://s3testws
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
```

次にバケットポリシーを設定していきますが、その前にこのユーザーのARNをメモしておきます。
arn:aws:iam::0xxxxxxxxxxxxx:user/s3testwsuserというような文字列です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9f1c2ee2-c7a3-ac7d-30e1-fb509486fe33.png)

#3.バケットポリシーの設定

バケットポリシーでs3testwsuserにアクセス権限を与えます。
バケットの「アクセス許可」タブの「バケットポリシー」を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/558f7b99-64a2-288f-e9f6-50aa397e525b.png)


以下のjsonで設定をします。

```json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Sid": "statement1",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam:0xxxxxxxxxxx:user/s3testwsuser"
         },
         "Action": [
            "s3:GetBucketLocation",
            "s3:ListBucket"
         ],
         "Resource": [
            "arn:aws:s3:::s3testws"
         ]
      },
      {
         "Sid": "statement2",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::0xxxxxxxxxxx:user/s3testwsuser"
         },
         "Action": [
             "s3:GetObject",
             "s3:PutObject"
         ],
         "Resource": [
            "arn:aws:s3:::s3testws/*"
         ]
      }
   ]
}
```

statement1でユーザーs3testwsuserにバケットs3testwsに対するGetBucketLocationとListBucketを付与しています。これでバケット内をls可能になります。
statement2でユーザーs3testwsuserにバケットs3testws内のすべてのオブジェクトに対するGetObjectとPutObjectを付与しています。これでバケット内のファイルのアップロード、ダウンロードが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8ed5945c-6668-1719-07dc-15b6bded9e52.png)

この設定ができるとaws cliでバケット内のls、get、putが可能になります。

```cmd:ls
C:\temp\s3test>aws s3 ls --profile s3testwsuser s3://s3testws
2021-09-13 10:39:38         32 test.csv
```

```cmd:get
C:\temp\s3test>aws s3 cp --profile s3testwsuser s3://s3testws/test.csv ./
download: s3://s3testws/test.csv to .\test.csv

C:\temp\s3test>dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は A0A9-D574 です

 C:\temp\s3test のディレクトリ

2021/09/13  11:15    <DIR>          .
2021/09/13  11:15    <DIR>          ..
2021/09/13  10:39                32 test.csv
               1 個のファイル                  32 バイト
               2 個のディレクトリ  38,611,513,344 バイトの空き領域
```

```cmd:put
C:\temp\s3test>aws s3 cp --profile s3testwsuser test.csv s3://s3testws/test2.csv
upload: .\test.csv to s3://s3testws/test2.csv

C:\temp\s3test>aws s3 ls --profile s3testwsuser s3://s3testws
2021-09-13 10:39:38         32 test.csv
2021-09-13 11:16:18         32 test2.csv
```

#4 参考
Amazon IAM編　S3バケット内特定フォルダだけ操作するIAMポリシー – ナレコムAWSレシピ | AIに強い情報サイト

https://recipe.kc-cloud.jp/archives/7456

Bucket policy examples - Amazon Simple Storage Service

https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html

AWS CLIでS3を操作するコマンド一覧 - Qiita

https://qiita.com/uhooi/items/48ef6ef2b34162988295