EC2サーバは使ったことがあり、ECSコンテナをこれから学習する方向け。EC2サーバの知識を活かしつつ、最速でECSコンテナ使いになるため、主な相違点を把握するための情報を提供する。ECSの用語(サービス、タスク、コンテナ、タスク定義)については、割愛。
目次
起動停止の意味
ECS起動=イメージからコンテナ実行プロセスを生成
EC2起動=仮想ディスクから仮想OSを起動
- EC2サーバにおける「EC2起動」は、EBS(= 仮想ディスク)から起動する。仮想ディスクには前回使用時の仮想マシンのデータが保存されており、過去のデータが参照可能となる。
- ECSコンテナにおける「コンテナの起動」は、コンテナのイメージからコンテナ実行プロセスを生成することを指す。AMIのイメージからEC2を作成する行為に類似しており、毎度イメージの初期状態でコンテナが起動する。
ECS停止=コンテナ削除 EC2停止=OSシャットダウン
- EC2サーバにおける「EC2停止」は、仮想マシンのOSシャットダウンに相当。
- ECSコンテナにおける「コンテナ停止」は、コンテナの削除となる。
- 補足事項
- ECSコンテナの停止は、ECSのAWSコンソール画面から「必要なタスク」を「0」にすることで、コンテナを停止する。
- コンテナはホストにおけるメモリ上のプロセスとして稼働するため、ECSコンテナの停止は、ホストから見るとプロセスの停止と同等。
- ECSではないdockerのコンテナでは、コンテナを削除せず停止するのみの、docker stopというコマンドもあるが、ECSでコンテナを停止する場合は、このdocker stopではなく、docker rm 相当の動作(コンテナ削除)となる。
ログイン
ECS:ECS Exec EC2:SSH or RDP
- ECSもEC2(SSH,RDP)と同様にログインして、操作することが可能。ただし、ECSの場合は、ECS Exec(SSMを利用したログイン)を利用する。
- 補足事項
- ECSコンテナもEC2のように、linuxコマンドが使用できるが、一部使用できないコマンドもある。
ファイル、ディレクトリの作成
ECS:揮発性 EC2:永続性
- ECSコンテナも、EC2サーバと同様に、ファイルやディレクトリを作成することができる。
ただし、相違点として、ECSコンテナはあくまでメモリ上のプロセスであるため、見た上作成したファイルやディレクトリは、ホストのメモリ上に書き込まれたにすぎない。(一方EC2サーバであれば、EBSの仮想ディスクに書き込まれる。) - また、上記の通りECSではコンテナを停止すると、コンテナは削除されるため、コンテナには永続的に必要なデータを保管することはできない。仮に永続的なデータ保管が必要な場合は、コンテナにEFSのマウントが必要となる。
ログ保管
ECS:コンテナの標準出力、エラー出力を外部(CWLなど)に保管
EC2 : ローカルディスク保存または、外部に保管
- EC2の場合は、OSの標準機能でローカルディスク(EBS)にログ(syslog やイベントログ)を保存することができる。また、必要に応じて、Cloud Watch Logsへ連携することで、Cloud Watch上での監視も可能。
- ECSの場合は、ログをローカルディスクに保管できないため、コンテナから出力される標準出力と、標準エラー出力をCloud Watch Logs等へ連携して保管する。
- 転送する前にログを整形したり、フィルタ、転送先のカスタマイズを行いたい時はサイドカー(Fluentbit)を利用することで可能となる。
コンテナ間通信、サーバ間通信に必要な設定
ECS : 同一タスク内のコンテナ間通信か、タスクを跨ぐコンテナ間通信かで異なる
EC2 : EC2サーバ単位のセキュリティグループ(+NACL)+ルーティングでOK
- EC2サーバ間の通信を行うには、ルーティングとセキュリティグループ(NACL含む)のポート開放が必要。
- ECSコンテナの場合は、同一のタスク内に存在するコンテ間通信かタスクを跨ぐコンテナ間通信で必要な設定が異なる。
- 同一タスク内のコンテナ間通信の場合
特にAWS側の設定は何もなくとも通信可能となる。(タスク定義の記述ルールはあるので注意。Amazon ECS クラスターの NGINX ワークロードのサンプル – Amazon CloudWatch - links の部分の記述が必要) - タスクを跨ぐコンテナ間通信の場合
コンテナ間通信を実現するための手段として、以下の選択肢がある。- ECS Service Discovery
- ELB
- AppMesh
- ECS Service Connect
上記、コンテナ間通信の詳細はこちらを参照:
VPC 内の Amazon ECS サービス間のネットワーキング – Amazon Elastic Container Service
【レポート】ECSサービス間通信をシンプルにするAmazon ECS Service Connect #reinvent #CON323 | DevelopersIO (classmethod.jp)
- 同一タスク内のコンテナ間通信の場合
ECSコンテナとEC2サーバとアプリケーションの関係性
EC2:1台のサーバ上に複数アプリケーション(プロセス)を稼動させることが可能
ECS:1台のコンテナには1プロセスのみ稼動させる。
- EC2は、1台のサーバ上に任意の数のアプリケーション(プロセス)を稼動させることができる。つまり、1台のサーバ上にDBとwebのアプリケーションを共存させるというような構成も可能。
- ECSコンテナは1コンテナでアプリの1プロセスで実装する必要がある。ECSに限らず、コンテナの原則とされている。
アプリケーションのリリース&バージョンアップ(デプロイ)
EC2:ファイル更新によるバージョンアップ
ECS:コンテナごと再デプロイしてバージョンアップ
- EC2サーバへのアプリケーションリリース(バージョンアップ)は、EC2サーバ上の特定のディレクトリに対して、アプリケーションファイルの配布(更新)することで行う。
- ECSコンテナでのアプリケーションリリース(バージョンアップ)は、アプリケーションを更新したコンテナのイメージを再作成して、コンテナごとデプロイする。
EC2サーバ/ECSコンテナ内の環境個別設定
EC2:OSにログインして直接設定変更を行う。
ECS:タスク定義の環境変数を使用して、コンテナ外部から設定する。
- EC2は、OSにログインして直接設定を変更する。
- ECSは、タスク定義の環境変数を活用し、コンテナの外部からコンテナ個別の設定を行う。