Roll With IT

tamakiのIT日記

Fly.io の Volumes から AmazonS3 に乗り換えた

はじめに

Next.js と Rails を使ってオリジナルの Web アプリを開発しています。

github.com

前回の記事で Fly.io の Volumes を外部ストレージに設定しましたが、Amazon S3 に乗り換えることにしました。

shirotamaki.hatenablog.com

今回の記事は、乗り換えた理由と乗り換え後の Amazon S3 の設定手順についてまとめた内容になります。

Fly.io の Volumes の導入を取りやめた理由

当初は Volumes の設定は上手くいき問題ないと思っていましたが、本番環境で写真の保存を繰り返す上で、保存ができないバグが頻繁に発生していました。

原因を調べていく中で「Volumes の選択は適当ではない」との結論に達しました。

公式には「Volumes ダメ!ゼッタイ!」と明示されているわけではありません。これはあくまで私の開発環境に基づく結果です。Fly.io のRails Specialist より頂いた「Rails では Amazon S3、GCS、Microsoft Azure を推奨している」とのアドバイスが決め手となり、Volumes の導入は断念することにしました。

正しい Volumes の構成

まず、Volumes の理解が正しいのか確かめました。

Volumes の構成図 になります。

I would diagram it like this:

fly.io_volumes.png

ここでのポイントは、App1 というひとつの App の枠の中に、VM(Machine) が 2 台存在し、VM は 1 台の Volumes に紐づいているということです。この場合 Volume1,2 と存在しますが、Volues1,2 間は連携されていなく、Volume1 に保存された外部データは Volume2 には存在しません。そのため、App が特定の VM を利用する時、例えば VM1 は Voluse1 に保存したデータしか取り扱うことができません。各々に保存されたデータを取り扱うには、Volume 間で連携できるように別途手配が必要とのことです。

対応策として、mirrorのようなツールを利用し連携を行うことも可能のようですが、Fly.io で試した人はいないとのことです。

Amazon S3 を選択する

バグの原因がわかったところで代替案として、Rails が推奨する方法から選択することにしました。

Active Storage は、Amazon S3Google Cloud Storage、Microsoft Azure Storage などのクラウドストレージサービスへのファイルのアップロードや、ファイルを Active Record オブジェクトにアタッチする機能を提供します。 development 環境と test 環境向けのローカルディスクベースのサービスを利用できるようになっており、ファイルを下位のサービスにミラーリングしてバックアップや移行に用いることも可能です。 Active Storage は、アプリケーションにアップロードした画像の変形や、PDF や動画などの画像以外のアップロードファイルの内容を代表する画像の生成、任意のファイルからのメタデータ抽出にも利用できます

Active Storage の概要 - Rails ガイド

Don't use Disk service unless you put the data on a Volume and are prepared to sync the data between machines If you want to have your active storage data hosted on fly.io, consider using the postgres adapter or MinIO. Of course, you are welcome to use Amazon S3, Microsoft Azure, or Google Cloud Services.

Existing Rails Apps · Fly Docs

データを Volume に保存し VM 間でデータを同期させない場合は、利用はしないようにと書いてあります。代わりに Amazon S3, Microsoft Azure, or Google Cloud Services を選択しましょう。ということです。

決め手となったRails Specialistからのコメントです。

Rails clearly recommends Amazon S3, GCS, and Microsoft Azure for this purpose.

以下、Fly.ioの公式フォーラムでのやり取りです。

community.fly.io

参考

Amazon S3 を設定する

外部ストレージとして選択した Amazon S3 を設定します。

  1. アカウントを新しく作成する

    • 一度解約したアカウントに紐づけているメールアドレス(当時個人のメインアドレスで開設し解約済み)で新たにアカウントを作り直すことはできない。
    • 新しくメールアドレスを作成し新たにアカウントを開設した。
  2. IAM アカウントを作成する

    • IAM アカウント(IAM ユーザーとも呼ばれる) とは、環境(テナント)内で、IAM を使って払い出しが行われる操作アカウントのこと。
    • 作成しただけでは何も行えず、その操作に即した権限を付与することで、付与された権限に応じた操作を実行することができる。
    • IAM とは、AWS サービスの一つで「Amazon Identity and Access Management」の略名。
  3. バケットを作成する

  4. Gemfile に aws-sdk-s3 gem を追加しインストールする

  5. access_key_id、secret_access_key を取得して Rails に設定する

# backend/config/storage.yml

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"
  bucket: "outdoor-heart-sutra-backend-storage"
# backend/config/environments/production.rb

config.active_storage.service = :amazon