fv17の日記 - Coding Every Day

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

TOPページ

本ブログ記事、および外部ブログ記事等のリンクまとめ

バックエンド

Rails

例外処理

フロントエンド

React

学習リソース

インフラ

チーム

スクラム

その他

Git

webpack

CI/CD

Blocked hostエラー@Rails6から導入された「DNSリバインディング攻撃からの保護」について

HerokuにRails6アプリをデプロイしたところ、下記のエラーが表示された。調べてみたところ、Rails6から導入された「DNSバインディング攻撃からの保護」関連のエラーとのこと

Blocked host: hoge.herokuapp.com

To allow requests to hoge.herokuapp.com, add the following to your environment configuration:
config.hosts << "hoge.herokuapp.com"

リリース情報

Rails6 リリースノート
https://railsguides.jp/6_0_release_notes.html#railties-%E4%B8%BB%E3%81%AA%E5%A4%89%E6%9B%B4

GitHub Pull Request
https://github.com/rails/rails/pull/33145

DNSバインディング攻撃とは?

下記が分かりやすかった
https://www.gsx.co.jp/tts/activity/110111.html

対策するためには、リクエスト元のHostを確認すれば良いとのこと。なるほど

Docker環境構築 - Rails6 + postgresql 12.3

参考

Quickstart: Compose and Rails | Docker Documentation
Dockerを使ってRails6環境の構築をしてみる - Qiita
RailsアプリをDockerで作ってCircleCIで自動テストしてHerokuにデプロイした話 - Qiita

メモ

Docker 公式Docの方法はRails5までの対応で、Rails6になると次の対応が必要

  • Rails6からwebpacker利用のため、Dockerfileでyarnのinstallが必要
  • postgresqlでパスワード設定をしないと起動できない仕様変更が入ったため、それの対応

やっといた方がよいこと

  • 公式DocやQiita記事だとバージョン指定していないことが多いが、した方が良い(ruby rails postgres etc...)
  • 勝手にバージョンが上がることを防げるし、最新バージョンだと依存関係問題が発生しがちなので回避できる

2020年5月現在で気になること

  • Rubyはバージョン2.6.6指定の方が良さそう。理由は2.7になるとキーワード引数等に大きな変更があり、未対応gemがありそうなため。ただし、徐々に対応されてくるはずなので、将来的には上のバージョン指定で良い

エラーと解決方法

docker-compose up 時に Yarn まわりでエラー

web_1  | ========================================
web_1  |   Your Yarn packages are out of date!
web_1  |   Please run `yarn install --check-files` to update.
web_1  | ========================================

解決方法

  # Write in config/environment/development.rb 

  # Disable yarn integrity
  config.webpacker.check_yarn_integrity = false

Railsのバージョンアップ方法

この記事は何?

Railsのバージョンアップ方法について

対象読者

  • はじめてRailsのバージョンアップをする方
  • Railsのアップデート方法を学びたい方

参考資料

大まかな手順

Rubyのバージョンを上げる

下記よりもRubyのバージョンが低い場合は、事前にRubyのバージョンを上げる

Rails 6: Ruby 2.5.0以降が必須です。
Rails 5: Ruby 2.2.2以降が必須です。

(引用元)公式ドキュメント

バージョンアップによる変更点の概要を知る

公式ドキュメントのリリースノートやチェンジログを読み、変更点の概要を知る
Rails 5.1からRails 5.2へのアップグレード などとまとめられている https://railsguides.jp/upgrading_ruby_on_rails.html

Railsのバージョンを上げる

- gem 'rails', '5.1.x.x'
+ gem 'rails', '5.2.x.x'

古いgemを洗い出す

Railsと依存関係にあるgemのうち、アップデート後のバージョンと依存関係が合わないgemを洗い出す

bundle update --conservative rails

Bundler could not find compatible versions for ...などとエラーが出る
gemが依存しているRailsのバージョンが古いとエラーになる

gemのUpdate

dependabotを使うなどして、エラーが出力されたgemのアップデートを行う
あるいは、Rails Updateのタイミングで利用するgemをすべて最新にするでもOK

(注意)
gemが特定のRailsのバージョンまでしか対応しておらず、保守運用されていないことがある
その場合は、updateしても解決しないためgemを使わないように対応が必要

設定ファイルの新規作成や変更

アップデート後のRailsに必要な設定ファイルや記述を作成する

rails app:update

新規作成されたり、既存ファイルに変更が入るため、差分をチェックして問題ないことを確認し、必要分を選択してマージする

※ バージョンアップ後のRailsで導入されたgemは自動で追加してくれないので、必要に応じて対応 railsdiff.orgを参考にして、新しく追加されたgem等を確認する

Railsをバージョンアップ

4.の手順だけではまだ新しいバージョンが反映されてない config/application.rbにある config.load_defaults で設定を変更

- config.load_defaults 5.1
+ config.load_defaults 5.2

エラーに対応する

(1) RSpecを実行すると大量にエラーが吐き出されるはずなので対応

バージョンアップすると様々な変更箇所が反映され、テストが失敗する
エラー内容、下記のChange logなどを確認しながら対応する
https://railsguides.jp/5_2_release_notes.html

(2) new_framework_defaults_x_x.rbで設定が変更された箇所を確認し対応

4.の手順でconfig/initializers直下に new_framework_defaults_5_2.rb といったファイルが新規作成される。このファイルにはバージョンアップで大きく挙動が変更される箇所の一覧が記載されている。

このファイルでは、下記ができる
- 仕様変更の確認
- 旧バージョンの挙動の引き継ぐ設定

内容を確認し、最新バージョンに対応させる、または旧仕様を引き継ぐことでエラー解消する。コメントアウトされているのは、バージョンアップ後の仕様で、旧バージョンの仕様を引継ぎたい場合はコメントアウトを外し、booleanの値を反転する必要がある。

new_framework_defaults_x_x.rb については下記が詳しい https://qiita.com/jnchito/items/cce3b2795e1c66735310

また、コメントアウトされている場合にも バージョンアップ直後は旧バージョンのままでの運用を推奨 などと書かれている場合もあるので注意が必要

最後にSTG環境で手動確認

最後は手で色々叩いて確認する
画面上でのログイン、主要機能に加えて、APIなども一通り叩いて確認
specの記載漏れや、情報がほぼないような箇所でコケてたりするので抜かり無く!

本番環境へデプロイ

多分エラーが出る
そのため、revertコミットを事前に準備するなどして緊急時にもすぐ戻せる万全の体制でデプロイ

5.2へのUpdateでハマった箇所、ポイント

CSRF対策(protect_from_forgery)がデフォルトでActionController::Baseに移行

# Add default protection from forgery to ActionController::Base instead of in
# ApplicationController.
# Rails.application.config.action_controller.default_protect_from_forgery = true

従来ApplicationControllerに設定されていた protect_from_forgeryActionController::Baseに移行された。APIのcontroller等でActionController::Baseを継承していたりすると落ちるため、ActionController::APIを継承したり、skip_before_action :verify_authenticity_tokenを足したりする対応が必要

Rails Updateに向けて普段から気をつけること

下記を普段から意識するとRails Updateがより簡単になる

  • Dependabotなどを導入し、gemのバージョンを最新に保つ
  • DeprecatedなどのWarningは、放置せずに対応する
  • gemを使う場合、保守運用されるものを使う
  • テストはしっかり書くべし

など

ゼロからのDocker入門

この記事は何か

Dockerを全く知らない段階から、下記を目指すためのロードマップです。

  • Dockerとは何か?全体像を理解する
  • Dockerで開発環境を構築できる
  • 開発現場で既存のDockerfileやdocker-compose.ymlを理解し、編集できる
  • その先にあるKubernetesAWSなどに興味を持つ

TLDR

公式Docのチュートリアルをやると理解が捗ります。
https://docs.docker.com/

英語の文章を読むのが辛い時は

最近話題のDeepLで翻訳すると日本語で読めます。
英語は読めるが日本語の方が理解が早いという方も是非。
https://www.deepl.com/translator

Dockerとは

Docker overview | Docker Documentation

Dockerが従来の仮想化ソフトウェアよりも優れている理由

  • 軽量である(容量が小さい)
  • 高速である(起動や処理が早い)

軽量、高速である理由は下記を参考にしてください。

Dockerを導入するメリット

  • 開発環境構築が簡単になる
    • Dockerfileやdocker-compose.ymlを用いて、開発環境をコード管理できます
    • プログラミング言語やデータベースの手動での導入...といった煩わしい作業から開放されます
  • 開発環境を簡単に共有できる
    • コード管理された開発環境のため、バージョン差異なく簡単に共有、構築ができます
    • そのため、新規参加メンバーが環境構築で失敗、躓くことがなくなります
    • また、PC購入時やデスクトップとノートPCの使い分けの際にも、楽に環境構築ができます
  • 開発環境を簡単に実行できる
    • docker-composeにより、1コマンドでアプリケーション全体の起動を行えます
    • そのため、アプリケーションやデータベースなどをそれぞれ実行する手間が省けます
    • また、Railsは起動したけど、PostgreSQLの起動し忘れた...などの問題を防げます
  • テスト環境や本番環境の構築も楽になる
    • ローカルの開発環境と同じ環境を簡単にCircle CIやAWS上に作ることができます
    • そのため、ローカルではテスト通るけど、CIだと落ちてしまうなどの問題を少なくできます
    • ただし、開発環境と本番環境は全く同じであることは少ないため、工夫は必要です

より詳細に
https://docs.docker.com/get-started/#docker-concepts

手を動かして学ぶ

下記リンクのどれか良さそうなものを選び、image、container、volume、docker-compose、networkなどDockerの主要機能や概念について学びます。私は一通りやりましたが、公式Docのチュートリアルが最もコンパクト、過不足なくまとまっており分かりやすいです。

オススメ
- Orientation and setup | Docker Documentation

その他の選択肢
- Dockerでプログラマが最低限知るべきことが、最速でわかるチュートリアル - Qiita
- Linuxコマンドから始めるDocker ~ BE A FIRST PENGUIN AND GROW AS WHALE | Udemy
- ゼロからはじめる Dockerによるアプリケーション実行環境構築 | Udemy
- Docker Deep Dive by Nigel Poulton [Leanpub PDF/iPad/Kindle]

Ruby on Rails + PostgreSQL + Docker環境の構築

WIP

Dockerの次に学ぶこと

WIP

参考文献

  • 公式Doc
    https://docs.docker.com/
    概要、詳細はもちろんのこと、クイックスタート(チュートリアル)やRailsでの利用方法といったSampleも充実しているため、必見です。

  • Docker Deep Dive
    https://leanpub.com/dockerdeepdive
    Amazonレビューが高かったので読みました。説明が丁寧で、各章において概要や背景から入り、その後手を動かしながら詳細を学ぶというスタイル。個人的には冗長に感じてしまう部分も多々ありましたが、全体的に分かりやすいのでオススメです。なお、Amazonの方が安いですがコピー制限がありDeepLで最後まで日本語翻訳できません。leanpubで購入してpdf落とすと制限なく翻訳できます。

Railsでビジネスロジックをどこに書くか?

どのような歴史を辿ったか?

  1. Rails勃興(2004~2005年)

  2. ViewやControllerにビジネスロジックを記述。見通しの悪さが問題に

  3. モデルにビジネスロジックを書くべきという主張(2006年)
    Buckblog: Skinny Controller, Fat Model

  4. Fat Modelが問題。サービスオブジェクトなどModelの責務を切り出す動き(2012年)
    7 Patterns to Refactor Fat ActiveRecord Models - Code Climate
    (日本語訳)肥大化したActiveRecordモデルをリファクタリングする7つの方法 Railsで重要なパターンpart 1: Service Object(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

  5. サービスオブジェクトの間違った運用に警鐘を鳴らす
    俺が悪かった。素直に間違いを認めるから、もうサービスクラスとか作るのは止めてくれ - Qiita
    Service Objectがアンチパターンである理由とよりよい代替手段(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

その他参考
Railsのファットモデル問題に対処する前に読んでほしい記事 - Qiita
中規模Web開発のためのMVC分割とレイヤアーキテクチャ - Qiita Ruby on Railsの正体と向き合い方 / What is Ruby on Rails and how to deal with it? - Speaker Deck

Railsのアセットパイプラインについて

自分用メモ

参考

アセットパイプライン - Railsガイド

実装

  • メイン

sprockets-rails gem

  • 関連gem

gem 'sass-rails' gem 'uglifier' gem 'coffee-rails'

機能

  • アセットを連結

ブラウザがWebページをレンダリングするためのリクエスト数を減らし、速度向上

  • アセットの最小化(圧縮)

CSSのホワイトスペースとコメントを削除。JSは少し複雑

  • より高級な言語を使用したコーディングのサポート

CSSに代わるSass、CSS/JavaScriptに代わるERB

使用方法

  • アセットの置き場

app/assetsディレクト