AWSのS3で本番環境の画像を保存する②Rails、renderでの設定

# Railsの設定
　　
**【gemのインストール】**
下記２つのgemをインストールします。

https://github.com/aws/aws-sdk-ruby

https://github.com/fog/fog-aws

```ruby:Gemfile
gem "aws-sdk-s3", require: false
gem 'fog-aws'
```
`aws-sdk-s3`には`require: false`のオプションを設定します。
```
bundle install
```
　　
**【aws-sdk-s3設定　保存先の変更】**

本番環境画像の保存先をlocalからS3に保存されるように設定を変更します。
```ruby:config/environments/production.rb
config.active_storage.service = :amazon # localからamazonに変更
```
```ruby:config/storage.yml　.envで環境変数を設定する場合
amazon:
  service: S3
  access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>  
  secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %> 
  region: ap-northeast-1 #regionを変更
  bucket: <%= ENV['AWS_BUCKET_NAME'] %> 
  ```
```ruby:config/storage.yml　credentials.yml.encで環境変数を設定する場合
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: ap-northeast-1 #regionを変更
  bucket: your_own_bucket-<%= Rails.env %>
  ```
既にstorage.yml内には設定の記述がされています。この部分のコメントアウトを外します。
`region`はAWSで設定する地域のことです。日本から一番近い地域を選択するので`ap-northeast-1`に変更します。

　　
**【fog-awsの設定　アップローダーの編集】**

```ruby:app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base

  if Rails.env.production?
    storage :fog
  else
    storage :file
  end
```
`if Rails.env.production?`本番環境では、`storage :fog`を使いそれ以外ではfileを使います。
　　
　　
**【carrierwave.rbの編集】**

```ruby:config/initializers/carrierwave.rb
require 'carrierwave/storage/abstract'
require 'carrierwave/storage/file'
require 'carrierwave/storage/fog'

CarrierWave.configure do |config|
    config.storage :fog
    config.fog_provider = 'fog/aws'
    config.fog_directory  = 'バケット名'
    config.fog_credentials = {
      provider: 'AWS',
      aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'],
      aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
      region: 'ap-northeast-1', # リージョン
      path_style: true
    }
end 
```
carrierwave.rbファイルをconfig/initializers配下に作成します。
生成コマンドとかないのか？と思い調べましたが見つからなかったので手動で作成しました。
　　

**【テスト環境の設定】**
　　
開発環境でテストする場合、環境変数を.envファイルで管理します。
```ruby
touch .env #.envファイルを作成
```

```ruby:.env
AWS_ACCESS_KEY_ID=発行したアクセスキー
AWS_SECRET_ACCESS_KEY=シークレットキー
AWS_BUCKET_NAME=バケット名
```

.envファイルはGitHub上にあげないよう、`.gitignore`ファイルに追加しておきましょう。
```ruby:.gitignore
.env
```

追記：アクセスキーとシークレットキーってどこで確認するの？

https://www.multcloud.com/jp/tutorials/s3-key.html

# renderの設定
　　
**【環境変数を読めるよう設定】**

　　
先ほど.envファイルで環境変数を設定しましたが、.envファイルは.gitignoreに載せているので本番環境には読み込まれていません。
renderで改めて設定する必要があります。
[![Image from Gyazo](https://i.gyazo.com/396d19a6fae8a672e9f7bb2340731bb1.png)](https://gyazo.com/396d19a6fae8a672e9f7bb2340731bb1)

設定したいアプリ名を開く→Environment　→SecretFiles

Filenameに.env
Contentsのバーをクリックするとファイルが開かれるので、Railsで設定した.envファイルと同じように記述します。


[![Image from Gyazo](https://i.gyazo.com/eee3d8267475e0173a9023ad2faaaea7.png)](https://gyazo.com/eee3d8267475e0173a9023ad2faaaea7)
画像は記入例でちょっと違うところがありますので参考までに。

　　
**【補足】**
　　
.envファイルで秘匿情報を管理する場合、.envを読み込むためのgemが必要になります。入っていない場合、renderでも.envファイルを読み込めません。

```ruby:Gemfile
gem 'dotenv-rails'
```
`dotenv-rails`は、Railsアプリケーションで環境変数を扱うためのgemです。このgemは、.env ファイルを作成し、その中に環境変数を定義することで、Railsアプリケーション内でこれらの環境変数を利用できるようになります。



# 関連記事

https://qiita.com/joinus_ibuki/items/050816c83234837167bc