Slide 1

Slide 1 text

RAILS 5.2 RAILS 5.2 [email protected]

Slide 2

Slide 2 text

この資料について この資料について Rails 5.2のMajor Featuresについて記載したものです 資料は1/15日時点の情報(commit: )を元に作成 されています 562dd04

Slide 3

Slide 3 text

MAJOR FEATURES MAJOR FEATURES Active Storage Redis Cache Store HTTP/2 Early hints support Credentials Default Content Security Policy あと、Bootsnapとkey recycling辺りが入ったり入らなか ったり

Slide 4

Slide 4 text

ACTIVE STORAGE ACTIVE STORAGE ファイルアップロードライブラリ Ginzaでは一度とりあえずネタなので基本情報は割愛 概要は willnetさんの 参照 あとguideももうある ( ので、そちらを見て頂ければと 資料 http://edgeguides.rubyonrails.org/active_storage_ove

Slide 5

Slide 5 text

ACTIVE STORAGE(前回からのアップデート) ACTIVE STORAGE(前回からのアップデート) rails new時にActive Storage用のmigrationファイルを 生成しなくなった Active Storageを使いたい場合、明示的に active_storage:installを実行したmigrationファイ ルを生成する必要がある 使いたいクラウドサービス用のgemを自分でGem leに 指定するのは変わらず必要(aws-sdk-s3、google- cloud-storage等) blobからメタデータを取得する為の機能が入った (ActiveStorage::Analyzer) blobのPreview機能が入った(ActiveStorage::Preview)

Slide 6

Slide 6 text

ACTIVESTORAGE::ANALYZER ACTIVESTORAGE::ANALYZER blobからメタデータを取得する為の機能 ActiveStorage::Analyzer::ImageAnalyzer.new(blob).metadata # => { width: 4104, height: 2736 } デフォルトではImageAnalyzerとVideoAnalyzerが提供さ れている

Slide 7

Slide 7 text

ACTIVESTORAGE::ANALYZER ACTIVESTORAGE::ANALYZER ImageAnalyzerはmini_magickに、VideoAnalyzerは に それぞれ依存している mpegについては 上記Analyzerを使用したい場合は、独自にAnalyzerを追加す ればOK mpeg 直接コマンド叩いている

Slide 8

Slide 8 text

ACTIVESTORAGE::PREVIEW ACTIVESTORAGE::PREVIEW blobからPreview用の画像を作成する為の機能 <%= image_tag file.preview(resize: "100x100>") %> デフォルトではPDFPreviewerとVideoPreviewerが提供さ れている

Slide 9

Slide 9 text

ACTIVESTORAGE::PREVIEW ACTIVESTORAGE::PREVIEW PDFPreviewerは に、VideoPreviewerは に それぞれ依存している どっちもコマンド直接叩いている PDFの場合は最初のページが、Videoの場合は最初のフレ ームがpreview画像として使用される 上記Analyzerを使用したい場合は、独自にAnalyzerを追 加すればOK mupdf mpeg

Slide 10

Slide 10 text

REDIS CACHE STORE REDIS CACHE STORE Railsがデフォルトでサポートするcache storeに、Redis cache storeが追加された 他のcache store同様 に、:namespace、:compress、:compress_threshold, :expires_in, :race_condition_tool等のオプションが指定 出来るようになっている driverが指定出来るようになっており、redis-rbだけでなく、 hiredis, Redis::Distributedが指定出来るようになっている

Slide 11

Slide 11 text

REDIS CACHE STORE REDIS CACHE STORE config.cache_store = :redis_cache_store, driver: :hiredis, namespace: 'myapp-cache', compress: true, timeout: 1, url: "redis://:#{cache_password}@myapp-cache-1:6379/0" Rails guideのCaching with Rails: An Overviewに Redis Storeについての説明が追加されているので、詳細 はそちらを参照。Caching with Rails: An Overview

Slide 12

Slide 12 text

HTTP/2 EARLY HINTS SUPPORT HTTP/2 EARLY HINTS SUPPORT HTTP/2のEarly Hintsのサポートを javascript_include_tag、stylesheet_link_tagメソッド に追加 デフォルトだとオフになっていて、サーバ起動時に--early- hintsオプションを指定する必要がある Puma(3.11.0 以降)じゃないと今のところ動かない Early Hints用のrack header(rack.early_hints)の対 応が入っているのがPumaだけな為

Slide 13

Slide 13 text

ADD PRELOAD_LINK_TAG HELPER ADD PRELOAD_LINK_TAG HELPER rel="preload" によるコンテンツの先読みを行う為のメソッ ド preload_link_tag(post_path(format: :json), as: "fetch") # =>

Slide 14

Slide 14 text

CREDENTIALS CREDENTIALS 秘密情報を管理する為の仕組み 現状、秘密情報を保持する為のファイルが複数 (config/secrets.yml、config/secrets.yml.enc)あり、 かつ、それらのファイルとは別にSECRET_BASE_KEYという環 境変数があったりで、ややこしい状態になていた また、"secrets"という名前があまり良くないのでは、という 思いもあったらしく、別途"credentials"という仕組みが入っ た

Slide 15

Slide 15 text

CREDENTIALS CREDENTIALS 基本的にはRails 5.1に入ったEncrypted Secretsと同じよ うな感じ リポジトリには暗号されたファイルが含まれ、そのファイ ルを編集・閲覧する為のコマンドが提供されている Encrypted Secretsと異なり、ファイルの構成はフラット 環境毎に値を読めるようになっていない

Slide 16

Slide 16 text

CREDENTIALS CREDENTIALS secrets.yml.enc production: external_api_key: 1466aac22e6a869134be3d09b9e89232fc2c2289 credentials.yml.enc aws: access_key_id: 123 secret_access_key: 345 # Used as the base secret for all MessageVerifiers in Rails, includin secret_key_base: bfae0e7ae2106467b0b082188c9da6b6004d108aa20f64455550

Slide 17

Slide 17 text

CREDENTIALS CREDENTIALS secret_key_baseも一つしか定義出来ないが、testや developmentではどうするのか? -> test / development環境では自動で secret_key_baseが生成されるようになり、 staging :thinking_face: 指定不要

Slide 18

Slide 18 text

CREDENTIALS CREDENTIALS Encrypted Secretsと異なり、基本的に必ずロードされる read_encrypted_secrets相当のcon gは無い require_master_keyはmaster key(データ復号の為の key)が無い時の挙動を指定するためのもので、 read_encrypted_secretsとは役割が違う

Slide 19

Slide 19 text

CREDENTIALS CREDENTIALS secrets.secret_tokenはdeprecate Encrypted Secretsはまだ参照・編集はできるが、セットア ップは出来なくなった。ゆるくdeprecate。

Slide 20

Slide 20 text

ENCRYPTED ENCRYPTED credentialsコマンドとは別にencryptedコマンドも実は入 った credentialsと異なり、設定ファイルや暗号に使用するkey をコマンドで指定することが出来る 環境ごとに異なる秘匿情報を扱いたい場合に使うように追 加された(PR出した人の思いとしては)

Slide 21

Slide 21 text

ENCRYPTED ENCRYPTED $ EDITOR=vim bin/rails encrypted:edit config/staging-credentials.yml. $ EDITOR=vim bin/rails encrypted:show config/staging-credentials.yml. aws: access_key_id: 123 secret_access_key: 345 Rails.application.encrypted("config/staging-credentials.yml.enc") # => #

Slide 22

Slide 22 text

DEFAULT CONTENT SECURITY POLICY DEFAULT CONTENT SECURITY POLICY Content-Security-Policy headerを設定出来るよう対応 設定はアプリ全体(initializersで実施)、及び、controller単 位で出来るようになっている Content Security Policy (CSP) - Web セキュリティ | MDN

Slide 23

Slide 23 text

DEFAULT CONTENT SECURITY POLICY DEFAULT CONTENT SECURITY POLICY # config/initializers/content_security_policy.rb Rails.application.config.content_security_policy do |policy| policy.default_src :self, :https policy.font_src :self, :https, :data policy.img_src :self, :https, :data policy.object_src :none policy.script_src :self, :https, :unsafe_inline policy.style_src :self, :https, :unsafe_inline # Specify URI for violation reports # policy.report_uri "/csp-violation-report-endpoint" end class PostsController < ApplicationController content_security_policy do |p| p.upgrade_insecure_requests true p.base_uri :self, -> { "https://#{current_user.domain}.example.co end end

Slide 24

Slide 24 text

DEFAULT CONTENT SECURITY POLICY DEFAULT CONTENT SECURITY POLICY デフォルトでちゃんとしているので、何も考えずにそのまま 適用すると結構トラブルと思う con g.content_security_policy_report_onlyにtrueを 指定するとレポートだけを行う(ブロックはしない)モードに なるので、ちょっと不安がある場合はそちらでとりあえず試 してみるのが良いのでは無いでしょうか Upgrade CSP script_src default from unsafe_inline to nonce approach

Slide 25

Slide 25 text

まとめ まとめ とくにない