Railsアプリで画像の保存先をS3に変更する。その1

## はじめに
画像を保存する機能を持つアプリでは、アプリのディレクトリ内に画像が保存されていました。
今回の記事では画像の保存先をS3に変更してみます。

## バケットを作る
バケットとは、S3で画像が保管される場所のことです、まずはバケットというものを作りましょう。
まずはAWSにアクセスし、サービスからS3を選択します。
![スクリーンショット 2020-06-10 12.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/207b8c06-22c8-d32d-555e-47c70fb0de4e.png)
遷移先でバケットを作成します。
![スクリーンショット 2020-06-10 12.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/84c11adf-742f-faf8-888e-fb5a9c89ec83.png)
バケットの名前を入力しましょう。この名前は一意になる必要があるため、アプリ名+数字といった名前がおすすめです。
![スクリーンショット 2020-06-10 12.41.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/14c3012a-7597-14b2-4b42-e95def83ab7b.png)
この画面は編集不要なので「次へ」を押下しましょう。
![スクリーンショット 2020-06-10 12.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/536a7d1e-a29d-a1dd-fcc8-c9f6a177767d.png)
次の画面で赤枠ないのチェックボックスにチェックを入れます。
![スクリーンショット 2020-06-10 12.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/30df2f77-5923-da53-4530-9e43698f2a6e.png)
バケットを作成をクリックして完成です！
![スクリーンショット 2020-06-15 20.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/6d30b85e-fb0f-090a-337f-54263bef3548.png)

## IAMユーザー
「AmazonS3FullAccess」の権限を与えたIAMユーザーのARNを取得しておきましょう。
下記画像の赤枠をクリックすれば取得できます。
![スクリーンショット 2020-06-15 20.44.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/d9fdd0cb-d26b-d2ce-08da-981df9cd074e.png)

## バケットポリシーの設定
続いてバケットポリシーの設定です。
先ほど作ったバケットをクリックしてポリシーの設定画面に進みましょう。
![o0SkLpNOwiBNPLV1592221945_1592222053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/193ecc89-5c9c-9aaa-e989-927a87171df9.png)

赤枠内にバケットポリシーを入力します。内容は下記のコードを参考にしてください。
![pDpz7KOQdkFx2kI1592222824_1592222868.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429077/7ffddb4b-308b-db2f-a6ee-507e0409936b.png)

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "ユーザーのARN"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::バケット名"
        }
    ]
}
```
これでバケット関連の設定は完了です。

## 各種設定ファイルの修正
fog-awsをインストールするので、Gemfileに「gem 'fog-aws'」を追記してインストールしましょう。
開発・テスト・本番環境いずれでも使えるようにするため、group ~ end で囲まれていない部分に追記します。

```
~中略〜
gem 'fog-aws' 
```

image_uploader.rbでファイルのアップロードにfogを指定します。
下記のように書くことで、本番環境とローカル環境でアップロード方法を分けることができます。

```
  if Rails.env.production?
    storage :fog
  else
    storage :file
  end
```

次はcarrierwave.rbというファイルを作り、fogのアップロード先の設定を行います。
carrierwave.rbはconfig/initializersの直下に作成してください。
ここでもif文で本番環境の場合とローカル環境の場合で処理を分けています。

```
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
  if Rails.env.production?
    config.storage = :fog
    config.fog_provider = 'fog/aws'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: Rails.application.credentials.aws[:access_key_id],
      aws_secret_access_key: Rails.application.credentials.aws[:secret_access_key],
      region: 'ap-northeast-1'
    }

    config.fog_directory  = 'バケット名'
    config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/バケット名'
  else
    config.storage :file
    config.enable_processing = false if Rails.env.test?
  end
end
```

## 一旦ここまで
近いうちに続きを書きます。

7/27更新
続きを書きました！
[Railsアプリで画像の保存先をS3に変更する。その2](https://qiita.com/ysda/items/fe5942f698ecfcfae839)