Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20210423_出張!Railsウォッチ in 銀座Rails#32

20210423_出張!Railsウォッチ in 銀座Rails#32

Masato Mori

April 23, 2021
Tweet

More Decks by Masato Mori

Other Decks in Programming

Transcript

  1. About Me
 • 森 雅智: @morimorihoge
 • BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 •

    Ruby/Rails歴は11年くらい。Web開発は17年くらい
 • 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました
 • 銀座Rails #27でアプリケーションコンフィグの話をしました
 About BPS & TechRacho
 • Web受託開発や電子書籍製品開発をやっている会社です
 • TechRachoという自社技術Blogを運営しています
 ◦ 4年ほど前から平日毎日更新してます
 ◦ https://techracho.bpsinc.jp/ • お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ◦ https://www.bpsinc.jp/ 2

  2. これまでの出張Railsウォッチのピックアップテーマ
 • Rails6新機能特集
 ◦ 銀座Rails#12: 複数DB対応
 ◦ 銀座Rails#13: ActionText、Trix
 ◦

    銀座Rails#14: ActionMailbox
 • Railsアプリケーション開発に関する雑多なテーマ
 ◦ 銀座Rails#15: production、development、staging環境について
 ◦ 銀座Rails#16: 機能開発の設計レビューについて
 ◦ 銀座Rails#17: リソース管理スコープについて
 • 開発一般な話
 ◦ 銀座Rails#19: 開発チームの冗長化について
 ◦ 銀座Rails#20: Excelと仲良くしよう
 ◦ 銀座Rails#21: 標準仕様を読むためのABNF
 ◦ 銀座Rails#22: CLIプログラムにOptionParserを使う
 ◦ 銀座Rails#23: ActiveRecordのSELECTベンチマーク
 ◦ 銀座Rails#24: 令和Devise事情
 ◦ 銀座Rails#28: 2020年の銀座Railsを振り返る
 ◦ 銀座Rails#29: Serverless Railsを試す
 ◦ 銀座Rails#30: Railsインフラ環境Overview
 ◦ 銀座Rails#31: Railsプロジェクトあるある
 4
 各回資料に興味がある方はこちらからどうぞ:https://speakerdeck.com/morimorihoge 

  3. 概要
 6
 • 2021/03/24、突然Railsのbundle installが失敗するようになった
 ◦ 「何もしてないのに動かなくなった」事例が発生 
 • 原因はActiveStorageの依存しているmimemagicというGemにあった


    • 様々な要因から「待ってればそのうち直る」タイプの問題ではなかったため、世の中 のあらゆるRailsアプリが影響を受ける結果となった
 • 2021/04/23現在、一通りの対策は完了し、対応手順についてもまとまっている
 ※何もしてないのに壊れたのイメージ 

  4. MimeMagicの何がまずかったのか?
 • 拡張子とMimeTypeを結びつける辞書データにfreedesktop.orgの提供する freedesktop.org.xmlというXMLデータベースファイルを利用していた
 ◦ このファイルは本来GPLv2ライセンスで提供されていた 
 • MimeMagicはMITライセンスで配布されていた
 ◦

    が、freedesktop.org.xmlを リポジトリ内にバンドルしていた 
 ◦ MITライセンスとGPLv2ライセンスではGPLv2の方がより厳密なため、混ぜるならGPLv2にしないくて はならず、ライセンス違反の状態であった 
 ◦ XMLファイルを提供するshared-mime-infoのメンテナからライセンス問題を指摘するIssueが来てい た
 ▪ https://github.com/mimemagicrb/mimemagic/issues/97 
 • MimeMagicがライセンス違反のバージョンをこれ以上ダウンロードできないようにす るため、当該バージョンをRubyGemsから削除(yank)した
 ◦ これにより、RailsリポジトリでGemfile.lockしたバージョンがbundle installでインストールできなくなっ た
 11

  5. MimeMagicの背景にあったかもしれないもの
 • 実はGolang版のzRedShift/mimemagicで同様の議論がされていた 
 ◦ https://github.com/zRedShift/mimemagic/issues/4 
 • ここで議論されていたのはDMCA takedownに関する問題で、とにかく対応しなきゃ

    だね、というやり取り
 • もし仮にMimeMagicがRailsへの影響を考慮して本件を放置していた場合、GitHub から先にtakedownされてしまう可能性もあった
 ◦ takedownされた場合、復帰処理にはもっと時間がかかった可能性もあった 
 • そういう意味ではMimeMagicの今回の対応は仕方なかった部分も大いにあると思 われる
 12
 # DMCA takedownとは? 
 
 * Webサイトにおいて著作権侵害コンテンツがアップロードされた際、DMCA通告に従って速やかにコンテ ンツの配信を停止することで、サイト運営者が損害賠償を免責される仕組み 
 * 「速やかに」というのが最優先されており、通告を受けたら アップロードした本人の確認を待たずにとに かく先に配信停止される 
 * 異議申し立てはできるが、それは配信停止の後 になってしまう(ので配信停止を拒否できない) 
 * GitHubにもDMCA takedown policyがある 
 * 連絡はしてくれるが1営業日以内に対応する必要がある 

  6. Rails側の対応とその後
 • 前提として、RailsがGPLv2ライセンスのライブラリに依存するのは避ける必要が あった(Rails全体がGPLv2になってしまうため)
 ◦ GPLv2になると、Railsの利用形態によってはソースコード開示義務が発生する可能性がある 
 ◦ ※一般的なASPサービスは問題ないが、GitHub Enterpriseのようなユーザー側の環境でRailsサー

    バーを動かすようなシステムだと問題になると言われている 
 • 諸々の議論がされたが、最終的にはfreedesktop.org.xmlに依存せず、Apache Tika の提供するデータ(Apacheライセンス)を使うようにRails側を修正し、mimemagicは 使わなくなった
 • mimemagicは引き続き提供されているが、shared-mime-infoパッケージのインス トールが別途必要で、環境によってはXMLファイルパスを与えてやる必要がある
 ◦ Railsバージョンを最新に上げられない事情がある場合はmimemagicを使い続けるのもできる 
 ◦ 古いminimagicを使い続けているとGPL違反になる可能性があるため、該当しそうなパッケージソフ トなどを作っている人は要確認を 
 14

  7. その他の教訓
 15
 • 今回のような問題はあらかじめ予見することができたか?
 ◦ かなり難しい。マイナーGemならともかく、Railsが依存しているようなGemがバージョンごと消滅する ようなケースを考慮するのはなかなか現実的ではなさそう 
 • 今回の問題に対策するとしたらどんなことができたか?


    ◦ ActiveStorageを使わないなら外しておく ということはできた
 ◦ bundlerのキャッシュ を持っていればyankには耐えられた 
 ▪ が、キャッシュ状態に依存するdeploy環境は健全なのかという問題もある 
 ◦ 自前でRubyGemsのミラーサーバーを立てておき、buildが成功した時のGemバージョンを保持する ような機構を用意しておくとか 
 ◦ 同業者のTwitterアカウントやコミュニティSlackなどを普段から見ておき、最新の情報を追いかけら れるようにしておく
 https://ruby-jp.github.io/