超簡単！LaravelでS3を利用する手順

# はじめに

よくあるファイルアップロードの仕組みをLaravelとS3で作ってみたいと思います

# 前提

- Laravel version 5.6 のプロジェクトは作成済み
- AWSアカウントは作成済み


# S3用のIAMを作成

まずはAWSのコンソールの右上から、自分のアカウントをクリックしアコーディオンを開き、「My Security Credentisals」をクリック

![スクリーンショット 2018-09-02 11.16.16.png](https://qiita-image-store.s3.amazonaws.com/0/81308/724482e2-1cfb-454c-496f-f9c67605291c.png)

遷移したら、左側のメニューから「Users」をクリック

![スクリーンショット 2018-09-02 11.17.21.png](https://qiita-image-store.s3.amazonaws.com/0/81308/d7dbd750-64b7-32b7-e3d6-896891ffd27f.png)

遷移したら、「Add User」をクリック

![スクリーンショット 2018-09-02 11.17.35.png](https://qiita-image-store.s3.amazonaws.com/0/81308/7ae20a1d-fd6c-000d-a8af-6780b7b7e76a.png)

遷移したら、「User name」に適当な名前を入力し、「Select AWS access type」は「Programmatic access」を選択し、「Next: Permissions」をクリック

![スクリーンショット 2018-09-02 11.28.46.png](https://qiita-image-store.s3.amazonaws.com/0/81308/da6bd7f2-e89d-0887-fab9-f3f0eb21f427.png)

遷移したら、「Attach existing policies directly」をクリック

![スクリーンショット 2018-09-02 11.29.40.png](https://qiita-image-store.s3.amazonaws.com/0/81308/62801ff7-be9d-9491-6867-79af302dbd51.png)


検索画面が表示されるので、S3を検索し、「AmazonS3FullAccess」にチェックを入れ、「Next: Review」をクリック

![スクリーンショット 2018-09-02 11.30.39.png](https://qiita-image-store.s3.amazonaws.com/0/81308/e30e1a77-375f-37ad-09eb-70d4b5b21ecb.png)


確認画面が表示されるので、「Create User」をクリック

![スクリーンショット 2018-09-02 11.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/81308/258d7d4b-196d-8f40-33b5-544d1f6d7ce0.png)

最後に、Access key IDとSecret access keyが表示されるので、必ずメモすること！

メモしたら「Close」をクリックして、S3のアカウント作成は完了です

![スクリーンショット 2018-09-02 11.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/81308/4c30fb2a-1caa-71f3-3c8f-045e3df66c38.png)

# Bucketの作成

アカウントを作成したら、次はS3でBucketを作成します

S3の画面から、「Create bucket」をクリック

![スクリーンショット 2018-09-02 11.59.52.png](https://qiita-image-store.s3.amazonaws.com/0/81308/723fc6a8-d5bb-ea43-e3ac-eb2f56ac211b.png)

モーダルが表示されるので、「Bucket name」に適当な名前を入力し、Regionは「Asia Pacific(Tokyo)」を選択し、「Next」をクリック

![スクリーンショット 2018-09-02 12.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/81308/85b15c58-8ff6-b1f5-86fa-0e133ce2cc9b.png)

遷移後、オプションを設定するモーダルが表示されます

設定系は要件によりけりですが、もちろん全てオフでも大丈夫です

簡単に各オプションの説明を書いておきます

「Versioning」は保存するファイルを上書きする際に以前のファイルを保持しておくオプションで、誤って上書きして以前のファイルを削除してしまった時に便利なオプションです

「Server access logging」はbucket内の操作に対してログを取ってくれるオプションです

「Tags」はbucketに任意のタグを割り当てることができ、コスト配分レポートなどで利用できるオプションです

「Object-level logging」はオブジェクト毎の操作に対してログを取ってくれるオプションです（Server access loggingとイマイチ違いはわからなかった）

「Default encryption」はデフォルトでアップロードするファイルを暗号化するオプションです

「CloudWatch request metrics」はほぼリアルタイムなメトリクスオプションです

![スクリーンショット 2018-09-02 12.25.35.png](https://qiita-image-store.s3.amazonaws.com/0/81308/ca85d72a-dce0-283c-a572-a39ecc07efee.png)

遷移後、bucketに対してAWSアカウントを紐づけする画面になります

デフォルトで自分のアカウントが入っています

特に他のアカウントを紐づけする必要がなければ、「Next」をクリック

![スクリーンショット 2018-09-02 12.28.16.png](https://qiita-image-store.s3.amazonaws.com/0/81308/1f9f0dad-ea80-e2c0-886c-e4d6e847076e.png)

遷移後、プレビューが表示され問題なければ「Create bucket」をクリックし完了

![スクリーンショット 2018-09-02 12.30.17.png](https://qiita-image-store.s3.amazonaws.com/0/81308/0faa48a7-817b-23af-b240-292f7ef0e49f.png)

# LaravelからS3の利用

## パッケージのインストール

Larave公式が言っている、s3用のパッケージをインストールする

```
 composer require league/flysystem-aws-s3-v3
```

## S3の環境情報を登録

.envファイルに下記情報を追記する

```
AWS_ACCESS_KEY_ID= 上記手順でユーザーを作成した際に表示されたAccess key ID
AWS_SECRET_ACCESS_KEY= 上記手順でユーザーを作成した際に表示されたSecret access key
AWS_DEFAULT_REGION=ap-northeast-1 （東京リージョンで作成したため）
AWS_BUCKET=　上記手順で作成したbucket名
```

## アップロード

### HTMLの作成

```html
<form action="/upload" method="post" enctype="multipart/form-data">
  {{ csrf_field() }}
  <input type="file" name="file">
  <button type="submit">保存</button>
</form>
```

### Controllerの作成

```php
public function upload(Request $request)
{
    $file = $request->file('file');
    // 第一引数はディレクトリの指定
    // 第二引数はファイル
    // 第三引数はpublickを指定することで、URLによるアクセスが可能となる
    $path = Storage::disk('s3')->putFile('/', $file, 'public');
    // hogeディレクトリにアップロード
    // $path = Storage::disk('s3')->putFile('/hoge', $file, 'public');
    // ファイル名を指定する場合はputFileAsを利用する
    // $path = Storage::disk('s3')->putFileAs('/', $file, 'hoge.jpg', 'public');
    return redirect('/');
}
```

### 結果

![スクリーンショット 2018-09-02 18.02.44.png](https://qiita-image-store.s3.amazonaws.com/0/81308/f4ba8b9e-027b-b66c-c27b-f3a32a21cb0c.png)

## ファイルの表示

### Controllerの作成

```php
public function disp()
{
    $path = Storage::disk('s3')->url('hoge.jpg');
    return view('disp', compact('path'));
}
```

### HTMLの作成

```html
<img src="{{$path}}">
```

# さいごに

思ったより簡単でした！

毎回s3を指定するのはめんどくさいなと、、、

S3用に継承してClass作るのが正解なのだろうか？