Blogリンカーズ株式会社の技術ブログです。Railsの既存プロジェクトにMinIOを実際に環境に導入し、その際つまずいたところを記録した記事です。MinIO導入の経緯から、ローカルの開発環境にコンテナとして導入して、最後はCIが緑になって開発ブランチにマージされるまでを書いています。Inc.によって開発されているOSSです。2.0ライセンスで公開されています。S3のAPIと互換性があるため、例えば、本番環境はS3を使って、ローカルやCIの環境はMinIOのコンテナで......というように、ローカルやCIでS3の環境を用意したい人にとっても便利に使うことができます。GitHubでコードを公開しているだけではなく、公式でDockerイメージまでDockerHubに用意してくれており、大変便利に使うことができます。Inc.に足を向けて寝れません。下の画像は、ローカルで起動しているMinIOにアクセスした画面です。シンプルなデザインがお洒落で素敵ですね。上記のような一般的な構成です。EC2上にRailsのアプリケーションが起動しており、ユーザーが画像やPDFをアップロードすると、Railsがそれを受け取って、Shrineというgemに後は任せます。Shrineは、ファイルをS3やAPサーバー内に保存してくれるgemです。アップロードされたファイルのダウンロードは、後からユーザーがRailsでレンダリングされたWebページを見て、そこにあるS3へのリンクをクリックしダウンロードする、という構成です。開発環境そしてMinIO導入以前のローカルの開発環境は、下記のような構成でした。Proが支給されます。この画像を見て分かる通り、本番環境と明らかに違うところがあります。本番環境ではS3が画像やPDF等のファイルを返していましたが、この開発環境ではRailsがファイルを返しています。開発環境と本番環境でそれぞれ、S3を見に行くか、それとも自分自身のサーバー内を見に行くかはShrineが抽象化しているため、ソースコード自体はシンプルです。本番環境と開発環境の仕組みの違いが、後々問題を引き起こします。実際にあった例としてこんな問題がありました。「自分でアップロードしたCSVファイルを後からダウンロードしようとすると外部サイト移動の警告が出る」という不具合です。URLは./bucket/hoge.csvのような相対パスで、本番環境のURLはhttps://aws.s3.domain/bucket/hoge.csvのような異なるURLが生成されていたため、開発環境中では判定の誤りに気づけず、リリースがされてしまった......。いう悲しい不具合でした。環境の差異によって見過ごされていた不具合は他にも出てくる可能性は十分に考えられるため、少しでもローカルで本番環境に近い構成にしたい、というのがMinIOを導入した動機です。省略していますが、MinIOに関連するところだけ抽出するとこのようになりました。local_dev:そして、MinIOに初期処理を行う部分は別のymlに切り出しました。ここに出てくるmcはminio-clientの略で、起動しているminioのコンテナに対してアクセスし、hogeという名前のバケットを削除したり新規作成したりしています。ここに出てくるminio/mcというイメージも、公式から提供されています。'バケットの作成を完了しました。upをする前に、初回のみ下記のコマンドを実行します。upすると、ファイルの中身がマージされて実行されます。このコマンドを初回だけ実行することで、初期処理が行われてバケットが作成され、MinIOに書き込み・読み込みができるようになります。upで開発環境が起動します。ハマった:foreman、突然の死これはdocker-compose.createbuckets.ymlにMinIOの初期処理を分離する前、docker-compose.ymlにバケットの作成の処理を詰め込んでいた時の話です。私達のチームではforemanというプロセス管理ツールを使っていました。startしても停止してしまうという問題が発生しました。理由はforemanが、「全てのプロセスが起動し続ける」前提で動いているツールであったことでした。これによってこのminio-clientのコンテナは停止しますが、それをforemanが検知するとforemanは全てのプロセスを終了しようとします。よって、docker-compose.createbuckets.ymlに書いてあるような内容は、少なくともforemanの外で実行する必要があります。CIを使用しています。E2Eテストでもまた、MinIOを使いたいので、Rspecが動くJobなどでMinIOも動かせるよう設定をする必要があります。作っておいたimage。この中にminio-clientも入っている。後は、赤くなっているテストを修正します。テスト(Rspec)が通るまで素直な修正これまで"rspec用"として書いていたコードが、より本番環境に近いコードに修正されることになります。これまではhref='/bucket/6f4648d.png'を期待していたところを、href='http://localhost:9000/bucket/6f4648d.png'に直すような修正です。本番環境に近い状態でテストができるようになったため、こうしたテストを修正するのは当然のことでしょう。Aws::S3::Errors::RequestTimeTooSkewedTimecopというgemがあります。これによって、Time.nowなどをした時の時間を操作することができます。Rspec内の時間が固定されていたことによって、Minioとの時間差が大きくなりすぎてアップロードできなくなるケースが出てきました。byteのファイルをアップロードできない不具合が見つかりました。byteのダミーファイルをアップロードしていて、そこがErrorになったことで判明しました。S3を使っている本番環境でも同様の問題が発生していると分かったため、MinIOを入れたことで隠れていた問題が浮き上がりました。調べると、これはShrineの不具合でした。v3.2.1だと問題なくアップロードができると分かりました。ActionController::RoutingErrorこれまで、開発環境や自動テスト環境ではファイルをダウンロードする時に、相対パスにあるファイルをRspecが読みに行っていました。下記は「test.ppt」というパワポのファイルへのリンクが画面に表示されていて、それをクリックしたらパワポのファイルをダウンロードができることをテストしているRspecです。eq('application/vnd.ms-powerpoint')しかし、このプロジェクトではファイルをMinIOが返すように変更しました。Railsがファイルを返すわけではなくなったため、pageで中身を取得することはできなくなりました。この問題に対してはKernel#openでファイルをダウンロードし、その中身をテストするという方針に変更しました。Specのhave_linkでリンクが突然探し出せなくなった下記のようなテーブルの構造で、hrefの中身のURLが適切に生成されているかをテストしていました。</tbody></table>これまでは、withinで<tr>のところまで降りてきて、下記のコードでテストできていました。something_expected_urlしかし、MinIOはS3と互換性があり、URLにもS3と同様の長いクエリがついて、最終的には長大なURLになります。X-Amz-Credentialや、X-Amz-Signatureなどのパラメータが付与されます。それが原因なのか、have_linkで深いところにあるURLをいきなり探りあてることができなくなりました。そのため、URLのあるタグまでfindして判定することにしました。something_expected_url修正完了テストを修正し、CIの全てのテストが緑になりました。導入完了GitLabのマージリクエストで他の開発者にレビュー依頼をし、LGTMをもらい、開発ブランチに変更をマージしました。これにて導入が完了しました。本流とは関係のないところですが、MinIOとはあまり関係のないところで課題となったところもいくつかありました。ローカル環境でランダムで発生するrspecのエラーが表出した(元々のテストにバグが仕込まれていた)開発ブランチへのマージ後、ある開発者のみMinIOでアップロードができない状態に陥った(何かの拍子でローカルのgem、aws-sdk-s3の中身が書き換わっていたことが判明した)MinIOを導入することで、これまで潜んでいた色々な問題が表出する可能性もあるため、既存プロジェクトに導入する際にはそれなりの時間を見積もっていた方が安全かもしれません。いえ、これでやっと導入は完了しました。最終的に、開発環境は画像のようになりました。メドピア社・Classi社と共に開催しました。弊社からは3名が登壇しましたので、その模様を紹介します。開催レポートTweetもっと読むコメントを書く2019-10-25JavaScriptでのイベントキャンセルの落とし穴JavaScriptRailsで開発していると、デフォルトのSubmitイベントを上書きしたい時に遭遇することがあると思います。いった場合は、Clickイベントなどを利用して、デフォルトのSubmitイベントはキャンセルし、上書きした処理を実行することになります。イベントリスナーの設定方法やキャンセル方法によっては、予期せぬ動作を引き起こすことがあります。JavaScriptのイベント伝播の仕組みを理解していれば、予期せぬ動作を未然に防ぐことが出来ます。当ブログでは2回に分けてSlack移行についてお伝えしたいと思います。今回はMattermostからデータを抽出し、Slackにインポートする手順です。2019年3月Matz会ダイジェストこんにちは、リンカーズ情報システム部の鈴木です。今回は弊社に残るMatz会アーカイブから2019年3月開催分をお送りします。ahoyで、deviseの複数のユーザモデルを取り扱うahoy導入の経緯と課題ahoyはRailsアプリケーションにアナリティクスツールを組み込むためのgemで、Railsアプリケーション上でユーザ行動ログを取得し、保存することができます。データの保存先としてActiveRecordを選択することができるので、最小構成のインフラでも簡単に導入することができます。Analyticsへの接続を制限している環境のユーザの行動も補足することができるというメリットもあります。開発中のRailsアプリケーションは認証用のライブラリとしてdeviseを利用しており、お客様と社内のスタッフをテーブル単位で分けています。ahoyは標準では複数のモデルに対応していないため、導入するにあたってこの問題を解決する必要がありました。polymorphic関連で解決する、というgemの作者からの回答があるのですが、その具体的な手続きまでは書かれていません。今回はその手順をまとめました。公式のREADMEか、わかりやすいQiita記事を読んでください。cutomerの二種類あるとして話を進めます。methodにあるように、コントローラ内でアクセス中のユーザのデータにアクセスするための設定を変更します。Ahoy::Eventのモデルのbelong_toの部分をポリモーフィック関連に置き換えます。trueendデータベースに保存するので、カラムの追加が必要ですね。endendまた、eventに保存されるデータにカラムを追加する手続きが必要になります。endend以上で完成です。あとは、好きなページにトラッキングコードを入れることで、複数のユーザモデルに対応した状態でユーザの行動を分析できるようになります。開発に関わるいろんなお仕事とサーバのお守りを担当しています。2019年2月Matz会ダイジェストこんにちは、情報システム部の鈴木です。Matz会)を行なっています。お待たせしました、今回は今年2月開催分のレポートです。今回のテーマはこちらです。詳しいレポートは「続きを読む」より。2019年2月Matz会ダイジェストTweetもっと読むコメントを書く次のページプロフィールリンカーズ株式会社の技術ブログです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。