ECSとは? コンテナの基礎からECSの概要まで解説

ECSとは、Amazon Elastic Container Service(Amazon ECS)の略で、AWSでDockerコンテナのデプロイや運用管理を行うための、フルマネージドなコンテナオーケストレーションサービスです。近年、アプリケーションやWeb開発において「コンテナ」や「ECS」という言葉をよく耳にしますが、実はよく知らない、実際に使ったことはないという方も多いのではないでしょうか?
今回は、コンテナやECSについて詳しく知らない方や、知ってはいるけど触ったことはない方に向けて、コンテナとは何か、ECSとはどういったサービスなのかを用語の意味など含め解説していきます。

コンテナとは

コンテナの特長と概要

コンテナとは、「アプリケーションを動かすための環境を仮想化する技術」です。
アプリケーションを動作させるには、アプリケーション本体やOSの他にミドルウェア、ライブラリなど必要な要素が複数あります。コンテナはそれらの要素をパッケージングして、1つにまとめる技術と考えれば分かりやすいかもしれません。

コンテナを動かすためのプラットフォームはいくつかありますが、本記事ではコンテナのデファクトスタンダードである「Docker」をベースに解説していきたいと思います。

仮想マシンとコンテナの違い

従来の仮想化技術は、「ハイパーバイザー型」と言われる方法が主流でした。これは、サーバ上でハイパーバイザーと呼ばれる仮想化ソフトウェアを起動させることで、仮想的にOSを動かすための環境を構築する方法です。例えばWindows OS上でLinux OSを動かしたり、MacOSでWindowsを動かしたりと、ホストOSの種類に縛られず仮想マシンごとにOSをインストールできるため、自由度の高いOS動作環境を構築することができます。

しかし、自由度が高い反面、ハイパーバイザー型の仮想環境では必要なものをOSから全てインストールする必要があります。そのため、使わない機能やソフトウェア、ミドルウェアなどもインストールされてしまい、結果として必要な動作スペックが上がってしまったり、ディスク容量が肥大化してしまったりといったデメリットがありました。

コンテナ型の仮想化技術では、カーネルや基本ソフトウェアと呼ばれるOSの基本的な役割をコンテナエンジン(Docker)が担うことにより、より少ない容量、より少ないリソースで稼働させることが可能になります。

カーネルとは、OSのコアとして、ハードウェアとソフトウェアの仲介など、OS機能の基本的な役割を担う部分です。シェルや、よく使うコマンドは基本ソフトウェアと呼ばれています。カーネルと基本ソフトウェアにOSとしての独自機能を持たせたものがUbuntuやCentOSと言ったLinux OSと呼ばれているものになります。

コンテナで使用するOSに当たる部分には、必要最低限のコマンド、ミドルウェアで構成されているのが一般的で、ハイパーバイザー型と比較して非常に小さいサイズとなっています。

ハイパーバイザー型ではOSのインストールディスクやISOイメージなどからOSをインストールして構築しますが、Dockerではコンテナの元となるイメージを、Docker Hubなどのリポジトリサービスからダウンロードします。Docker HubはDocker社が提供しているDockerの公式リポジトリで、誰でも使用できる公開リポジトリと、非公開のプライベートリポジトリがあり、公開リポジトリにはすぐに使用できる、様々なアプリケーションのDockerイメージが提供されています。

コンテナのメリットと課題

コンテナの概要や、既存の仮想環境との違いについて説明しました。次はコンテナを活用するメリットと、利用時の課題について解説します。

コンテナのメリット

・処理速度が早い

無駄なものを排除したコンテナは、非常に軽量で実行速度が早いことが特長の一つです。ほとんどの場合、コンテナの実行は数秒で完了します。

・容量が少ない

コンテナエンジンがカーネルの役割を担い、コンテナは不要なソフトウェアを省いているため、Docker Hubで公開されているコンテナのイメージは数MB~数百MB程度と非常に軽量です。

・環境移行が容易

Dockerでは作成したコンテナを別の環境に移行することが簡単にできます。そのため、ホストのリソースが足りなくなったので、別のサーバにコンテナをコピーして実行したいという場合でも環境構築と移行の手間を軽減することが可能です。

・自分のアプリ開発に集中できる

開発環境をコンテナの中に構築しておくことで、開発者はアプリ間の干渉を気にせず、自身の開発に集中できます。

・サーバのリソースを有効活用できる

1台のサーバで複数のコンテナを実行できます。先程解説した通り「ハイパーバイザー型」と比較し必要なリソースが少なく済むため、より多くのコンテナを実行することが可能です。

コンテナが持つ課題

・煩雑な運用管理

コンテナには「1コンテナに1プロセスだけを起動させる」というベストプラクティスがあります。ベストプラクティスに沿う形にした場合、Webサーバ用のコンテナ、データベース用のコンテナなど、必要に応じてコンテナを分ける必要があるため、結果として沢山のコンテナを運用・管理しなくてはいけないという課題があります。

・対障害性

「ハイパーバイザー型」と同様に、ホストOSが何かしらの障害で起動しなくなってしまった場合、その中で動いているコンテナ全てに影響が出てしまい、対策をしていないとサービスの提供に影響が出てしまいます。

コンテナオーケストレーション

コンテナの課題は「煩雑な運用管理」と「対障害性」であると解説しました。本番環境でコンテナを動かす場合、一部のコンテナが停止しても提供しているサービスが停止しないように、可用性や冗長性を考慮し、複数のコンテナを、複数のサーバに分散させておく方が安全です。

しかし、多数のコンテナを複数台のサーバで運用していると、どのサービスのどのコンテナがどのサーバで動いているのかを常に意識し、管理し続ける必要があり、運用負荷が高まってしまいます。そして運用の複雑化は、ヒューマンエラーを引き起こしかねません。これらの課題を解決するのがコンテナオーケストレーションと呼ばれる、コンテナの管理・運用を自動化するための技術です。コンテナオーケストレーションは複数台のサーバをクラスターとして構成し、クラスター上でコンテナを自動配置し、ロードバランシングする機能を有します。

次項ではコンテナオーケストレーションサービスとしてAWSのECSについて解説をしていきます。

ECSとは

ECSの特長

ECSとは、Elastic Container Serviceの略で、AWS(Amazon Web Service)上でDockerコンテナを管理するための、フルマネージド型のコンテナオーケストレーターです。コンテナオーケストレーターはコンテナの実行環境ではないため、ECSを理解するには、ECS自体がコンテナの正常稼働をサポートするサービスであることを意識する必要があります。コンテナオーケストレーションは「データプレーン」と「コントロールプレーン」という2つの概念から成り立っています。

コントロールプレーン:コンテナを管理するためのサービス
データプレーン:コンテナを稼働させるためのサービス

ECSはコンテナを管理するためのコントロールプレーンとなり、AWSではデータプレーンをとして、3つの起動タイプを提供しています。

ECSの起動タイプ

ECSではコンテナを動かすための実行環境(データプレーン)として「Fargate」と「ECS on EC2」、「ECS Anywhere」の3つの起動タイプを提供しています。「Fargate」と「ECS on EC2」はAWS上の仮想サーバ上での動作となりますが、「ECS Anywhere」はオンプレミス環境でコントロールプレーンとしてECSを使用するための機能となります。

・Fargate

保守管理が不要な、コンテナ向けサーバレスコンピューティングエンジンです。AWSが実行環境の保守運用管理を行うので、バージョンアップやセキュリティ対策などを気にしなくていいこと、つまりサーバの管理から開放されることが最大の特長となります。そのままでは、ホストやコンテナに対しSSH接続をすることができませんが、「ECS Exec」を使用することでコンテナにSSH接続することができます。

・ECS on EC2

EC2(Elastic Compute Cloud)インスタンスを使った仮想サーバ上でコンテナを起動するタイプです。コンテナを動かすホストのOSにSSH接続が可能で、稼働中のコンテナのシェルに直接入ることができます。また、ミドルウェア、セキュリティのアップデートなどの運用管理を行うことができ、「他の実行環境とバージョンを揃えたい」場合など、任意にサーバ構成を管理できることも特長の一つです。

・ECS Anywhere

こちらはAWS上に実行環境を用意する「Fargate」、「ECS on EC2」とは違い、ECSの機能を利用して、オンプレミス環境上でコンテナの管理をするための機能です。

ECSの構成要素

ECSを適切に使用するには、構成する要素を理解する必要があります。ここではECSの構成要素である「タスク定義」、「タスク」、「サービス」、「クラスター」について解説していきます。

・タスク定義

タスクを作成するためのテンプレート定義です。起動タイプ、コンテナ定義、タスクサイズ、割り当てるIAMロールなどをここで定義します。

・タスク

タスク定義に基づいて起動するコンテナの集まりを指します。1つのタスクは1つ以上のコンテナで構成されています。

・サービス

ECSで実行されるタスクを管理する機能です。タスク数の維持や、使用するLBの設定、ネットワーク設定が含まれています。

・クラスター

サービスに基づいてタスクを実行するための、コンテナ実行基盤です。例えば、クラスターを分けることで、本番環境や開発環境を論理的に分けることができます。

まとめ

本稿ではコンテナとECSの概要について解説しました。次回は実際にコンテナを作成し、ECSを使ってWEBサーバを動かすまでを解説します。
ECSでコンテナを作成するには?Dockerの環境構築から動作確認までを解説