Active StorageでCloudinaryに画像を上げ、Herokuに公開した話

# 経緯
多くの人はAWSのS3を用いるところだと思いますが、諸事情により登録できない状態だったため、FreeプランがあるCloudinaryを使用することにしました。

# 前提
本RailsアプリではActive Storageを使用しています。Active Storageの詳しい内容は[こちら](https://railsguides.jp/active_storage_overview.html)になります。
この記事はActive Storageでアプリを作っていることが前提です。

## 環境
Ruby:3.2.1
Rails:7.0.0
Docker

# 準備
Gemfileに以下の内容を追記し、コマンドを実行
```Gemfile
gem 'activestorage-cloudinary-service' # Cloudinary と Active Storage の連携をする
gem 'cloudinary', require: true # Cloudinary
```

```
docker-compose run web bundle install
```
これでGemfileを更新が完了したので、Dockerをビルドしておきましょう
```
docker-compose build
```
続いて、ファイルをCloudinaryに保存する設定を行います。
```config/environments/production.rb
Rails.application.configure do
  config.active_storage.service = :cloudinary
end
```

```config/storage.yml
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

cloudinary:
  service: Cloudinary
  cloud_name: <%= Rails.application.credentials.dig(:cloudinary, :cloud_name) %>
  api_key:    <%= Rails.application.credentials.dig(:cloudinary, :api_key) %>
  api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>
```

[こちら](https://qiita.com/ttexan/items/a1004121e806c477d030#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)を参考にcloudinary.ymlをダウンロードし、``config``ディレクトリ直下に配置し、以下のように書き換える。

```config/cloudinary.yml
development:
  cloud_name: <%= Rails.application.credentials.dig(:cloudinary, :cloud_name) %>
  api_key:    <%= Rails.application.credentials.dig(:cloudinary, :api_key) %>
  api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>
  enhance_image_tag: true
  static_file_support: false

production:
  cloud_name: <%= Rails.application.credentials.dig(:cloudinary, :cloud_name) %>
  api_key:    <%= Rails.application.credentials.dig(:cloudinary, :api_key) %>
  api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>
  enhance_image_tag: true
  static_file_support: false

test:
  cloud_name: <%= Rails.application.credentials.dig(:cloudinary, :cloud_name) %>
  api_key:    <%= Rails.application.credentials.dig(:cloudinary, :api_key) %>
  api_secret: <%= Rails.application.credentials.dig(:cloudinary, :api_secret) %>
  enhance_image_tag: true
  static_file_support: false
```
Rails.application.credentials は、鍵の管理を行うために、Rails 5.2 から登場した機能です。

鍵の情報は、config/credentials_yml.enc に暗号化されて保存されています。
次のコマンドで編集をします。

```
docker-compose run -e EDITOR=vim web rails credentials:edit
```
編集画面では以下の内容を追記してください。
```
cloudinary:
  cloud_name: (cloudinaryに付けた任意の名前)
  api_key: (cloudinaryより指定された15桁の数字)
  api_secret: (cloudinaryより指定された27桁の英数記号)
```


# Herokuの準備
以下のコマンドでHerokuにログインし、アプリを作成します。
```
heroku login
heroku create 'アプリ名'
```
次のコマンドで必要なアドオンを追加します
```
heroku addons:create heroku-postgresql:mini
heroku addons:create cloudinary:starter
```
Herokuにアプリをプッシュし、master.keyの内容を登録します。
```
git push heroku main
heroku config:set RAILS_MASTER_KEY="++++++" #config/master.keyの中身
```
最後に、マイグレーションを実行し、必要ならばseed.rbを実行します。
```
heroku run rails db:migrate
heroku run rails db:seed
```
# 参考資料
[Cloudinary + Rails 画像アップロード](https://qiita.com/ttexan/items/a1004121e806c477d030)
[Active Storageで複数画像をCloudinary に上げ Herokuに公開する](https://zenn.dev/atelier_mirai/articles/755c626f04737c)
[]()