ECSについて
ECSとは
Amazon Elastic Container Service(ECS)は、AWSが提供するマネージドコンテナオーケストレーションサービス。
Dockerコンテナのデプロイ、管理、スケーリングを簡単に行えるプラットフォームで、開発者はインフラ管理の負担を減らしつつ、アプリケーションに集中することが可能に。
ECSの特徴
- フルマネージド:ECSはインフラストラクチャの管理が不要で、AWSが自動的にコンテナのオーケストレーションやスケーリングを行う。
- 柔軟なスケーリング:ECSは、アプリケーションの負荷に応じて自動的にコンテナ数を増減させ、効率的なリソース利用を実現。
- AWSとの統合:他のAWSサービス(Amazon EC2、Fargate、CloudWatch、IAMなど)とシームレスに統合でき、セキュリティやモニタリング、スケーリングが容易。
ECSの実行オプション
Fargateモード:Fargateはサーバーレスなコンテナ実行オプションで、インフラ管理が不要。アプリケーションのコードだけに集中したいときに便利。
EC2モード:ユーザーがEC2インスタンスを用意し、その上でコンテナを実行。リソースやコストをきめ細かく制御したい場合に適している。
つまり
AWSがいい感じにコンテナを管理してくれるサービスのこと!
コンテナとは
そもそもコンテナって何だろう。。
コンテナは、アプリケーションやその依存関係をまとめてパッケージ化し、異なる環境でも一貫した動作を保証する技術。
仮想マシン(EC2等)と異なり、コンテナはホストOSのカーネルを共有するため、より軽量で起動も高速になる。
コンテナの特徴
- 軽量性:コンテナはホストのリソースを効率的に活用し、メモリやストレージの消費を抑えることができる。
- 移植性:コンテナでパッケージ化されたアプリケーションは、どんな環境でも同じ動作をするため、開発環境と本番環境の差異を気にする必要がない。
- スケーラビリティ:コンテナを使用すると、アプリケーションを複数の環境に迅速に展開しやすく、負荷に応じて簡単にスケールが可能。
コンテナと仮想マシンの違い
コンテナは仮想マシンのようにOS全体を仮想化するわけではなく、アプリケーションの実行環境だけを分離して実行する。
このため、仮想マシンと比較して軽量で、起動や停止が速いのが特徴。
イメージ
濃い青の部分がコンテナにあたる。
OSの上に複数PCを立ち上げ、オーケストレーションサービス(ECS)で管理しているイメージ。
ECSの主要機能
クラスター (Cluster)
クラスターは、ECSでタスクを実行するための論理的なグループのこと。クラスターには、EC2インスタンスまたはAWS Fargateのようなコンテナを実行する環境が含まれる。複数のクラスターを使用して、異なるアプリケーションやサービスのタスクを分離して管理が可能。
タスク定義 (Task Definition)
タスク定義は、実行したいコンテナの設定情報を定義したテンプレート。どのDockerイメージを使用するか、必要なリソース(CPUやメモリ)、環境変数、ネットワーク設定などを記述する。タスク定義は1つのコンテナのみならず、複数のコンテナの組み合わせ(タスク)を定義することも可能。
タスク (Task)
タスクは、タスク定義に基づいて作成される実行中のコンテナインスタンス。タスクは一度限り実行されるものや、サービスによって管理される継続的なものがある。ECSは、タスクのライフサイクルを管理し、適切なリソースにデプロイする。
サービス (Service)
サービスは、指定された数のタスクを常に実行し続けるよう管理する機能。タスクが異常終了した場合、サービスは自動的に再起動して設定された数を維持する。また、ロードバランサーと連携して、高可用性のWebアプリケーションやAPIを提供する際に使用される。
コンテナにアプリをデプロイするには
1.Dockerイメージの作成
アプリケーションのソースコードと必要な依存関係をまとめてDockerfileを作成。
Dockerfileは、ベースイメージやインストールするパッケージ、実行するコマンドなどを定義する。
コマンド例:docker build -t my-app .
2.Dockerイメージのプッシュ
作成したイメージをコンテナレジストリ(例: Amazon ECR, Docker Hub)にプッシュする。
これにより、ECSやFargateからイメージにアクセスできるように。
コマンド例:docker tag my-app:latest <レジストリURL>/my-app:latest docker push <レジストリURL>/my-app:latest
3.タスク定義の作成
ECSのコンソールまたはCLIを使って、デプロイするコンテナの設定を含むタスク定義を作成。
使用するイメージ、メモリやCPUのリソース、ポート設定を指定する。
4.クラスターの作成
ECSクラスターを作成。Fargateを選択する場合は、EC2インスタンスの管理が不要になる。
EC2を選択する場合は、インスタンスを指定する必要がある。
5.サービスの作成
サービスを作成し、デプロイしたいタスク定義を指定する。サービスは常に指定した数のタスクが実行されるように管理。
必要に応じてオートスケーリングやロードバランサーも設定する。
6.デプロイと監視
サービスが稼働し、指定したコンテナが起動。ECSのコンソールでログやタスクの状態を確認し、正常に動作しているか監視していく。
おすすめハンズオン教材
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-reg-event.html?trk=aws_introduction_page
AWS公式のもの。実際に手を動かすことでよりイメージが持てるように!
疑問点
Q1 . Fargateはアプリケーションを動かしている間はずっと起動しているイメージ?
例えば、バックエンドコンテナだとAPIを送るたびにサーバがきどうしてコンテナ立ち上がるイメージで合ってる?
A .
Fargateを利用する場合、APIリクエストに応じてコンテナを立ち上げるのではなく、常にコンテナを稼働させておく設定が一般的。
Q2. 常時起動しているのであれば、EC2起動時とあまり変わらないのでは?
A.
基本は管理の面で差が出てくる。下記詳細。
稼働状況:
- Fargate: コンテナが常時稼働している設定が一般的。コンテナのリソースに基づいて、必要なときだけコンテナを起動することも可能であるが、実際には多くのアプリケーションが常時稼働するように設計されている。
- EC2: EC2インスタンスも常時稼働させることができるが、必要なときだけ起動・停止するような設定も可能。
管理の手間:
- Fargate: コンテナの管理やインフラのプロビジョニングが不要で、サーバーのメンテナンスやアップデートをAWSが行ってくれる。これにより、開発者はアプリケーションのコードに集中できる環境が整っている。
- EC2: インスタンスの設定やメンテナンス、セキュリティパッチの適用、スケーリング設定など、管理業務が必要になる。
運用の柔軟性:
- Fargate: コンテナベースのアーキテクチャに特化しているため、マイクロサービスやサーバーレスアプローチに適している。
スケーリングが容易で、自動的にリソースを管理してくれるのも大きな利点。 - EC2: より高度なカスタマイズが可能だが、その分管理が複雑になることがある。
まとめ
ECSは、コンテナ管理をシンプルにしてくれる便利なツールで、特にFargateを使えばサーバーの管理を気にせずコンテナを動かせるのが大きな魅力。一方で、EC2で自由度高くコントロールしたい場面もあるので、プロジェクトに合わせて選択肢を使い分けるのがポイントに。
システムのニーズに合わせて柔軟に使い分けていきたい。