【Rails6】Action Textでアップロードする画像の保存先をAmazon S3やGCSに変更する方法を解説

今回はAction Textでアップロードする画像の保存先をAmazon S3やGCSに変更する方法を解説します。

前回はRails6の新機能「Action Text」の導入方法をサンプルコード付きで解説しました。
まだAction Textを導入できていないという方は、以下のリンクを参考にして導入してみてください。

【Rails6】Action Textの導入方法をサンプルコード付きで解説
https://www.autovice.jp/articles/36

デフォルトの保存先

前回はAction Textをただ導入しただけなので、Action Textでアップロードする画像の保存先はローカルになっています。
app/config/environments/development.rbを見てください。
...
  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :local
...
ここでActive Storageの設定を行っています(Action Textは画像のアップロードにActive Storageという機能を使っています)。
次に、app/config/storage.ymlを見てください。
...
local:
  service: Disk
  root: <%= Rails.root.join("storage") %>
...
ここでローカルの保存先について設定しています。
このあたりの設定を変更して、画像の保存先をAmazon S3やGCSに変更していきます。

前提

  • AWSに登録済み、IAMとバケット作成済み
  • GCPに登録済み、サービスアカウントとバケット作成済み
ここらへんはそのうちまとめたいと思います。

Amazon S3

まず、Amazon S3のGemをインストールします。
Gemfileに以下を追記し、bundle installを行います。
...
gem 'aws-sdk-s3', require: false
インストールできたら、次に設定ファイルを変更していきます。
一部、開発環境と本番環境で変更する設定ファイルが異なります。
「開発環境ではローカルに保存」、「本番環境ではクラウドストレージに保存」とするのが一般的かと思います。

開発環境の設定を変更する場合、app/config/environments/development.rbを、本番環境の設定を変更する場合、app/config/environments/production.rbを以下のように変更します。
...
  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :amazon
...
次に、app/config/storage.ymlを以下のように変更します。
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
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: <バケットのリージョン>
  bucket: <バケットの名称>
amazonのコメントアウトを外し、各パラメーターを以下の通り変更します。
  • service:S3
  • access_key_id:Credentialsで設定(後述)
  • secret_access_key:Credentialsで設定(後述)
  • region:バケットのリージョン
  • bucket:バケットの名称
アクセスキーやシークレットキーは外部に漏れると不正使用される可能性がありますので、必ずCredentialsを使って設定します。
なお、dotenvというGemを使って環境変数(ENV)に設定するという方法もありますが、Credentialsの使用を推奨されているので今回は説明しません。

Credentialsを設定するには以下のコマンドを実行します。
$ cd ~/Product/test_app/

$ EDITOR=vi rails credentials:edit
 aws:
   access_key_id: <アクセスキー>
   secret_access_key: <シークレットキー>
awsのコメントアウトを外し、アクセスキーとシークレットキーを設定します。
Credentialsが保存されない場合、後述の「Credentialsが保存されない場合」を参照してください。

Amazon S3の設定は以上です。

GCS

まず、GCSのGemをインストールします。
Gemfileに以下を追記し、bundle installを行います。
...
gem 'google-cloud-storage'
インストールできたら、次に設定ファイルを変更していきます。

開発環境の設定を変更する場合、app/config/environments/development.rbを、本番環境の設定を変更する場合、app/config/environments/production.rbを以下のように変更します。
...
  # Store uploaded files on the local file system (see config/storage.yml for options).
  config.active_storage.service = :google
...
次に、app/config/storage.ymlを以下のように変更します。
# Remember not to checkin your GCS keyfile to a repository
google:
  service: GCS
  project: <プロジェクト名>
  credentials: 
    type: 
    project_id: 
    private_key_id: <%= Rails.application.credentials.dig(:gcs, :private_key_id) %>
    private_key: <%= Rails.application.credentials.dig(:gcs, :private_key).dump %>
    client_email: 
    client_id: 
    auth_uri: 
    token_uri: 
    auth_provider_x509_cert_url: 
    client_x509_cert_url: 
  bucket: <バケットの名称>
googleのコメントアウトを外し、各パラメーターを以下の通り変更します。
  • service:GCS
  • project:プロジェクト名
  • credentials:GCSからダウンロードしたJSONファイルに記載されている各パラメーター
    • private_key_id:Credentialsで設定(後述)
    • private_key:Credentialsで設定(後述)
      • 必ず末尾に「.dump」をつける
  • bucket:バケットの名称
Credentialsを設定するには以下のコマンドを実行します。
$ cd ~/Product/test_app/

$ EDITOR=vi rails credentials:edit
gcs:
  private_key_id: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  private_key: "-----BEGIN PRIVATE KEY-----\nXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..."
gcsを追加し、プライベートキーIDとプライベートキーを設定します。
プライベートキーは値に改行コード(\n)が含まれているので、必ずダブルクォーテーション("")で囲みます。

GCSの設定は以上です。

Credentialsが保存されない場合

ときどき以下のコマンドを実行してもCredentialsが保存されないことがあります。
$ EDITOR=vi rails credentials:edit
そのときは以下のコマンドでCredentialsを設定します。
$ EDITOR="code --wait" rails credentials:edit
codeはVisual Studio Code(VSCode)の起動コマンドですので、VSCodeをインストールしていない人はインストールしてください。

まとめ

Action Textでアップロードする画像の保存先をAmazon S3やGCSに変更する方法を解説しました。
昨今はクラウドストレージを使うのが当たり前になっているので、ぜひ導入してみてください。