k4200’s notes and thoughts

Programmer side of k4200

FreeBSD on EC2の感想

はじめに

勉強がてらPaaSもどきを作ってみたくて、Amazon EC2FreeBSDを入れてjail環境を構築してみた。

自分はLinuxの経験はそこそこあるけど、FreeBSDを使うのが今回が初めてで、EC2についてもあまり詳しくないため、何かおかしい所等があればぜひご指摘を。

全般

構築自体は問題なし

FreeBSD素人の自分でもFreeBSDハンドブックとか見ながら構築できたので、Amazon EC2に起因する問題は特になかった。後述の通り、jailのネットワーク関連が若干特殊な対応が必要だったが。

ただ、FreeBSDLinuxに比べると情報量が圧倒的に少ないため、今使っているバージョン(8.2)でも有効な情報なのかどうかが分からないことが多かった(特に最初の頃)。

スケールアップできない

EC2のようなクラウドを使うメリットの1つとして、

  • スケールアウト(ノードの追加)
  • スケールアップ(CPU、メモリ等のリソースの追加)

が行いやすいというのが挙げられるが、FreeBSDをEC2で使う場合には、スケールアップの恩恵は受けられない。こちらのページを見ていただければ分かる通り、現在利用可能なFreeBSDのAMIが、以下のどちらかのインスタンスタイプでしか動作しない。

名前から大体想像付く通り、これら2つのインスタンス間のスペック(そして金額)の差は圧倒的で、マイクロインスタンスを使っていて不可が増えてきたからスケールアップして、というのは全く現実的ではない。

これに最初から気づいていれば、EC2じゃなくて違うクラウドベンダーを使ったかもしれないのに・・・

リソースの制約が厳しい

個人ユーザーとしては実質的にはマイクロインスタンスしか使用できないため、リソース、特にメモリの制約がキツい。あと、FreeBSDの文化としてportsを使うのが一般的のようだけど、大きなパッケージのコンパイルには非常に時間がかかる。OpenJDKのコンパイルには丸一日以上かかったので、一度コンパイルしたらそれをパッケージ化しておくか、基本的なパッケージをインストールした段階でAMIとして保存しておくと、やり直そうと思った時の時間の節約になる。

jailのネットワーク設定

前述の通り、jail環境を作るのがFreeBSDを使い始めた一番の理由。ネットワーク設定関係が若干特殊だと思われるため、少しメモしておく。

IPアドレスの割当

jailを作る際には各jailにIPアドレスを1つ割り当てて、それを使ってもらうというのが普通らしいんだけど、EC2のような環境では勝手に10.x.x.xとか192.168.x.xのようなアドレスを使う事は出来ない。そのため、ループバックインターフェースに複数のIPアドレスを割り当てて対応した。

$ sudo ifconfig lo0 alias 127.0.0.100 netmask 255.255.255.255

/etc/rc.conf.jail にもそれを記載しておく。

ifconfig_lo0_alias0="inet 127.0.0.100 netmask 255.255.255.255"

jail内ではjetty(Javaサーブレットコンテナ)を8080ポートで動かし、ホスト環境上でのnginxがリバースプロクシとして動作するように設定した。

jail内から外部への通信

フォーラムのこのスレッドを参考にした。

jailに割り当てたIPアドレスは127.0.x.xのため、そのままだとネットワーク的に外部に出ていくことが出来ない。今回の例で言うと、具体的にはjail内からは別のインスタンスMySQLを参照出来る必要がある(+名前解決)。

その為、PF(?)を使って以下のように設定した。

まず設定ファイルのコピー。

$ sudo cp -a /usr/share/examples/pf/pf.conf /etc

次に/etc/pf.confに以下を追記。

allowed_outbound_ports="{3306,53}"
nat on xn0 from 127.0.0.0/16 to any port $allowed_outbound_ports -> xn0

あとはPFを起動。

sudo /etc/rc.d/pf start

全体的な感想

jail環境の構築は楽しい。smallインスタンスが使えれば・・・