AWSの仮想サーバーであるEC2から学びはじめて、次に何を学べばいいか、実務に活かせば良いかお悩みの方も多いかと思います。

AWSでは、昨今のシステム開発において存在感を高めている「コンテナ」に関する技術・サービスが多数提供されております。これらを用いる事により従来のレンタルサーバーやVPSと違う「コンテナ化」と呼ばれる手法により、サービス運用に関する様々な問題を解決できる可能性があります。


■そもそも、コンテナとは何か?

サービスを構成するアプリケーション・ミドルウェアや、それらに関する依存関係をひとまとめにしたものを「コンテナ」と呼び、従来のOSから組み立てる「仮想化」の技術と似ていながら、高い信頼性と低い学習コストを備えた仮想化の代替手段です。

昨今のソフトウェア開発においては、「コンテナ」と呼ばれるものの殆どがDocker社がメインとなって開発されたDockerを指しています。


■コンテナを使うと何がどうなるのか?

例えばEC2が2台+RDSによる簡単なWebアプリケーションを例に挙げましょう。

その時、ECSを使ってコンテナ化すると次の様になります。

一見すると何も変わってない?いえいえそんな事はありません。
アプリケーションのレイヤにコンテナ技術を導入する(=コンテナ化)事によって、サービスの直面する様々な課題を解決したり、開発と運用のプロセスを最適化できる可能性があります。


■コンテナを使って解決できる課題

あまり変わってないけど、なぜコンテナを採用するのか?それは、今抱えている課題がコンテナ化によって解決出来る可能性があるからです。 ここで重要なのは、課題は「稼働しているシステム」に対するものだけではなく、開発/テスト/運用のプロセスまでも含めて考える必要があることです。

先程の例はHTTPリクエストを起点とした捉え方でしたが、開発者視点で見たコンテナ化の図として上図のようなものを考えてみます。

例えばJenkins/GitHub/EC2の組み合わせで動くアプリケーションのデプロイについて考えてみます。すべてのデプロイ・CIやテストはJenkinsを通じて実行され、CIに関しては専用のインスタンスでテストを実施するような開発現場があったとします。

そこでJenkinsが行っていたタスクをGitHub Actionsで代替できると仮定すると、上図のような構成にリプレイスできます。

コンテナ化を行うメリットとして、一度そのコンテナを構成するデータがあれば複製することが容易である、という点があります。
それによって多数の開発者が同じシステムを触る現場においては、Jenkins(に相当するタスクランナー等)の今の稼働状況を気にする事なくテストを行え、デプロイに対してもGitHubから直接コンテナを管理するサービスに対して呼ぶ事で、複雑なデプロイフローを一元管理されたタスクとして定義して便利に扱えるようになります。

また、メンテナンスの行き届いていない現場では開発者が本番環境のアプリケーションやライブラリのバージョンを意識しきれないケースもありますが……

コンテナを使う事で依存関係を綺麗に管理する事も出来ます。

ここでは語りませんが、CI/CDの効率を最大化する手法はDevOpsの実践として例に挙がることが多いので、興味を持たれた方はそういったキーワードで調べてみると面白いかもしれません。

上記例のような「開発環境の変化」を軸にとって、簡単な事例を挙げながら解決できる課題に対して説明しようと思います。

【課題①】サービスに新しい機能を追加したいが、機能が複雑で負荷も見積もりづらいし、ライブラリのアップデートも必要になった

コンテナ化を行うと、例えばそれらを管理するECS, EKSを活用する事によりコンテナごとの台数を自由に増減させられるようになり、またそれらは独立したミドルウェア上で動くことになるので、別個に開発・運用ができるようになります。

【課題②】新しくWebサービスを作ってみたいが、サーバー構築と運用に関するノウハウが無いため、アプリ開発者だけでは手の届かない範囲に何が起こるか不安

コンテナは「サーバーを構成するミドルウェアをコードで記述して、開発者自身の端末やテスト用の環境で同じ状況を再現できる」ため、専門のインフラエンジニアが居なくてもテスト環境の整備にかかるコストがぐっと低くなり、一度構築したアプリケーションの環境をいつでも変更・再構築できます。

【課題③】頻繁に更新されるシステムで、デプロイの度に複雑なシェルスクリプトを走らせたり、ミドルウェアのアップデート等の大幅な仕様変更があった日には深夜メンテナンスを入れて本番テストを行うような安全策を取る必要がある

世界中に沢山のユーザーが居る「コンテナ化技術」を採用することで、秘伝のタレや複雑な運用手順から開放され、信頼性のあるデプロイ手段を得ることが出来ます。

【課題④】アプリケーションのテストはユニットテストで済ませているが、実際にサーバーにデプロイすると想定外のエラーが出て、毎回対応に追われている…

もちろんコンテナを採用するといって急に本番環境を変える必要はありません。開発環境・テストのフローにのみコンテナを採用するだけでもテストに対する工程を減らしたり、コンテナ上でE2Eテスト(Selenium等を利用して、ブラウザ経由で操作を行って操作結果の仕様を確認するテスト)を行うことも出来るようになります。 もちろんこれらはあくまで形式化された事例に対する解決策としてコンテナ化が手段となりえるだけで、実際は開発チームや運用プロセスによって享受できるメリットや考慮するべきデメリットについて考えなければいけません。

第2回では、 コンテナを検討するべきタイミング やコンテナのメリット、デメリットについてお伝えいたします!