概要
はじめまして、17 新卒エンジニアの中嶋です。
イエウール のサーバサイドの開発を行っています。 コードを書くのは好きだけど、インフラ・ミドルウェア系は弱い感じのエンジニアです。
これまで趣味では、Heroku や Elastic Beanstalk でシュッとデプロイして済ましていたので、AWS、ネットワーク、ミドルウェアあたりの知識が皆無でした。
先日、イエウールのホスティング環境が、IDCFrontier から AWS へ移行しました。
このようなインフラ移行に関わる機会は、そう多くあることではないので、これに便乗してインフラにちゃんと触れてみようと思いました。
そこで、少しでもインフラに近づくべく、社内で実績のあったプロビジョニングツール Itamae を使って、イエウールのサーバ構成の一部を、できる範囲でコード化しました。
結果、コードを書くのは好きだけど、インフラ・ミドルウェアが弱い感じの人は、Itamae から触るのがいいのでは、という結論に至りました。
インフラへの入り口に Itamae は最適
Itamae は、Ruby で書ける構成管理ツールです。 アプリケーションに必要なパッケージのインストール、設定ファイルの配置等を Ruby で記述し 用意されたコマンドを通して実行すると、サーバ構成を記述通りにバシッと作ってくれます。
Itamae はコード好きインフラ弱者にとって、二つの嬉しい部分があります。
- インフラ道を邪魔しない単純さ
- プログラマの特技が、サーバ構築の世界でも通用する
インフラ道を邪魔しない単純さ
Itamae は、シンプルなので低い学習コストで習得できます。 それゆえ、本当に大事な OS・ミドルウェアの仕様を知ることと、アプリケーションの開発に時間を費やすことができます。 実際、一時間ほどのペアプロで Itamae の大体の仕様を理解することができました。
nginx のセットアップを例にとり、Itamae のシンプルさを示します。 セットアップには以下の手順があります。
nginx
をインストールし- nginx の設定ファイルを所定の場所に転送する
- 設定に変更があれば、nginx を reload する(新しい設定を反映させる)
この手順を Itamae で記述すると
package 'nginx' # nginx をインストール # ローカルの所定の場所にあるファイルを、リモートサーバに転送する。ただし、ファイルに変更がなければ実行しない remote_file '/etc/nginx/conf.d/default.conf' do # ファイルの所有者、権限の設定 owner 'root' group 'root' mode '644' # 変更があった場合は、設定を反映させる ($ service nginx reload) notifies :reload, 'service[nginx]' end
このように、Ruby DSL でサーバ構成を記述できます。
Itamae では、サーバ構築に使うプログラムをレシピといい、
package
や remote_file
などの定義をリソースといいます。
リモートサーバにレシピを適用するには、以下のような Itamae コマンドを実行します。
$ itamae ssh -h xxx.jp -u username server.rb
これでレシピ通りのサーバ構成を、リモートサーバに構築することができます。
シェルスクリプトで構成管理は難しい
Itamae は、上のような単純な例であれば、Linux コマンドを一切書く必要がありません。 シェルスクリプトで書いたとしても、さほど複雑にならないと思います。
しかし、より複雑なことをしたり、以下を考慮した構成管理を一からシェルスクリプトで行うのは困難です。
- 様々な OS やディストリビューションで動くような移植性
- コマンドの冪等性
例えば、パッケージをインストールするコマンドは、yum
、apt-get
、brew
など OS やディストリビューションごとに、異なるコマンドです。同じ名前のコマンドでも仕様が異なる場合があります。構成管理を別の環境に移植するには、初めから移植性を意識して、構成管理を行う必要があります。
また、構成管理では、サーバの状態をなるべく壊さないようにするため、パッケージがインストール済みなら、インストールコマンドの実行を省略したり、設定ファイルに変更がなければ、サービスを再起動したりします。 このような、同じ操作を何度行っても結果が変わらない性質を冪等性と言います。 パッケージのインストールや、サービスの再起動など、副作用のあるコマンドは、冪等性を意識する必要があります。
シンプルに書ける Itamae の仕組み
Itamae には、移植性や冪等性をプログラマが意識しなくても良い仕組みがあります。そのうち移植性の部分は、 Specinfra がよしなに解決してくれます。 Specinfra は、コマンド実行フレームワークで、OS やディストリビューションのコマンドの違いや、コマンドの実行方法(ローカル上、SSH 経由など)を抽象化します。 Itamae のリソースは、Specinfra のラッパーコマンドを組み合わせて、冪等性を意識して実装されています。
Itamae はこうした仕組みによって、より大事な OS・ミドルウェアの設定方法を知ることや、アプリケーションの開発に時間を費やすことができます。
プログラマの特技が、サーバ構築の世界でも通用する
これは、Itamae に限った話ではないのですが、大事な部分なので書いておきます。 Itamae は Ruby プログラムで構成手順が書けるので、プログラマの特技をサーバ構築の世界に持ち込むことができます。
プログラマの特技をサーバ構築の世界に持ち込むことで、以下のようなメリットがあります。
- 自動化
- 一度コード化しておけば、同じ環境を簡単にミスなく再現できる
- DRY (Don’t Repeat Yourself)
- いつも通りの Ruby で、変数やループを使って簡潔に構成手順を表現できる
- バージョン管理
- 構成手順がうまく動かなかったら、いつも通りの
$ git revert
- 構成手順がうまく動かなかったら、いつも通りの
- レビューができる
- いつもの GitHub で、プルリクエストをレビューしてもらえる
- コードがドキュメントだ
- コードを見れば、構成手順がひと目で分かる
- 先輩エンジニアが書いた構成を盗める
特に最後の項目は、イエウールのサーバ構成のコード化を通じて、いいなと思った部分です。 何がいいかというと、
- コードは厳密に書く必要があるので、細かい手順が「暗黙の了解」として省かれることがない
- Web サーバをちゃんと運用するなら、これはやっておけ的な設定を知ることができる
という点です。
サーバの構築には、細かい手順が多くあります。
- ミドルウェアを動かすために設定を記述する
- ディレクトリを用意してパーミッションを適切に設定する
- 必要に応じて、ミドルウェアを再起動する
などです。入門サイトや口頭での説明では、こうした細かい手順が省かれることがあるので、躓くポイントになってしまいますが、構築手順がコードなら、細かい手順や設定を含め網羅的に知ることができます。
構築手順をコードとして書いておけば、それ自体が生きたドキュメントになるので、作業メモとして自分の思考を整理してくれるし、環境自動構築プログラムにもなります。ちょうど、仕様を示すため、自動テストのためにテストコードを書くようなものだと思っています。
以上は、Itamae に限らず Infrastructure as a Code 全般のメリットですが、 Itamae は簡単なので、これらのメリットをすぐに享受できると思います。
まとめ
- インフラへの入り口に Itamae は最適
- 学習コストが低いので、本当に大事な OS・ミドルウェアの仕様把握、アプリケーションの開発に時間を割ける
- 自動化、バージョン管理などプログラマの領分が活かせる
- コード自体が生きたドキュメントになるので、説明なら省かれるだろう細かい手順も把握できるし、作業メモとして自分の思考を整理できる
- Ruby で書ける!
コードを書くのは好きだけどインフラ弱いって人は まず Itamae 触っとくといいと思うよ