AWS CLI をインストールしてみて、S3 へファイルアップロードを試してみた

# はじめに

AWS CLI のインストールをして、S3 を各種操作する方法を簡単にまとめます。一連の流れがわかりやすく整理された AWS Document があまり見つからなかったので、後から見返したときにわかりやすいように整理しました。



# S3 Bucket の作成

ファイルをアップロードするための、S3 Bucket を作成します。S3 の画面で、Create bucket を押します。

![image-20221217180614735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c5f72298-e47f-0b96-ca51-213394299b4a.png)



名前とリージョンを指定します。

![image-20221217181302658.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2796e307-2ce1-a6d6-7d68-17eb08985a28.png)



Create bucket を押します。

![image-20221217181320093.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d802731e-1d95-bd73-5ebf-1f9fa14707de.png)



S3 Bucket が作成されました。

![image-20221217181353670.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/896859ab-32a3-2b2e-09ff-a9952e9b771e.png)





# IAM Policy の作成

作成した S3 Bucket にだけアクセスが出来る IAM Policy を作成します。

Create policy を押します。

![image-20221217181554107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/4009b790-ca5e-fe14-d6d4-a29a02e1663d.png)



Service で S3 を選択します。

![image-20221217181632461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5a3cfb17-c15b-27a4-c538-97850538cbf5.png)



s3 cp や s3 sync などに必要な権限を指定します。

- ListBucket
- GetObject

![image-20221217182436637.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ccea2007-7c9a-7f3e-c706-152c4dc7834e.png)



- PutObject
- DeleteObject

![image-20221217195255893.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/364bb871-7dfe-d6ac-a433-60fd32378568.png)



bucket で Add ARN を押します。

![image-20221217182629884.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ebe38c4b-c0cc-f89e-3b4b-7590b76eb5fd.png)



作成した Bucket 名を入力して、Add を押します。

![image-20221217182712263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/16871a05-1d80-3857-1e16-52ee4a21d549.png)



object で Add ARN を押します。

![image-20221217191256071.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/36eee08d-6c50-612b-fe88-d66e6ec3d236.png)



Bucket と Object の名前を指定します。Object は Any にチェックを入れます。

![image-20221217191332476.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/64d92f5e-895f-0161-a0ed-5ec12ac225bc.png)



Next Tags を押します。

![image-20221217182806946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/743834ae-8582-4d06-aca5-b706cd5374ae.png)







Next を押します。

![image-20221217182843698.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3f8c03fb-550a-d9ca-6260-07edcbd89cfe.png)



適当に名前を入れて、Create policy を押します。

![image-20221217183005915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f93d513e-67d5-7ae1-7683-c93369ac924a.png)



IAM Policy が作成されました。



# IAM User の作成

AWS CLI で利用する Access Key 等を生成するために、IAM User を作成します。Add users を押します

![image-20221217180108532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/aab9f59b-692d-fc10-986e-7e5dcf4cca50.png)



User 名を入力し、Access key を選び、Next を押します。

![image-20221217180236920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/37461802-08ac-40ac-f893-62aa108ab998.png)



作成した IAM Policy を選択して、Next を押します。

![image-20221217183447417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b6ae85f8-01c4-149a-ba78-6a01e3da2695.png)



Next を押します。

![image-20221217183519355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/297c2737-69dc-5ade-8d15-50abd1057070.png)



Create user を押します。

![image-20221217183552003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/835f5f58-1fc9-6787-18d3-2f1d75a5b665.png)



画面に表示される Access key と Secret access key を控えておきます。

![image-20221217183700868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/423c1cb6-9ed0-bc8a-5089-371217e5cf43.png)



# AWS CLI のインストール

次の Document に従って、AWS CLI をインストールします。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html



インターネットから AWS CLI をダウンロードしてインストールします。

```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```



これで `aws` コマンドが利用可能となりました。AWS CLI の version を確認します。

```
$ aws --version
aws-cli/2.9.8 Python/3.9.11 Linux/5.10.157-139.675.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
```



# AWS CLI の高速セットアップ

aws configure コマンドで、AWS CLI の設定を行います。

```
aws configure
```



aws configure コマンドでは、Access Key や Secret Access Key 等を入力していきます。

```
$ aws configure
AWS Access Key ID [None]: <your Access Key>
AWS Secret Access Key [None]: <your Secret Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
```



この AWS CLI が、どの IAM User としてコマンドが実行されているか確認できます。

```
aws sts get-caller-identity
```



実行例

- s3-cliuser として実行していることがわかります。

```
$ aws sts get-caller-identity
{
    "UserId": "AIDAVNVNXMHCNCIH5VARA",
    "Account": "xxxxxxxxxxxx",
    "Arn": "arn:aws:iam::xxxxxxxxxxxx:user/s3-cliuser"
}
```



# S3 にファイルをアップロード

実際に S3 にファイルをアップロードするためにテストファイルを作成します。

```
echo "hello, I am test file01." > test01.txt
```



ローカルで作成したテストファイル `test01.txt` を S3 Bucket にアップロードします。

```
aws s3 cp test01.txt s3://s3-clitest01/
```



実行例

```
$ aws s3 cp test01.txt s3://s3-clitest01/
upload: ./test01.txt to s3://s3-clitest01/test01.txt
```



ls コマンドで、ファイルがアップロードされていることがわかります。

```
$ aws s3 ls s3://s3-clitest01/
2022-12-17 10:14:19         25 test01.txt
```



マネージメントコンソール上でも確認をします。S3 Bucket 上にオブジェクトがアップロードされていることがわかります。

![image-20221217191524261.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/292d0d4b-6b31-564e-71dc-5ca6c602e7a8.png)



選択して Open を選択します。

![image-20221217192024892.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0a861572-ee1d-9194-769f-8f4e4151a376.png)



ブラウザ上でファイルの中身を確認できました。

![image-20221217192044970.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fbc78da8-a89d-a505-6d03-9e8fd86d1298.png)



# S3 にディレクトリ単位でアップロード

アップロード対象のディレクトリを作成します。

```
mkdir testdir01
echo "hello, I am test file01." > testdir01/test01.txt
echo "hello, I am test file02." > testdir01/test02.txt
echo "hello, I am test file03." > testdir01/test03.txt
```



ローカルに作成した `testdir01` ディレクトリに 3 つのファイルが作成されました。

```
$ ls -la testdir01/
total 12
drwxrwxr-x 2 ec2-user ec2-user  60 Dec 17 10:21 .
drwx------ 6 ec2-user ec2-user 152 Dec 17 10:21 ..
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:21 test01.txt
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:21 test02.txt
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:21 test03.txt
```



ディレクトリ単位で S3 にアップロードができます。ドライランのオプションを付けて、どのファイルがアップロード対象になるか確認をします。

- `--recursive` を指定して、ディレクトリ単位にアップロード
- `--dryrun` でドライランを有効化

```
aws s3 cp testdir01 s3://s3-clitest01/testdir01 --recursive --dryrun
```



実行例 : dryrun なので実際にアップロードはされませんが、どのファイルが処理対象として選ばれるかわかります。

```
$ aws s3 cp testdir01 s3://s3-clitest01/testdir01 --recursive --dryrun
(dryrun) upload: testdir01/test01.txt to s3://s3-clitest01/testdir01/test01.txt
(dryrun) upload: testdir01/test02.txt to s3://s3-clitest01/testdir01/test02.txt
(dryrun) upload: testdir01/test03.txt to s3://s3-clitest01/testdir01/test03.txt
```



`--dryrun` を外して、実際にディレクトリ単位でアップロードを行います。

```
aws s3 cp testdir01 s3://s3-clitest01/testdir01 --recursive
```



実行例

```
$ aws s3 cp testdir01 s3://s3-clitest01/testdir01 --recursive
upload: testdir01/test01.txt to s3://s3-clitest01/test01.txt
upload: testdir01/test02.txt to s3://s3-clitest01/test02.txt
upload: testdir01/test03.txt to s3://s3-clitest01/test03.txt
```



確認

```
$ aws s3 ls s3://s3-clitest01/testdir01/
2022-12-17 10:30:54         25 test01.txt
2022-12-17 10:30:54         25 test02.txt
2022-12-17 10:30:54         25 test03.txt
```



マネージメントコンソールでも、testdir01 が見えています。

![image-20221217193331777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/53f8c5a6-3f2a-4a94-48cd-42c38b72de2b.png)



ローカルにあった、3 個のファイルがアップロードされています。

![image-20221217193354935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f76cc258-bd26-91ff-d00e-6ea79aba4a82.png)



# S3 にディレクトリを同期

s3 sync コマンドでディレクトリ単位の同期ができます。動作確認のため、`testdir02` ディレクトリを作成してみましょう。

```
mkdir testdir02
echo "hello, I am test file01." > testdir02/test01.txt
echo "hello, I am test file02." > testdir02/test02.txt
echo "hello, I am test file03." > testdir02/test03.txt
```



ディレクトリが作成されました。

```
$ ls -la testdir02/
total 12
drwxrwxr-x 2 ec2-user ec2-user  60 Dec 17 10:44 .
drwx------ 7 ec2-user ec2-user 169 Dec 17 10:44 ..
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:44 test01.txt
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:44 test02.txt
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:44 test03.txt
```



s3 sync コマンドで、ドライランをしてみます。

```
aws s3 sync testdir02 s3://s3-clitest01/testdir02 --dryrun
```



実行例 : 同期されそうなことがわかります。

```
$ aws s3 sync testdir02 s3://s3-clitest01/testdir02 --dryrun
(dryrun) upload: testdir02/test01.txt to s3://s3-clitest01/testdir02/test01.txt
(dryrun) upload: testdir02/test02.txt to s3://s3-clitest01/testdir02/test02.txt
(dryrun) upload: testdir02/test03.txt to s3://s3-clitest01/testdir02/test03.txt
```



実際に実行してみましょう。

```
$ aws s3 sync testdir02 s3://s3-clitest01/testdir02
upload: testdir02/test01.txt to s3://s3-clitest01/testdir02/test01.txt
upload: testdir02/test03.txt to s3://s3-clitest01/testdir02/test03.txt
upload: testdir02/test02.txt to s3://s3-clitest01/testdir02/test02.txt
```



S3 上に、ローカルのディレクトリが同期されています。

![image-20221217194738773.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3684a29b-a5eb-9adf-4bec-7e6ce4b804ad.png)



ディレクトリの配下もみてみます。

![image-20221217194757542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ae72b426-4eba-b7f9-2d24-0fb6edff5ed6.png)



次に、ローカルにある test02.txt を削除してみます。

```
rm testdir02/test02.txt
```



削除されました

```
$ ls -la testdir02/
total 8
drwxrwxr-x 2 ec2-user ec2-user  42 Dec 17 10:50 .
drwx------ 7 ec2-user ec2-user 169 Dec 17 10:44 ..
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:44 test01.txt
-rw-rw-r-- 1 ec2-user ec2-user  25 Dec 17 10:44 test03.txt
```



`--delete` を付けると、同期元で存在しないファイルは、同期先でも削除されます。

```
$ aws s3 sync testdir02 s3://s3-clitest01/testdir02 --delete --dryrun
(dryrun) delete: s3://s3-clitest01/testdir02/test02.txt
```



実際に実行

```
$ aws s3 sync testdir02 s3://s3-clitest01/testdir02 --delete
delete: s3://s3-clitest01/testdir02/test02.txt
```



削除されました。

![image-20221217195339031.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/228e2ce5-cf90-14a6-c5b6-18365dac8060.png)



# 参考 URL

https://qiita.com/nakazax/items/b62309884a19d71f9a34