OSSにPR送ってみた opsworks_ruby編

1/14/2020

OpsWorksとは?

現在参画している案件でAWS OpsWorksを使用しています。

https://aws.amazon.com/jp/opsworks/

OpsWorksはELB, EC2, RDS間の繋ぎ込みをChefでいい感じにプロビジョニングしてくれるんですが、
chefのcookbookで使う opsworks_ruby に設定したい項目が存在しなかったのでOSSコントリビュートしてみました。


前提

AWS OpsWorks x Apache x Passenger上で動くアプリケーション(Rails 5系)

チューニングの際に参考にした設定はこの辺。
https://gist.github.com/koudaiii/9af3483746352b59126e

背景

Rails側でエラー発生時にメンテナンス画面として public/500.html 等を返しているが、Passengerのqueueが溢れた際はPassengerがエラーを返してしまう。

queue_error

Apacheにエラードキュメントを明示的に指定する設定を入れたいが、opsworks_rubyにそもそもエラードキュメントを設定するようなconfingパラメータが提供されていない。
queue周りのチューニングもパラメータが存在しないため出来ない状態。


まずはChefについて調べる

Chef自体あまり詳しくなかったのでググりながら進めてみる。
Berksfileの中で個々のcookbookを定義しつつ依存関係を管理しているということで、以下のファイルを編集。

source 'https://supermarket.chef.io'
solver :ruby
cookbook 'opsworks_ruby', git: 'https://github.com/kazukifujii/opsworks_ruby.git'
cookbook 'swap', '2.1.0'
cookbook 'yarn', '0.3.3'
cookbook 'nodejs', '5.0.0'
cookbook 'ntp', '3.5.4'
cookbook 'sturdy_ssm_agent', '1.1.0'
cookbook 'postgresql', '6.1.4'
cookbook 'datadog', '= 2.19.0'

3行目のようにforkしたリポジトリをgitで指定することが可能。
上ではforkしてきた自分のリポジトリを指定しています。

実際に反映されるApache設定ファイル

/etc/apache2/sites-available/rails.conf

ここに設定が反映されればOK。
設定変更の度にStackを作り直すのが面倒な時なので、staging環境があればこのconfを直接編集して systemctl restart apache2 で反映可。


PRを作成する

ざっと設定して手元で動作チェックまで出来たら、英語が不安ながらもPRを作成していきます。
rubocopの警告が出たのでリファクタリングしつつ、すぐにフィードバックがきたのでテストも追加。
結果、素早く対応いただき2日でmasterにマージされていました!

https://github.com/ajgon/opsworks_ruby/pull/227


その後…

スムーズにいけたものの、結局エラードキュメントを設定するとapiのPATCHリクエストでjsonが返ってこないという謎の現象が起きてしまい本格的に使えていないという。
queueの設定は出来るようになったので、チューニングしてそもそもキューが溢れないようにしたり、スロークエリの改善をして行った方が良さそうです。

エラーについてはjsonではなく

Bad Request Your browser sent a request that this server could not understand.

がhtmlとして返ってきたのですが、ログを見てもエラーが出ない、かつ発生するまでラグがあったので原因不明で結構詰まりました。
誰かの役に立つかも知れないので、上記に記載しておきます。

©️ 2020 ふじい Dev-Remo-Work.