Immutable (不変な) Infrastructure は、サーバを一度セットアップしたら二度と変更を加えないという運用スタイルのことを指します。
クラウド環境では、必要に応じてすぐにサーバを用意し、不要になったら簡単に破棄することができます。Immutable Infrastructure は、このようなクラウドの特性を活かす運用スタイルとして、注目されつつあります。
背景
Immutable Infrastructure が提唱された背景にある技術として、 Auto Scaling や Blue-Green Deployment*1 などがあります。
Auto Scaling
Auto Scaling は、負荷に応じて自動的にサーバ台数を増減させる技術で、 AWS では標準で提供されています。常に必要な台数だけ起動していればいいので、コスト削減になるというものです。
Auto Scaling では、サーバが自動的に立ち上がったり、シャットダウンしたりするので、自然とサーバを使い捨てるスタイルで運用することになります。
Blue-Green Deployment
Blue-Green Deployment は、クラウドネイティブなデプロイ方法として近年注目されているデプロイパターンで、 Amazon.com や Netflix などで採用されていることが知られています。 たとえば、古典的なアプリケーションサーバのデプロイでは、アプリケーションコードをサーバに配置したのち、サーバソフトウェアを再起動することが求められます。しかし、 Blue-Green Deployment では、サーバ群をまるごと複製し、ロードバランサで切り替えることでデプロイとします。もしアプリケーションサーバが100台あれば、新しいバージョンのアプリケーションをインストールしたサーバをもう100台セットアップし、ウォームアップしたのち、そちらにトラフィックを切り替えるということです。 そうすることで、サーバソフトウェアの再起動時のパフォーマンス低下を気にする必要がなくなったり、ロールバックが簡単になったりという恩恵があります。
Auto Scaling と同様、 Blue-Green Deployment では、サーバは使い捨てになってしまうという制約があります。この制約を逆手に取り、「すべてのサーバは必ず使い捨てである」と割りきってしまえば、サーバの構築や管理がシンプルにできるのではないか、というのが Immutable Infrastructure の基本的な考え方です。
利点
Immutable Infrastructure がもたらす恩恵について考えてみます。
全てのサーバが同じ状態であることが保証される
あなたの手元のサーバ群で、 puppet/chef を使って長年のあいだ何度も更新を繰り返してきたサーバと、それらと同じ manifest/cookbook を使ってゼロからセットアップしたサーバが、完全に同じ状態になるという自信はありますか?
サーバをセットアップしたら二度と変更を加えないということは、全てのサーバが同じ状態であることが保証されます*2。これは大きな恩恵の一つです。
常にゼロからセットアップできることが保証される
いつでも確実にゼロからサーバをセットアップできることが保証されるということは、サービスの可用性を担保するうえで非常に重要です。
AWS などのクラウドでも、その中身はハードウェアなので、かならず物理故障は発生します。故障によって復旧不可能になったサーバをゼロからセットアップをしなければならなくなったとき、もたもたして時間がかかってしまうというのは多くのサーバ管理者が経験していると思います。
日頃から、いつでもサービスインできるクオリティのサーバがワンクリックでサービスインできる状態にしておけば、突然の故障にも慌てる必要がなくなります。
自動化が必須になる
Immutable Infrastructure では、「puppet/chef を適用したあと、 ssh でログインして手動で××をする」というようなセットアップ手順はもちろん許されません。 「二度と変更を加えない」ためには、まっさらな状態のサーバを起動するだけで、サービスイン可能な品質のサーバが完成する必要があります。この制約を守ると、「ワンクリックでサーバ起動からサービスインまで完了する」という環境を実現することができます。
セットアップの自動化は、属人性を廃したり、オペミスを減らしたりするだけではなく、サーバを抽象化して、ソフトウェアの1オブジェクトとして扱うという、クラウドネイティブな考え方においてとても重要な意味があります。
プロビジョニングがシンプルにできる
「二度と変更を加えない」ということは、「chef/puppet を最初の一度しか実行しない」ということを意味します。
chef や puppet には、「冪(べき)等性」という重要な機能があります。これは、同じサーバに何度も chef/puppet 実行を繰り返しても、同じ結果が得られることが保証されるという性質です。しかし Immutable Infrastructure では「chef/puppet を絶対に一度しか実行しない」ため、そもそもこの冪等性は不要であり、オーバースペックといえます。
極端に言えば、昔ながらのシェルスクリプトによるセットアップでも問題なく Immutable に運用することができます。冪等性が不要になるということは、プロビジョニングはとてもシンプルにすることができるのです。
テストとの親和性
たとえば serverspec によるサーバ状態の CI*3 を行っている場合、 CI 環境で作られるサーバと本番サーバの状態が乖離していたらテストの意味がなくなってしまいます。
Immutable Infrastructure では、すべてのサーバの状態が同じであることが保証されているので、 CI の結果の信ぴょう性が高まります。
サーバセットアップが簡単になる・サーバをいつでも使い捨てできるという Immutable Infrastructure の特徴も、テストのしやすさに貢献します。
サーバのポータビリティが高められる
たとえば AWS では、ユーザ同士でマシンイメージを共有することができるので、世界中の誰でも同じマシンスペックかつ同じ内容のサーバを構築することができます。
マシンイメージを構築するためのセットアップスクリプトを github などで共有し、ソーシャルコーディングで一つのサーバを改善していくという行為が、近いうちに当たり前になっていくかもしれません。
課題
Immutable Infrastructure はまだ未成熟な概念であり、解決すべき課題がいくつか残されています。
コスト
Blue-Green Deployment では、デプロイ時に現在稼働中のサーバ群と同じ台数のサーバが必要になるので、その分コストがかかります。
ログ
サーバを使い捨てにしてしまうと、当たり前ですが、サーバのファイルシステムに記録されていた各種ログファイルが消えてしまうため、何らかのログ集約の仕組みを用意する必要があります。
データベース、ストレージ
MySQL などの永続的 DB や、ストレージサーバを使い捨てにするのは、非常に技術的難易度が高いです。
逃げ道として、 Amazon RDS や MongoLab といった Database as a Service を利用することで、データベースサーバもまたひとつの抽象化されたオブジェクトとして扱うことができる、という手があります。
Immutable 前提なプロビジョニングツール
Immutable Infrastructure の文脈では Chef や Puppet の冪等性がオーバースペックである、と説明しましたが、 Immutable を前提にした軽量プロビジョニングツールという分野は、2013年11月時点ではまだデファクトスタンダードが登場していません。
まとめ
Immutable Infrastructure は、サーバを使い捨てにし、一度セットアップしたら二度と状態を変更しないという運用スタイルです。私は、 Immutable Infrastructure という概念は、単なる運用テクニックではなく、「サーバをソフトウェア部品として抽象化する」というクラウドネイティブな発想へシフトするものであると考えています。まだ若い概念であり、実践の定石が存在しない状態のため、今後の動きに注目しています。
参考資料
- BlueGreenDeployment
- Martin Fowler 氏による、 Blue-Green Deployment の紹介です。2010 年に書かれたものです。
- Amazonは1時間に最大1000回もデプロイする。クラウドネイティブなデプロイとはどういうものか? AWS re:Invent基調講演(Day2 AM) - Publickey
- Amazon が実践する Blue-Green Deployment についての発表がまとめられています。
- The Netflix Tech Blog: Deploying the Netflix API
- Netflix のデプロイ手法の説明です。
- Trash Your Servers and Burn Your Code: Immutable Infrastructure and Disposable Components - Chad Fowler
- 情熱プログラマーでお馴染みの Chad Fowler 氏による、 Immutable Infrastructure および Disposable Components に関する記事です。
- インフラ系技術の流れ - Gosuke Miyashita
- Puppet / Chef 等プロビジョニングツールの登場から Immutable Infrastructure に至るまでの流れがとても分かりやすくまとまっています。
- Rebuild: 25: Immutable Infrastructure (Naoya Ito, Gosuke Miyashita)
- おなじみ miyagawa さんの podcast。日本の DevOps 界隈のキーパーソンによって Immutable Infrastructure が深く議論されている貴重な回です。
- Immutable Infrastructure の有用性 - Togetter
- Immutable Infrastructure が私の TL で話題になったときの記録です。
- configspec という Immutable Infrastructure 用 Configuration Management Tool をつくってみた - Gosuke Miyashita
- Gosuke Miyashita (mizzy) さんが開発中の configspec は、 Immutable Infrastructure を前提に設計された、 RSpec でサーバをセットアップできるという、面白いアプローチのプロビジョニングツールです。
- Docker
- Docker は、 dotCloud の PaaS バックエンドとして使われている、 Linux コンテナを使ってアプリケーションを動かすためのツールです。 Immutable Infrastructure との親和性の高さが注目を集めています。先に紹介した rebuild.fm #25 でも議論されています。
- Serf
- Gossip Protocol で実装された、サーバのディスカバリ*4ツールです。シンプルかつ軽量であるため、人気が高まりつつあります。「セットアップ後にサーバの状態を変更しない」という制約を守るためには、こうしたディスカバリツールの導入が必要になります。