【Railsチュートリアル】S3に画像をアップロードする設定【13章課題】

# S3に画像をアップロードする

[13.4.4 本番環境での画像アップロード](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-image_upload_in_production)

> 13.4.3で実装した画像アップローダーは、開発環境で動かす分には問題ないのですが、本番環境には適していません。これはリスト 13.67のstorage :fileという行によって、ローカルのファイルシステムに画像を保存するようになっているからです23。本番環境では、ファイルシステムではなくクラウドストレージサービスに画像を保存するようにしてみましょう24。
***
> 世の中には多くのクラウドストレージサービスがありますが、今回は有名で信頼性も高いアマゾンの「Simple Storage Service (S3)25」を使います。セットアップの手順は次のとおりです。

> Amazon Web Servicesアカウントにサインアップする
> AWS Identity and Access Management (IAM)でユーザーを作成し、AccessキーとSecretキーをメモする
> AWS ConsoleからS3 bucketを作成し (bucketの名前はなんでも大丈夫です)、2.で作成したユーザーに対してRead権限と> Write権限を付与する
> (S3のセットアップはやや高度です。コラム 1.1の考え方をうまく活用してみてください。)
***
> 特に、Herokuのファイルストレージは一時的なので、デプロイする度にアップロードした画像が削除される仕様になっています。

Railsチュートリアルで、画像を扱うアプリケーションを本番環境でデプロイする項目があります。

S3とIAMの連携で検索しても、画面キャプチャが古いものしか見つからなかったので、自分で記事を書くことにします。

# IAMユーザーの作成

<img width="1177" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/4d2271e0-0fde-dd64-b294-d5cbe79c39b1.png">

AWSの管理コンソールにログインしたら、IAMというサービスのコンソールを開きましょう。

<img width="1256" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/253a1f44-3f78-cbd9-c91b-0abfcfc3d98b.png">

「ユーザー」>「ユーザーを追加」を選択します。

<img width="1575" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/b4f5614a-baed-edbc-5529-06c8a8877887.png">

ユーザー名を入力します。
アクセス権限は「プログラムによるアクセス」を選択します。

<img width="1617" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/735892e3-7653-f26c-7d1c-21edca270b3a.png">

グループ名を入力します。
ポリシーは「AmazonS3FullAccess」のみを選択します。

<img width="1612" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/9474e435-59b7-066b-d36e-a779b1ae71ad.png">

設定があってるか確認しましょう。

<img width="1623" alt="IAM_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/8676b94c-0d24-f782-e69c-65b9dac4fc6a.png">

最後にアクセスキーとシークレットキーのcsvをダウンロードしましょう。
csvの再ダウンロードはできないので、無くさないように

# S3の設定

<img width="1607" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/d9b0cb29-17d6-ce83-5caa-4b0b708c44e4.png">

IAMの設定が完了したら、次はS3の設定です。
S3に管理コンソール画面を開いたら、「バケットを作成する」を選択します。

<img width="692" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/7f668539-4412-4aca-fb5f-c00908833ccb.png">

名前を入力します。既に使われている名前は使用することができません。
リージョンは東京を選択します。

<img width="683" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/49e64056-2d20-23ab-99f3-c6ef059eb571.png">

ここはデフォルト設定で問題ありません。

<img width="687" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/e3e1a8cc-c064-a7f0-0e2d-3430252e5199.png">

「オブジェクト」「オブジェクトのアクセス許可」の読み込み、書き込みにチェックを入れましょう。
他はデフォルト設定です。

<img width="688" alt="S3_Management_Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/142918/bd031663-6d17-db23-6fe1-09bfed5bd359.png">

最後に設定があっているか確認しましょう。

# Herokuの環境変数を設定

ここまで完了したら、あと一息です。
Herokuの環境変数を設定しましょう。

```
$ heroku config:set S3_ACCESS_KEY="ココに先ほどダウンロードしたAccessキーを入力"
$ heroku config:set S3_SECRET_KEY="同様に、Secretキーを入力"
$ heroku config:set S3_BUCKET="S3のBucketの名前を入力"
$ heroku config:set S3_REGION="ap-northeast-1"
```

これでデプロイしたRailsアプリケーションを起動して見ましょう。
画像を投稿して、S3バケットを確認して、新しく画像が保存されていたら、成功です!
お疲れ様でした!!

# 参考資料

[Amazon S3 再入門 – AWS IAMでアクセスしてみよう！(Cyberduck 編)](https://cloudpack.media/5726)
[35歳だけどRailsチュートリアルやってみた。[第4版 13章 13.4 マイクロポストの画像投稿 まとめ&解答例]]
(https://qiita.com/yokoyan/items/f29620b11efd5ca31f19#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99aws%E3%81%AEiam%E8%A8%AD%E5%AE%9A)