EC2からS3へのアップロードやダウンロードの方法

## はじめに
S3を経由してEC2から別のEC2へファイルを移動する機会がありましたので、自分の備忘録を兼ねて記載します。
※本記事は2024年10月ごろの情報を基に作成しています。
## 実施したいこと
「EC2_A」のファイルをS3経由して「EC2_B」にコピーします。
構成は以下のようになります
![EC2-S3_2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/7882bcf2-7ce3-e6ef-ddb7-c814bb9ee157.png)


## 前提
・AWSアカウントがあること
・EC2、S3のリソースが既にあること
・EC2、S3の操作権限があること
・EC2にSSHで接続できると
・EC2にAWS CLIがインストールされていること
・ターミナルはTeraTarmを使用

## 作業内容
①EC2_AとEC2_BにS3のアクセス権限を付与(IAMロールのアタッチ)
②EC2_AらS3へアップロード
③S3からEC2_Bへダウンロード
④EC2_AとEC2_BにS3のアクセス権限を削除(IAMロールのデタッチ)

## ①EC2_AとEC2_BにS3のアクセス権限を付与(IAMロールのアタッチ)
EC2がS3に対して操作(アップロード/ダウンロード)するための権限をロールを作成し付与します。
本作業はEC2_AとEC2_Bに対して行います。 
AWSマネジメントコンソールの検索窓で「IAM」と検索します。
左のメニューから「ロール」を選択して「ロールを作成」を押下します。
信頼されたエンティティタイプでは「AWSサービス」を選択します。
「ユースケース」では「EC2」を選択し次へを押下します。
![スクリーンショット 2024-10-30 141127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c88c81b6-3abb-c2d0-b91b-2e9fa0c33d94.png)
許可ポリシーで追加したいポリシーを選択します。
※手順ではS3FullAccessを選択していますが、ポリシーを作成して追加することも可能です。
「許可を追加」を押下します。
![スクリーンショット 2024-10-30 131152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/d5ca2d18-d928-843a-4da3-e69f9037237d.png)
任意のロール名を記入し、ロールの作成を押下します。

これでロールの作成は完了です。
続いて作成したロールをEC2に付与(アタッチ)を行います。
AWSマネジメントコンソールでEC2と検索します。
対象のEC2を選択し右上の「アクション」→「セキュリティ」→「IAMロールを変更」を押下します。
![IAMロール変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/dd03a5f6-0430-4401-1b43-f3919ae24f3e.png)
対象のロールを選択し「IAMロールの更新」を押下するとロールが付与されます。
![ロールを変更(アタッチ).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/5ddd1aee-9fac-b896-f690-2b902f3f1203.png)
EC2の詳細画面でもIAMロールが付与(アタッチ)されていることを確認できます。
![スクリーンショット 2024-10-30 140517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/54a810af-0484-e760-6399-fe5058250bb6.png)


これでEC2へのアクセス権限の付与作業は完了です。
続いてEC2_AからS3にファイルのアップロードを行います。
## ②EC2_AからS3へのアップロード
TeraTarmでSSHでEC2_Aにログインします
EC2_Aでアップロードコマンドを入力します。
```
aws s3 cp ローカルのファイル名 s3://バケット名/フォルダ名 
```
以下はカレントディレクトリからTest.txtをS3のHogeFuga_bucketのTempにコピーした出力サンプルです。
※ローカルのファイルをフルパスで指定することも可能です
```ruby:コマンド・出力例
aws s3 cp ./Test.txt s3://HogeFuga_bucket/Temp/
upload: ./Test.txt to s3://HogeFuga_bucket/Temp/Test.txt
```
Test.txtがアップロードできているのが分かります。

カレントディレクトリのすべてのオブジェクトをS3のにコピーする方法は以下になります。
```
aws s3 cp ローカルのディレクトリ名 s3://バケット名/フォルダ名 --recursive
```
※--recursiveオプション：フォルダ階層を含むすべてのファイルやサブディレクトリに対してコピーコマンドを適用します。
ここではフォルダ構造をそのままS3にコピーしています。出力サンプルは以下になります。
```ruby:コマンド・出力例
aws s3 cp ./ s3://HogeFuga_bucket/Temp/ --recursive
upload: ./Test.txt to s3://HogeFuga_bucket/Temp/Test.txt
upload: ./Test_2.txt to s3://HogeFuga_bucket/Temp/Test_2.txt
upload: ./Test_3.txt to s3://HogeFuga_bucket/Temp/Test_3.txt
upload: ./Test_4.txt to s3://HogeFuga_bucket/Temp/Test_4.txt
upload: ./Test_5.txt to s3://HogeFuga_bucket/Temp/Test_5.txt
```
S3へのアップロード手順はこれで完了です。
続いてS3からEC2_Bにファイルをダウンロードするやり方ります。
## ③S3からEC2_Bへのダウンロード
TeraTarmでSSHでEC2_Bにログインします
EC2_Bでダウンロードコマンドを入力
```
aws s3 cp s3://バケット名/フォルダ名/ファイル名 ローカルのディレクトリ名
```
以下はTest.txtをカレントディレクトリにダウンロードしている出力サンプルです。
```ruby:コマンド・出力例
aws s3 cp s3://HogeFuga_bucket/Temp/Test.txt ./
download: s3://HogeFuga_bucket/Temp/Test.txt to ./Test.txt
```
ダウンロードができていることが分かります。
ダウンロード時にも--recursiveオプションをつけることでディレクトリ内のすべてのファイルやサブディレクトリをダウンロードすることも可能です。

すべての作業が完了したら、EC2に付与したロールを削除します。


## ④EC2_AとEC2_BのS3のアクセス権限を削除(IAMロールのデタッチ)
対象のEC2を選択し、右上のアクション→セキュリティ→IAMロールを変更を押下します。
![IAMロール変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/91e0b224-3df2-eb55-b972-844cfd237542.png)


IAMロールの変更画面で「IAMロールがありません」を選択し「IAMロールの更新」を押下します。
![IAMロールのデタッチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/6069e0bc-15f7-2b5e-b098-ed7e7487989c.png)
IAMロールをデタッチするか確認されますので入力フィールドに「デタッチ」と入力して
デタッチを押下するとIAMロールがデタッチされます。

![デタッチ確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/c8842035-2a3b-2e8c-9bc0-bde5166ac535.png)
EC2の詳細画面でもIAMロールがデタッチされたことを確認できます。
![EC2詳細デタッチ確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677761/8c6ddc24-6f56-7095-61f3-f1898baad313.png)


## おわりに
使う状況はあまりないかもしれませんが、AWS環境からファイルをローカルに移す必要がないため、使いやすい手順だと思いました。