H2O の設定ファイルを Perl Script で生成している話

先日、

カラクリスタ・ブログ - Vultr からさくらの VPS にサーバを移しました

と言うお知らせ。なんで Vultr からさくらの VPS に移したか まぁ個人的には Vultr を使っていてもそう不自由はしてなかったんで...

https://the.kalaclista.com/posts/2019/11/26/163724/

と言う記事を書いた様に、この Web サイトは今現在さくらの VPS で Hosting しているのですが、 その際に HTTP/2 Server として使ってる、

H2O - the optimized HTTP/2 server

https://h2o.examp1e.net/

の設定ファイル(YAML ファイル)を Perl Script を使って生成する様にしたので、 今回はなぜ H2O の設定ファイルを Perl Script で生成したか、についてサクっと書きたいと思います。

H2O の設定ファイル(YAML ファイル)を Perl Script で生成した理由

これは自分の Web サイト特有の理由でも有るのですが、 自分の Web サイトをすべてこの Web サイトのドメインに集約した関係上、 以前使っていたこの Web サイト以外のドメインで、 この Web サイトへのドメインなどへリダイレクトを行う必要がありました。

そのため H2O の設定ファイルでは、複数のドメインに対して同じ様なリダイレクト設定をする必要があったのですが、 最初はこれを手作業で記述していて、

うーん、これ似た様な設定で変更する箇所が複数になると死では?

と思ったのと、あと現実として似た様な設定を大量に書くのがツラかったため、

うん。これ Script か何かでデータを生成して YAML に Dump した方が効率良いよね

という結論に至り、じゃあ一番慣れた Perl で書くか、となったのがコトの理由になります。

なお、実際に書いた Perl スクリプトは下記で見れます:

nixops-configurations/h2o.yml.pl at master · nyarla/nixops-configurations

My NixOps configuration files. Contribute to nyarla/nixops-configurati...

https://github.com/nyarla/nixops-configurations/blob/master/overlays/configurable/dotfiles/personal/h2o.yml.pl

Perl Script で H2O の設定ファイルを Dump する利点

まず、今回の H2O の設定では主にリダイレクトなどの設定などにおいて、似ている様だけど微妙に違う設定を生成する必要があり、 これらをデータを生成する関数によって同じ様で微妙に細部が違う似た様な設定データを生成できた、というのが、 この方法の一番の利点になります。

また、YAML で設定を書くという構造上、アクセスログのフォーマットなども複雑な一行の設定として書く必要があったのですが、 これもパラメーターを HashRef として書き、あとで文字列として結合する、という処理で設定出来る様にしたので、 複雑となりがちな設定データを、見通しの良いコードとして表現できた、というのも利点になるかと思います。

あと今回はそれを行いませんでしたが、設定データを関数で生成する様にしていると、 当然テストなども行い易くなるため、大規模な環境で H2O を利用する場合、 関数の出力結果をテストすることによって、H2O の設定をより堅牢にできる、というのも利点かと思います。

実際に Perl Script で H2O 設定ファイルを生成した感想

まず最初に感じたのは、YAML を生で書く時と比べてはるかに設定記述するのが楽でした。

また、以前使っていた H2O の設定ファイルはデータ構造の見通しが悪く、 似たような設定を変更する際には色々と大変になりがちだったのですが、 その辺りについても、似た様な設定の変更を加える際には、 設定データを生成するコードに対して一箇所の変更を加える事によって目的が達せられる様になったので、 その点もかなり便利です。

とは言え設定を Perl Script で生成している関係上、設定ファイルを利用するには実際に Perl を動かして設定ファイルを生成する必要があるので、 その辺りを自動化しないとトラブルの元になるかなーと思うところはあり、私の場合その点は NixOS での DevOps ツールである NixOps などを駆使してカバーしたので、 特にその辺りのデメリットは発生しなかったのですが、他の Linux Distribution や BSD 系の Distribution を使っている際には、 その辺りはなんらかの自動化をしていないと若干のデメリットが発生するのではないか、と感じでいます。

ただ、そうは言っても Perl に限らずスクリプト言語で設定ファイルを生成する、というアプローチについては、 設定ファイルが YAML や JSON と言った様な自動生成を行い易いデータ記述言語を採用している限りにおいて、 設定ファイルを柔軟かつ Testable に生成できる、と言う利点があるので、他の Middlware などを利用している場合でも、 同じ様な手法で取り扱えるのではないかな、と個人的には思っています。

以上

なんかサラっと書くつもりが結構ガッツリ記事を書いている感じになってしまいましたが、 設定ファイルをスクリプト言語で生成するという手法は、複雑になりがちな設定ファイルに対しては管理し易くなる、 という明確なメリットが有るので、他の Middleware などでも利用できる場面では積極的に利用して行くと良いかなー、 と個人的には考えています。

また、私は Laptop の OS 環境やサーバの OS 環境についても、

NixOS Linux

https://nixos.org/

を使っていて、設定ファイルやパッケージの状態も含め、ワリと設定などの再現性が高い状態で管理出来ているし、 またシステムに変更を加える際もシステムも粉砕するリスクを低く抑える事ができるので、 その辺りに魅力を感じる方は NixOS を使うのも良いんじゃないかなーと思っています。

という感じで、今回の話は以上でした。はい。

nyarla が大体

Scrapbox でコメントや意見を書く