↑2016年のよく使われるDevOpsツール。Docker、Ansibleが伸びています。
(RightScale: New DevOps Trends: 2016 State of the Cloud Surveyより)
こんにちは、吉岡(@yoshiokatsuneo)です。
ウェブサービスを作るにはどうしたらいいでしょうか?
当然ですが、プログラムを書く必要があります。Ruby on Rails、MEANスタック、LAMP、などフレームワークを選択した後は その方法論に従ってコードを書いていきます。 開発はローカルのパソコンで行いますので、サーバ・ネットワークなどインフラについて考える必要はありません。
しかし、実際にサービスをリリースして使ってもらうには、そのサービスをサーバで動かす必要があります。 サービスを安定して継続的に動作させるにはインフラの知識が不可欠です。
従来、ハードウェアとソフトウェアは役割がわかれていたため、インフラとソフトウェアは別のチーム・人が担当することも多かったのですが、最近はインフラにもソフトウェアな考え方が取り入れらており、開発とインフラの垣根を減らすDevOpsという考え方が広まっています。
また、プログラマとしては良いコードを書こうと思うのですが、インフラについてはついつい行き当たりバッタリになってしまう こともあります。しかし、インフラに関する知識を持っておけば、サービスの質や生産性は大きく変わります。
そこで、ここではウェブエンジニアが知っておいたほうが良いインフラ技術を紹介します。 それぞれ別の技術でも、相互に関連する部分も多くなりますし、どのように組み合わせるかもエンジニアとしての腕の見せ所ともいえます。
サーバ
クラウド・IaaS (AWSなど)
例: AWS, Azure, GCE,...
かつてはサーバは自分で購入・設置しインストールするものでしたが、現在では物理的なサーバに触れることは稀です。 今では、ブラウザ上で操作することで、OSを選択してサーバを起動できるようになっています。
この分野を立ち上げ、また現在でも一番有名なのはAmazonによる Amazon Web Serivce(AWS)です。 Amazonはウェブ上で商品を提供するECサイトで大量のサーバを運営しています。 しかし、アクセスはクリスマスセールなど偏っているため、余ったサーバの能力を他の人に売ることを考えました。 こうして始まったのがクラウドサービス(IaaS, Infrastructure as a Service)です。 このように、大量のサーバを持つサーバのプロが多くのユーザに対してサーバ能力を提供することにより、 ユーザが必要な時に必要なサーバを安価で利用できることがクラウドサービスの本質です。
クラウドサービス(IaaS)では、インスタンスと呼ばれるサーバ、OS、ディスク、ネットワーク、などを自由に選択して 柔軟に組み合わせることができます。
現在では、サーバそのもの以外にも、データベース、DNSなどのサービスを提供しています。 コンテナ関連のサービスも増えており、Dockerコンテナ、Dockerレジストリなども提供しています。(Amazon ECS/ECR, Google GKE/Container Registry)
この分野では、AWSが第一の選択肢と言えます。
↓AWSのサービス一覧。有名なのはEC2(サーバ)、S3(ストレージ)、RDS(データベース)、Route53(DNS)です。何個知っていますか?
VPS
例: さくらのVPS, ServerMan@VPS(DTI), GMO ConoHa...
クラウドと似たサービスとして、VPS(Virtual Private Service, 仮想専用サーバ)があります。 VPSでは、一台のサーバ(Linux)をOpenVZ等のコンテナツールによりOSレベルで仮想化し、複数のユーザが同時にサーバを利用できるように しています。複数ユーザが同時に利用することで、500円/月などの非常に安価にサービスが利用できることが特長です。 ただし、複数ユーザでの同時利用になるので、サービスの品質は保証されず、サービスによっては長期間CPUを占有することは 好まれません。 一見、クラウド(IaaS)と似ていますが、柔軟性は低く、その分安価になっています。
仮想化ソフトウェア
仮想マシンソフトウェア(VMwareなど)
例: VMWare, VirtualBox, Xen...
従来、1台のマシン(パソコンやサーバ)には1つのOS(Windows, Linux, Mac)が動作していました。 仮想マシンソフトウェアでは、この1台のマシン上に、複数の仮想マシンを作ることができます。 仮想マシンは、CPU、メモリ、ディスク、GPU(ディスプレイ)、キーボードなどの物理デバイスをもっていて、見かけ上普通のマシンと同じです。 好きなOS(Windows, Linuxなど)を入れてアプリケーションを動かすことができます。
クラウドサービスのサーバも仮想マシンソフトウェアにより構築されており、AWSではXenが使われています。 仮想マシン専用の軽量なOSはハイパーバイザとも呼ばれます。
コンテナソフトウェア(Dockerなど)
例: Docker, LXC, OpenVZ...
コンテナソフトウェアは、1台のマシンの中で、OSレベルで仮想化された環境(コンテナ)を作ります。 あくまでOSレベルですので、コンテナと、コンテナが動作するホストマシンでは同じOSです。 コンテナには専用のディレクトリが割り当てられ、CPU、メモリ等のリソースを割り当てたり、 ネットワーク、プロセス等の独立した名前空間が割り当てられますが、同じOS上で動作しますのでマシン(ホスト)からはコンテナの中を見ることができます。 OSの起動が必要ないので、コンテナの起動は一瞬です。 ディスクも差分で保持しますので、コンテナ起動直後はディスクは消費しません。
以前からコンテナの考え方はありましたが、Dockerはそれをシンプルで使い易いツールとしてまとめ上げ、軽量コンテナを一気に身近なものにしました。特にアプリケーションのデプロイを簡単にすることが大きな用途ですが、軽量で柔軟なことから開発・テストなど様々な用途で使える可能性を秘めています。Dockerイメージにより仮想環境を簡単に再利用できるようにしたことと、周辺ツールが充実しているのが大きな特長です。
最近では、クラスタ環境を構築するためのツール(Docker Machine, Docker Swarm, Docker Compose)や、クラウドで利用するサービス(Docker Cloud)、Mac・Windows上のインストーラ(Docker Toolbox, Docker for Mac)なども提供しています。
↓Dockerと関連ツールの概念・動作・使い方を解説した書籍『Docker実戦活用ガイド』です。
paiza.hatenablog.com
PaaS(Herokuなど)
例: Heroku, Cloud Foundry, dokku
ウェブアプリケーションをサーバ上で動作させるサービスです。 Ruby on Rails,LAMPなどのウェブアプリケーションを作成しPaaSサービスに送信するだけで、サービスをサーバ上で動作させることができます。 PaaSでは、アプリケーション開発環境に応じた設定やデプロイを自動で行いますので、 インフラのことをほとんど意識しなくても、ウェブサービスを動作させることができます。
ウェブサービスを動作させるにはインフラの知識が必要といいましたが、PaaSを使えばインフラの知識がなくても ウェブサービスを動作させることができると言えます。 小規模のシンプルなウェブサービスのインフラとしては第一の選択肢と言えます。
Herokuはこの分野で最も有名なサービスです。CloudFondryはオープンソースのツールで、言語/フレームワークごとに用意されたbuildpackと呼ばれるもので設定を行います。 また、DockerはもともとPaaSサービスのために作られたツールで、オープンソースのdokkuを用いれば Dockerコンテナを利用して簡単なPaaS環境を構築できます。
この分野では、Herokuが第一の選択肢と言えます。
構成管理ツール(Ansibleなど)
例: Puppet, Chef, Ansible, Dockerfile...
複数のサーバの状態を手動で管理していると、サーバによって状態が変わってしまったり、設定変更を忘れたりすることにもなります。 極力ミスを減らして自動化するには、構成管理ツールを用います。構成管理ツールでは、設定や操作をファイルに明示的に記述しておき、実際の変更はツールを用いて自動的に必要なサーバに適用します。 ChefはRubyで記述されたcookbook/レシピを組み合わせて設定します。Ansibleは最近人気が伸びてきているツールで、サーバにエージェントを入れる必要がないことが特徴です。 Dockerでは、最初の設定のみDockerfileに記述し、一度動かしたサーバの設定変更は行わないという思い切ったアイデアにより、構成管理ツール自体を不要にしています。このアイデアはImmutable Infrastructure(イミュータブル インフラストラクチャ, 不変なサーバー基盤)と呼ばれています。
↓Ansibleの設定ファイルの例。サーバの状態をテキストファイルで明示的に記述します。
デプロイ・オーケストレーションツール(Capistranoなど)
例: Capistrano, Fabric, git-push, Docker Compose, Kubernetes, Juju...
構成管理ツールと同じく、アプリケーションのサーバへのアップロードについても手動で行うのではなく、自動で行うことでミスを減らし効率を上げることができます。Docker ComposeやKubernetesでは、Dockerイメージを用いて仮想的なサーバ全体(コンテナ)ごと入れ変えるという思い切ったシンプルな方法を取ることで、環境依存の問題を避けています。
継続的インテグレーション・CI(Circle-CIなど)
例: Circle-CI, Jenkins
継続的インテグレーション(CI)は、ビルドなどの作業を自動化するツールです。Gitレポジトリのソースコード変更などのイベントに応じて、自動的にビルド・テストなどを行います。デプロイツールと組み合わせれば、デプロイまで自動化を行うことができます。
この分野では、Circle-CIが最も有名で第一の選択肢と言えます。
↓Circle-CIの管理画面。自動でビルドが行われ、結果がブラウザで確認できます。
まとめ
ウェブエンジニアが知っておくべきインフラ技術を紹介しました。 実際にはこれらのインフラ技術は相互に依存していたり、1つのツールが複数の機能をカバーしていたりします。 自動化を進めることで、作成した製品・サービスのリリース頻度をあげ、開発を大きく加速することができます。 全体としての組み合わせも大事ですので、まずは一通りの技術の概念や動作をサンプルを試したりして把握することをおすすめします。 また、Dockerはマイクロサービス・Immutable Infrastrucureなどインフラの考え方に影響を与えていますので、こちらも把握することをお勧めします。
関連記事: paizaの中の人による2016年のDocker本『Docker実戦活用ガイド』が本日発売! - paiza開発日誌
paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。