HerokuにAWSのS3を導入する方法(Rails)

# HerokuにS3を導入して、画像の永続化をできるようにするための手順を紹介します！（学習記録）:city_dusk:

#### HerokuにS3を導入するメリット
投稿機能がついているアプリケーションは画像を保存する機能が必要になる場合があり、herokuでは画像の永続化はできず、ある一定の時間で表示されなくなってしまします。それを回避するためにAWSのS3を利用します！

#### S3を利用する際のセキュリティー対策
AWSを利用する際、セキュリティー対策は必需です。もし、AWSのアカウントID・パスワード・アクセスキーなどの情報が漏れてしまうと、サービスを不正利用され、高額な利用料を請求されてしまう危険性があるためです。
主にこのようなセキュリティー対策の例として、ログインを二段階に設定（二段階認証）、利用制限付きのユーザーを使用（IAMユーザー）、保存機能にアクセス制限を設定（バケットポリシー ）さらにGitHubでのソース管理においてもセキュリティー対策などです。このGitHubでのソース管理には、秘密情報を変数に代入して使用（環境変数）、git-secretsを使った秘密情報を誤操作でコミットしないよう防止する機能があります。

#### S3の初期設定
1.AWSアカウント作成
2.IAMユーザーを作成
3.IAMユーザーでログイン
4.二段階認証を設定をして、セキュリティー対策（ルートユーザーに戻り携帯の二段階認証を行うためのアプリと連携、IAMユーザーにも同じ設定（詳しくは割愛））

### S3で保存先を作成
S3ではバケットという概念がり、ここに自分のデータを保存します。そして、リージョンと呼ばれるAWSの施設に保管されます。
1.ルートユーザーでS3を開きバケットを作成
2.バケット名、リージョンを指定、アクセス許可を設定
3.バケットポリシーを使用してアクセス制限
バケットポリシーとはバケットに対して、どのようなユーザーが、どのような処理をできるか取り決めをするものです。
4.IAMユーザーからユーザーARMをコピー
5.S3のバケット名をクリックし、アクセス許可をクリック、編集ボタンをクリック
6.ポリシー欄にコードを記入

```
{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "①"(先ほどコピーしたユーザーのARN)
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::②"（作成したバケット名）
       }
   ]
}
```
7.変更の保存をクリック


#### ローカル環境でS3を利用する
1.まずはGemを導入します！

```
gem "aws-sdk-s3", require: false

# bundle install
% bundle install
```

2.development.rbを編集

```
# before
config.active_storage.service = :local
# after
config.active_storage.service = :amazon
```

3.storage.ymlを編集

```
amazon:
 service: S3
 region: ap-northeast-1
 bucket: ご自身の「バケット名」を入力
```

#### 環境変数を設定し、セキュリティー対策
1.ダウンロードしてある、newから始まるcsvファイルを開き、Access key IDとSecret access keyを確認
2.環境変数を設定するファイルに記述

```
# 開く
% vim ~/.zshrc

# 記述
export AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"
export AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"

# 読み込み
% source ~/.zshrc

#storage.ymlを編集
 #config/storage.ymlファイル
# 追記
 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key:  <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
```

#### git-secretsを設定して、セキュリティー対策
git -secretsとはAWSが公開しているツールです！

```
% cd ~/ #ホームディレクトリに移動
% brew install git-secrets

% cd アプリケーション名 #開発中のアプリに移動
% git secrets --install
```

#### git-secretsの条件を設定
「Access key ID」「Secret access key」など、アップロードしたくないAWS関連の秘密情報を一括で設定します。

```
git secrets --register-aws --global

# 確認
git secrets --list

# GitHubDesktopなどを使っている場合

% sudo cp /usr/local/bin/git-secrets /Applications/GitHub\ Desktop.app/Contents/Resources/app/git/bin/git-secrets
```

#### 今後作成する全てのリポジトリにも適用

```
% git secrets --install ~/.git-templates/git-secrets
% git config --global init.templatedir '~/.git-templates/git-secrets'
```

#### 実際にローカル環境で画像を投稿し、IAMユーザーでログインし、S3バケットを開く
1.オブジェクトという項目に保存されていることを確認


### Herokuにも適用させる

```
# config/environments/production.rb

# before
config.active_storage.service = :local
# after
config.active_storage.service = :amazon
```

#### Herokuの環境変数に登録
```
% heroku config:set AWS_ACCESS_KEY_ID="CSVファイルのAccess key IDの値を貼り付け"(開発中のアプリ内)

% heroku config:set AWS_SECRET_ACCESS_KEY="CSVファイルのSecret access keyの値を貼り付け"

# 確認
% heroku config
```

#### HerokuにPush
```
% git push heroku master

# 正常に動くか確認
	
% heroku apps:info　
# Urlに飛び画像を投稿

```

 ローカル環境と同様S3に保存されていれば完了です！
参考までにどうぞ！！