風の強い時期ですが、学習を振り返りです。10月はSQL、Railsに対するインプット月間でしたが、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と連携が取れます。)