kent備忘ログ

お仕事と趣味生活と

11月の振り返り( production環境の設定とS3との連携)

風の強い時期ですが、学習を振り返りです。10月はSQLRailsに対するインプット月間でしたが、10月下旬から11月(12月に突入した今も継続中)ではRailsの課題アプリ制作を行いました。

10月上旬

まず始めに、制作物を本番環境で実行できるようにするため、herokuのアカウント作成とmini dyno・heroku postgresの連携、ターミナル上でのherokuコマンドを学習しました。
  • 続いてrails generateコマンドでモデルとコントローラ・ビューを作成し、DBに登録されているレコードの一覧表示、そこからクリックして詳細ページへの遷移を実装しました。
  • 同時にActive_storageを使用したモデルへの画像カラムの設定と、アクションに応じた画像の紐付けの機能を実装しました。

ターミナル

# Active_storageのインストール
rails active_storage:install
rails db:migrate

# gem "image_processing”をGemfileに記載後、bundle install
❯ docker-compose run --rm web bundle install
                                     ⋮

当初ローカルの開発環境では順調に実装が進み、試験的に用意したDBのデータを、アイテムの名前・説明文や画像等を意図した通りに表示させることが出来ました。

10月中旬

ここで初めて、途中まで制作した課題Railsアプリをherokuにアップロードしました。しかし、ここから本番環境への実装で大きく躓くことになります。
その1、画像ファイルの保存先としてAWS_S3との連携方法を知らなかった事による、本番環境での画像が表示されない問題。
  • この時はまだstorage.ymlやenviroments/production.rbといった環境設定ファイル設定値の記述方法を知らず、app/assets/imageフォルダに添付したテスト用画像をseedデータで流し込みDBに登録しようとした事、本番環境ではこのままデプロイし、(当然ですが)画像が表示されずに悩みました。

ローカルのdockerコンテナとherokuでは開発環境と本番環境の違いがあります。

Rails console

# ローカルのdockerコンテナ

❯ docker-compose run --rm web rails console
irb(main):001:0> Rails.env
=> "development"

# heroku本番環境

❯ heroku run rails console
Running rails console on <デプロイアプリ名>... up, run.1234 (Eco)
Loading production environment (Rails 7.0.6)
irb(main):001:0> Rails.env
=> "production"
  • 時間は掛かりましたが、以下複数のAWS_S3との連携方法を学びました。

credentials.ymlに環境変数を保存、それをマスターキーを使用して読み込む方法 。その上でRailsのdigメソッドを使用してstorage.ymlで呼び出す。

storage.yml

# 当初設定していたCredentials使用時のamazon連携設定

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: <%= Rails.application.credentials.dig(:aws, :s3, :region) %>
  bucket: <%= Rails.application.credentials.dig(:aws, :s3, :bucket) %>

これでheroku本番環境で意図した通り、画像が表示されるようになりました。

10月下旬

その2、production環境向けの設定方法を知らなかった事による、GitHub ActionsのCIと、herokuへのデプロイ両方に対応する環境設定で悩んだ事。
  • heroku本番環境で要求された通りの動作を一通り実装出来たので、GitHubでプルリクエストを作成しようとした際、今度はGitHub Actionsでテストが通りませんでした。

  • 今度はRailsのdigメソッドを使用する方法ではなく、heroku configで環境変数名と値をセットする方法とGithub Actionsのsecretに環境変数名と値をセットする方法を学びました。

aws_s3、heroku、GitHub Actions全対応の設定

# 最終的にcredential情報はheroku configに環境変数名と値をセット  
# GitHub Actionsではsecretsに環境変数名と値をセットする形で提出しました。
# 以下はAWS SDK for Rubyを使用しての呼び出し例

require 'aws-sdk-s3'

# AWS_S3にIAMユーザとしてアクセス  
s3_client = Aws::S3::Client.new(
  region: ENV['AWS_REGION'],
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']
)

# AWS_S3のバケットにある画像ファイルをRailsプロジェクトのpublicディレクトリに取得  
s3_client.get_object(
  response_target: "public/test_image01.jpg",
  bucket: ENV['S3_BUCKET'],
  key: "rails-ec-demoimages/test_image01.jpg"
)

# publicディレクトリに保存した画像をDBの画像カラムにアタッチ  
item.image.attach(
  io: File.open(Rails.root.join("public/test_image01.jpg")),
  filename: "test_image01.jpg"
)
再び、2つのプラットフォームで本番環境の実装が可能となったので課題提出→LGTMを頂けた。

一方で、dotenv-rails gemの存在を知り、Railsアプリ直下の.envファイルに保存できることを学ぶ事となります。(これで開発環境でもS3と連携が取れます。)