概要
ECSの基本的な概念を理解していなかったので、自分なりにまとめてみました。
ECS(Amazon Elastic Container Service)の特徴
- ECSは、コンテナ化されたアプリケーションの管理・運用を自動化する為の技術。この技術の事をコンテナオーケストレーションと言う
- 他のAWSサービスと連携する事で、コンテナを使用した大規模なサービスの構築が容易
- フルマネージドでコンテナを管理してくれる
AWS上でのコンテナ実行における選択肢
コンテナオーケストレーションは、「コントロールプレーン」と「データプレーン」という2つの概念から成り立っている
コントロールプレーン : コンテナを管理する為のサービス
- ECS
- EKS
データプレーン : コンテナを稼働させる為のサービス
- EC2
- AWS Fargete
どの起動タイプも、コンテナオーケストレーションを実現する為に、コンテナオーケストレータとECSコンテナエージェントと言うミドルウェアが必要となる。
- EC2タイプの場合は、コンテナオーケストレータとECSコンテナエージェントが組み込まれたEC2が起動する
- Fargateの場合は、Fargateコンテナエージェントが導入されている。AWS側で管理されている為、意識する必要は無い
ECS
とEKS
の違い
ECS : AWSが独自で構築して開発したコンテナオーケストレーションシステム
EKS : Kubernetes(K8s)
を基盤に構築して開発したコンテナオーケストレーションシステム
補足
コンテナオーケストレーションツールは、Docker Swarm(Docker社)、OpenShift(Red Hat)、Rancher(OSS(オープンソース))、Mesos/Marathon等がある
コンテナオーケストレータ
- 設定に基付いて、コンテナの状態を維持、管理する様にECSコンテナーエージェントに指示を出す機能
- サービスディスカバリ、ローリングアップデート、自動スケーリング、ロードバランシング等を設定に基付いて行う
補足
サービスディスカバリ : ECSクラスタ内で他のコンテナへアクセスする為のAレコード登録を自動的にECS
とRoute 53
にお願いできる
ローリングアップデート : 全てのタスク(コンテナのインスタンス)を同時に更新するのではなく、一部のタスクだけを順次更新していく方法
Aレコード : IPアドレス(IPv4形式)とドメイン名の関連付けを定義するレコード(書き方は以下)
hp-shizuoka.jp. IN A 192.168.0.1
www.hp-shizuoka.jp. IN A 192.168.0.1
ECSコンテナエージェント
- コンテナの中で動作している
- オーケスレータからの指示を基に、エージェントを通して、コンテナの維持、管理を行う機能
- クラスタの所属場所、コンテナの起動状況、コンテナのCPUやメモリの情報等をオーケストレータに送信している
-
Amazon ECS-optimized AMI
を元に起動した場合、事前にインストール済み - 自前で用意したEC2に対して、ECSコンテナエージェントをインストールして使用する事も可能
- ECSエージェントのイメージ図を以下に記載
ECSエージェントのGitHub
コンテナオーケストレータ(Orchestrator)とエージェント(Agent)用いた場合の仕組み
管理者とサーバーの間いに、Orchestrator、 Agentと言う仕組みを設置する。
- サーバーの管理者 or コンテナの管理者は、Orchestratorに対して何らかの指示(API call)を行う
- Orchestratorは、サーバーの中で動作しているAgentに対してコマンドを送る
- Agentは、Container Runtime(Docker Engine)に対してコマンドを送る
- イメージレジストリーにあるコンテナイメージをダウンロードする
- コンテナイメージを元に、コンテナが立ち上がる
コンテナオーケストレーションの重要性
コンテナオーケストレーションを使用していない
- 多数のコンテナを複数台のサーバで運用していると、どのサービスのどのコンテナがどのサーバで動いているのかを常に意識し、管理し続ける必要があり、運用負荷が高まる
- 運用の複雑化は、ヒューマンエラーを引き起こしかねない
上記の問題から、コンテナ運用が上手くいかなくなり、サービスの維持が難しくなる
コンテナオーケストレーションを使用している
- オーケストレータがある事で、管理者の指示をオーケスレータが受け取り、オーケスレータがコンテナホスト(クラスタ)に対してまとめて指示を出せる
- 各コンテナホストで動いている
Agent
がコンテナの状態を確認し、あるべき状態を維持、管理したり、設定した状態を維持、管理したりする - コンテナオーケストレーションを用いて構築したコンテナは、複数のコンテナホストがある場合でも安全にサーバ運用が実現できる
補足
コンテナホスト : コンテナ化されたアプリケーションを実行する為のサーバーまたは仮想マシン
コンテナオーケストレーション : コンテナの管理・運用を自動化して運用する技術
ECSの起動タイプ
ECSではコンテナを動かす為の実行環境(データプレーン)として「AWS Fargate」と「ECS on EC2」、「ECS Anywhere」の3つの起動タイプがある
- 「AWS Fargate」と「ECS on EC2」は、AWS上の仮想サーバ上で起動させる
- 「ECS Anywhere」は、オンプレミス環境でコントロールプレーンとしてECSを使用する為の機能
(今回は、ECS Anywhereについての詳細は割愛する)
ECS on EC2
EC2(Elastic Compute Cloud)インスタンスを使った仮想サーバ上でコンテナを起動するタイプ
仕組み
- クラスタ(コンテナホスト群)の中で多数のEC2が動作し、各EC2の中でコンテナを動作させる
- ECSで立ち上げたEC2には、
OS(Operating System)
、ecc-agent
、Docker Engin
が組み込まれている
Amazon ECS-optimized AMI(仮想マシンイメージ)
- ECC on EC2は、
Amazon ECS-optimized AMI
のイメージを使用して、ECSの環境を作成する
(OSの指定は行う必要がある) -
Amazon ECS-optimized AMI
は、DockerデーモンやECSコンテナエージェント等、コンテナインスタンスとして必要な物が全て組み込まれている仮想マシンのイメージ
特徴
- ホスト
OS
を柔軟に選択できる(Amazon Linux、 Windows、 Bottlerocket等) - EC2インスタンスのスペック(CPU コア数、メモリ、ストレージ等)が柔軟に選択できる
- 実稼働リソースの
OS
に直接介入する事が出来る(カーネルパラメータ等のチューニングが可能) - コンテナイメージを
EC2
内にキャッシュできるのでAWS Fargate
に比べてデプロイが早い - ホスト
OS
に対して、SSH
接続が可能
課題
-
OS
やソフトウェアエージェント類へのパッチ当てや更新を自前で行う必要がある - コンテナ環境の
OS
やDocker Engine
等、ホストマシンの管理や運用が必要
補足
ソフトウェアエージェント : 特定のタスクを自動的に実行する為のソフトウェア。一定のルールに基づいて動作し、ユーザーの代わりに様々なタスクを自動的に行う
(例 : メールクライアントのスパムフィルター、ウェブクローラー)
AWS Fargate
保守管理が不要なコンテナ向けサーバレスコンピューティングエンジン。AWS上でコンテナを動かす為のサーバー(例:EC2)に対して、何の設定も行わないでコンテナを実行する事が出来る機能。
仕組み
クラスターの中にあるAWS Fargateが、複数のタスクを管理して動作させる
特徴
- AWSが実行環境(コンテナを動かしている環境 : EC2)の保守、運用、管理を行うので、バージョンアップやセキュリティ対策等を気にしなくて良い
- コンテナのCPUとメモリを決まった組み合わせから選択出来る
- コンテナ数をオートスケールできる
課題
- コンテナホスト(EC2)に対して
SSH
接続は不可能 (コンテナ内に入る事は可能) - ホストの管理をAWS側で管理してくれる為、EC2より価格が高額になる
- パブリックIPの固定割り当てができない
(EC2インスタンスへのIPが自動割り当ての為、パブリックIPの固定割り当てができない。これにより、外部アクセスの為のIP許可や、API運用時に不便を感じる場合がある)
ECSの主要な構成要素
タスク定義
タスク(コンテナ)を構成する為の定義書。
タスク定義の主な設定項目
- コンテナの定義 : イメージ場所の指定
- コンテナ全体のCPU、メモリの設定または、コンテナ毎のCPU、メモリの設定
- タスクに割り当てるIAM : タスクが行う操作権限の範囲をタスク単位で決める事が可能
- マウントの設定 : EFSに接続する等
- ボリュームの設定 : データを永続化する為の機能
- ネットワークモードの選択
Fargate : avsvpc
EC2 : host(非推奨)、 bridge(Dockerの標準)、 none(特殊パターン)、 default(=bridge), awsvpc(AWS推奨)
タスク
タスク定義に基づいて起動するコンテナの集まり。1つのタスクに対して、1つ以上のコンテナで構成されている。
タスクの主な設定項目
- バッチ処理を行う場合は、タスクからの起動となる
サービス
複数のタスクを束ねる概念。もう少しわかり易く書くと実行中のタスクを管理する機能。下記の設定はサービスから起動する場合しか行えない為、常に起動させたいコンテナがある場合は、サービスから立ち上げる
サービスの主な設定項目
- タスクの実行数の維持、管理
- 起動後に動作しているタスクの維持、管理
- ALB、ELB(ロードバランサ)との連携
- Auto Scalingの設定が可能
- EC2 or Fargateの起動タイプを選択できる
(クラスタの設定によっては、選択できない場合もある)
クラスタ
コンテナホストを束ねる概念。もう少しわかり易く書くとサービスとタスクを実行する基盤
クラスタの主な設定項目
- 実行環境の境界 : 本番環境や開発環境を論理的に分ける事が可能
- IAM権限の境界 : クラスタが行う操作権限の範囲をクラスタ単位で決める事が可能
- スケジュールされたタスクの実行が設定可能 : コンテナの起動時間の設定が可能
補足
サーバー上でコンテナを動作させる仕組み(dockerの場合)
ローカル環境にて、dockerを使用して動作させるのと殆ど同じ挙動となる
- サーバーの管理者 or コンテナの管理者がコンテナを実行したいサーバーに
ssh
等でログインする -
docker run
等のdockerコマンドを実行する - dockerコマンドが入力された事で、Docker Engineがイメージレジストリーにあるコンテナイメージをダウンロードする
- コンテナイメージを元に、コンテナが立ち上がる
参考資料
- [公式]Amazon Elastic Container Service とは
- [AWS Black Belt Online Seminar] CON201 ECS 入門
- [AWS Black Belt Online Seminar] CON202 ECS での Fargate 入門
- 【初心者向け】Amazon ECS と EKS 入門!完全ガイド
- ECSとは? コンテナの基礎からECSの概要まで解説
- AWSでコンテナを支えるサービスについて ECS、EKS、Fargateの違いは? 第1回
- ECSの基本を理解する(クラスター、サービス、タスク定義、タスク)
- ECSを理解する(第2回)
- EC2 Container Serviceを使ってみる
まとめ
いろんなサイトを見て、自分なりに分かりやすくまとめてみました。もし、気になる点や間違ってる部分がありましたら、ご連絡頂ければと思います。