メインコンテンツに移動
AWS グラレコ解説

AWS で簡単にコンテナアプリケーションを構築 ! Amazon ECS をグラレコで解説

2023-02-02 | Author : 米倉 裕基 (監修 : 落水 恭介)

はじめに

※ 本連載では、様々な AWS サービスをグラフィックレコーディングで紹介する awsgeek.com を、日本語に翻訳し、図の解説をしていきます。awsgeek.com は 、Jerry Hargrove 氏が運営しているサイトです。

これまでのグラレコ解説はこちら »

builders.flash 読者のみなさん、こんにちは ! テクニカルライターの米倉裕基と申します。

本記事では、AWS 上で コンテナを簡単に実行、停止、管理できるコンテナオーケストレーションサービス「Amazon Elastic Container Service (以下 ECS)」をご紹介します。

現在、AWS が提供する代表的なコンテナオーケストレーションサービスは、ECS 以外に Amazon Elastic Kubernetes Service (EKS) があります。AWS 上でコンテナを動かす際にどちらのサービスを利用するかはケースバイケースですが、コンテナ管理システム「Kubernetes」を前提とした構成でなければ、ECS を利用することでより運用負荷を軽減する形でコンテナを実行できます。


X ポスト » | Facebook シェア » | はてブ »

builders.flash メールメンバー登録

builders.flash メールメンバー登録で、毎月の最新アップデート情報とともに、AWS を無料でお試しいただけるクレジットコードを受け取ることができます。 
今すぐ登録 »

コンテナサービスプラットフォーム

ECS は AWS 上でコンテナを管理するためのサービスと説明しましたが、そもそもコンテナ技術とは何なのでしょうか。初めに、コンテナとは何か、何ができる技術なのかについて見ていきます。

コンテナ

コンテナとは、1 台のマシン上で複数の仮想環境を実行する仮想化技術です。仮想化というとサーバー仮想化を連想しますが、コンテナはサーバー仮想化とは少し異なります。

サーバー仮想化では、一つのサーバー上に複数の仮想サーバーが起動します。個々の仮想サーバーは個別の OS とミドルウェアを搭載し、ホスト OS や他の仮想サーバーから論理的に分離された環境でプロセスを実行します。

一方、コンテナでは、1 台のサーバー上に展開された複数のコンテナがホスト OS のカーネルを共有するため、各コンテナにはプロセスの実行に必要な最低限のデータのみが格納されます。

コンテナを利用する利点の一つは、その可搬性 (ポータビリティ) の高さです。仮想サーバーのようにゲスト OS を起動する必要がないため、パッケージ化されたアプリケーションをどのような環境でも同じように実行でき、環境の移行や復元を簡単に行えます。

なお、このコンテナを実行する代表的なソフトウェアが Docker です。

A Japanese-language architecture diagram illustrating AWS ECS (Elastic Container Service) using Docker containers, Amazon ECR, EC2 auto scaling, ECS auto scaling, and CloudWatch. The diagram visually describes the relationships between code, dependencies, services, scaling, and deployment components within containerized AWS environments.

コンテナイメージ

コンテナイメージは、コンテナの中身を記録したスナップショットのようなものです。コードやランタイムを含む、アプリケーションの実行に必要なソフトウェアをカプセル化し、保持しています。

コンテナランタイムである Docker さえインストールされている環境であれば、即座にコンテナイメージを展開し、コードと依存関係をポイントインタイム (特定時点の状態) で復元できます。この環境の再利用性の高さも、コンテナの大きな魅力の一つです。コンテナレジストリと呼ばれるコンテナイメージ保存用のサービスで、安全に管理、共有することができます。

ECS で利用するコンテナイメージの作成ついて詳しくは「Amazon ECS で使用するコンテナイメージの作成」をご覧ください。

コンテナの実行環境

ECS はコンテナの起動やリソースの管理などを担うコンテナオーケストレーションサービスであり、実際にコンテナのワークロードを実行する環境は別に用意する必要があります。ECS では現在、以下の 3 つの起動タイプをコンテナの実行環境としてサポートしています。

    AWS Fargate
    フルマネージド型のサーバーレスコンピューティングサービスです。コンテナを実行する上で必要なインフラは AWS 側が管理するため、ユーザーはホストサーバーの管理が不要です。

    Amazon EC2
    ユーザー自身がコンテナ上の OS や Docker ランタイムの設定やセキュリティパッチの適用など、ホストサーバーである EC2 の管理を行います。ホストサーバーの構成やインスタンスタイプの選定など、要件に応じてユーザーが柔軟に選択できます。

    外部
    AWS 外のオンプレミスのインフラストラクチャをホストサーバーとして ECS クラスターに登録できます。この ECS の機能である「 Amazon ECS Anywhere 」を利用すれば、既存のオンプレミスの環境で実行されるコンテナアプリケーションを ECS で簡単に管理することができます。

ユーザーは、要件に従い自由に起動タイプを選択できます。

AWS サービスとの統合

ECS を利用する利点として、他の AWS サービスとの連携が容易という点が挙げられます。例えば、下記のような AWS サービスと統合されています。

    Amazon ECR
    コンテナイメージを保存、共有できるコンテナレジストリサービスです。ローカル環境で作成したコンテナイメージを Amazon ECR へプッシュして保存し、ECS を使用してコンテナをデプロイするといった利用が可能です。 AWS Identity and Access Management (IAM) を利用して、特定のユーザーからの利用のみを許可するアクセス制限を設定することもできます。

その他 ECS と統合された AWS サービスについて詳しくは、「Amazon ECS と統合された AWS のサービス」をご覧ください。

ECS の主要なコンポーネント

ECS は、主に「クラスター」、「タスク」、「サービス」の 3 つのコンポーネントで構成されています。

コンポーネント 説明 クラスター コンテナを配置する複数の Fargate、EC2 インスタンス、または外部インスタンス群で構成される概念です。クラスター内には複数のタスクが配置され、それぞれが独自のコンテナを実行します。 タスク クラスター上で実行されるコンテナ群で構成される概念です。タスクは特定のクラスター上で実行され、複数のコンテナを含むことができます。タスクの内容は、タスク定義と呼ばれる JSON 形式の設定ファイルで定義します。 サービス 特定のクラスター上で複数のタスクを管理し、スケーリングと冗長性を提供します。

AWS マネジメントコンソールからこれら 3 つのコンポーネントを作成することで、簡単にコンテナアプリケーション環境をセットアップできます。

    クラスターの作成
    クラスター名、インスタンスやネットワーキングなどを設定し、 クラスター を作成します。

    タスクの作成
    タスク定義 でコンテナの詳細、リソースの割り当て、環境変数などを設定し、 タスク を作成します。

    サービスの作成
    サービス名を指定し、作成したタスク定義とロードバランサーなど必要なオプションを選択し、 サービス を作成します。

ECS の開始方法について詳しくは、「Amazon ECS の開始方法」をご覧ください。

ECS サービス

ECS サービスは、クラスター内で起動するタスクの状態を管理します。サービススケジューラを使って、長期間稼働しているタスクをモニタリングし、タスクが失敗した場合、新しいタスクを再実行するなどの使い方ができます。

ECS サービスについて詳しくは、「Amazon ECS サービス」をご覧ください。

Diagram in Japanese illustrating the relationship between AWS ECS services, tasks, and clusters. The image includes container visuals and Japanese text explaining ECS task management, re-execution of failed tasks, monitoring, and task automation.

ECS タスク

ECS タスクは、タスク定義に基づいて起動される複数のコンテナのグループです。タスク定義では、起動タイプ (Fargate / EC2 / 外部) やメモリ/CPU の割り当て、ネットワーク設定など、コンテナの起動内容を定義します。

タスク定義について詳しくは、「Amazon ECSの タスク定義」をご覧ください。

AWS ECSタスクで設定できる項目(Dockerイメージ、CPUとメモリ割り当て、ネットワーク、ポート、IAMロール等)、利用可能なツール(CloudFormation、AWSコンソール、コマンドライン、SDK)、およびコストに関する情報(EC2、Fargate、EBSなどが課金対象、ECS自体は追加料金なし)を日本語でまとめた手書き風の図解です。

ツール

ECS を操作・管理するために、以下のようなデベロッパーツールが提供されています。

ツール 操作内容 AWS CloudFormation テンプレートファイルを使って、ECS クラスターやタスクなどのリソースを自動で作成・管理できます。 AWS マネジメントコンソール ブラウザから、ECS クラスターやタスク、サービスの作成、監視、管理などコンテナ操作全般を行います。 AWS CLI コマンドラインから、ECS リソースの管理やタスクを実行します。 AWS SDK Java、Python、Ruby、C#、JavaScript などのプログラム言語から、ECS リソースを操作します。

デベロッパーツールについて詳しくは、「Amazon ECS デベロッパーツールの概要」をご覧ください。

コスト

起動タイプ (Fargate / EC2 / 外部) によって、料金体系が異なります。EC2 を利用する場合は、利用したインスタンスタイプに応じた料金が課金されます。Fargate を利用する場合は、コンテナスペックに応じた従量課金です。ECS 自体の追加料金は発生しません。

ECS の利用料金について詳しくは、「Amazon Elastic Container Service の料金」をご覧ください。

タスク配置戦略

タスク配置戦略は、ECS がタスクをクラスター上のどのコンテナホストに配置するかを決定するためのアルゴリズムです。

EC2 起動タイプを使用するタスクでは、ユーザーが任意のタスク配置戦略を選択できます。なお、Fargate 起動タイプでは、タスク配置戦略を指定する必要はありません。

ECS では現在、以下の 5 種類のタスク配置戦略が提供されています。「カスタム」を選択すると、プリセットのテンプレートの代わりに、任意のタスク配置戦略を指定することができます。

コンテナインスタンスごとのワークロードを最適化し、コンテナアプリケーションを安定的に稼働させるために、最適なタスク配置戦略を選択します。

タスク配置テンプレート

内容

AZ バランススプレッド

アベイラビリティゾーン間およびアベイラビリティゾーン内のコンテナインスタンス間でタスクを分散します。

AZ バランスビンパック

利用可能な最小メモリで、アベイラビリティーゾーン間およびコンテナインスタンス間でタスクを分散します。

ビンパック

CPU またはメモリの最小利用可能量に基づいてタスクを配置します。

ホストごとに 1 つのタスク

各コンテナインスタンスのサービスから最大 1 タスクを配置します。

カスタム

独自のタスク配置戦略を定義します。

タスク配置戦略について詳しくは、「Amazon ECS タスク配置戦略」をご覧ください。

Amazon ECSのタスク配置戦略(Balanced, BinPack, 1 per Instance, Custom)を日本語で示した図。緑のブロックが各配置戦略のタスク割り当て例を示している。

ALB と動的ポートマッピング

ECSは、AWSが提供するロードバランシングサービス「Elastic Load Balancing (ELB)」と完全に統合されており、ELB が受信したトラフィックをタスク間で分散させることができます。

コンテナのネットワークモードが「bridge」モードの場合、ELB の Applicaton Load Balancer (ALB) または Network Load Balancer (NLB) を ECS に連携すると、動的ポートマッピングが有効になります。「bridge」ネットワークモードでは、コンテナインスタンス内の複数のタスクに別々のポートが付与されますが、動的ポートマッピングにより、ALB (または NLB) のターゲットグループへのトラフィックはデフォルトポート番号に自動変換されて複数のターゲットに分散されるようになります。

なお、ECS のネットワークモードとはコンテナの通信方式を指し、「bridge」のほかに「host」と「awsvpc」を選択できます。「awsvpc」の場合、同じコンテナ内の各タスクに個別のプライベート IP アドレスが付与され、ポートではなく IP アドレスベースで複数のタスクを扱えるため、動的ポートマッピングは不要です。ネットワークモードについて詳しくは、「ネットワークモードの選択」をご覧ください。

その他 ELB と ECS の連携について詳しくは、「サービスの負荷分散」をご覧ください。

A diagram illustrating how an AWS Application Load Balancer routes traffic to EC2 instances within an ECS cluster using host and container port mappings, with explanatory annotations in Japanese. The diagram shows port mapping and dynamic port assignment in a typical ECS setup.

EC2 スポットフリートによるコスト最適化

起動タイプとして EC2 を利用した場合、コスト最適化のアプローチとして EC2 スポットフリートを利用する方法があります。

EC2 のスポットインスタンスは、オンデマンドインスタンスと比べて最大 90% の割引料金で利用できますが、指定したキャパシティプールの空きが不足すると、利用者への通知後 2 分間の猶予期間をもってインスタンスがシャットダウンします。そのため、ステートレスなど中断に強いコンテナアプリケーションであれば、スポットインスタンスを利用することでコストを最適化できます。

ただし、EC2 スポットフリートに ECS クラスターを構築した場合、スポットインスタンスのシャットダウン前 2 分間に ECS 接続ドレインを呼び出し、自動的にコンテナをフリート内の別のインスタンスに移動させることができます。

スポットフリートを利用することで、自動でオンデマンドインスタンス、リザーブドインスタンス、スポットインスタンスを使い分けることができ、低コストでスケーラブルなシステムを実現できます。

EC2 スポットフリートを使った構成について詳しくは、Amazon Web Services ブログ「Docker、Amazon ECS、スポットフリート: 素晴らしい組み合わせ」をご覧ください。

AWS ECS(Elastic Container Service)の日本語アーキテクチャ図。Dockerコンテナのデプロイ・実行の自動化や、EC2インスタンスでのクラスター管理、VPCネットワーク構成、ECSエージェントによる通信管理などを図解したもの。

まとめ

最後に、本記事で紹介した機能の全体図を見てみましょう。

今回紹介した以外にも、ECS とさまざまな AWS サービスを組み合わせることで、さらに快適なコンテナアプリケーションの環境を構築できます。たとえば、AWS CodeBuildAWS CodePipeline と連携し、AWS CodeCommit リポジトリが変更されたタイミングで ECS を使ったコンテナアプリケーションの自動デプロイを実現する CI/CD 環境を構築することが可能です。

本記事を読んで ECS に興味を持たれた方、実際に使ってみたいと思われた方は、ぜひ製品ページの「Amazon Elastic Container Service (Amazon ECS)」も合わせてご覧ください。

全体図

著者・監修者プロフィール

Portrait photograph of a person with short dark hair, wearing glasses and a gray sweater, against a light blue background.

著者プロフィール

米倉 裕基
アマゾン ウェブ サービス ジャパン合同会社

テクニカルライター・イラストレーター

日英テクニカルライター・イラストレーター・ドキュメントエンジニアとして、各種エンジニア向け技術文書の制作を行ってきました。
趣味は娘に隠れてホラーゲームをプレイすることと、暗号通貨自動取引ボットの開発です。
現在、AWS や機械学習、ブロックチェーン関連の資格取得に向け勉強中です。

Outdoor portrait of a person with short black hair standing in front of trees.

監修者プロフィール

落水 恭介
アマゾン ウェブ サービス ジャパン合同会社

コンピュート事業本部 ソリューションアーキテクト

ベンチャーで Web サービスの開発に従事し、2018 年に Amazon Web Services Japan に入社。現在はソリューションアーキテクトとして活動中。主に Amazon ECS や Amazon EKS を中心とした、コンテナ関連の課題解決を支援している。