👁 0

Amazon ECS / Fargate講座

この講座では、AWSのコンテナオーケストレーションサービスであるECSとFargateについて学びます。

  • コンテナオーケストレーションの必要性
  • Amazon ECSの概要と特徴
  • ECSの構成要素(クラスター・タスク定義・サービス)
  • EC2起動タイプとFargate起動タイプの違い
  • AWS Fargateのメリット

1. Amazon ECSとは

1.1 コンテナオーケストレーションの必要性

AWSのEC2などのサーバにDockerをインストールし、DockerコマンドやDocker Composeによりコンテナを起動すれば、コンテナのアプリケーションをデプロイすることはできます。

しかし、この構成には以下のような問題点があり、本番環境でコンテナのメリットを十分に活かすことができません。

EC2自体の管理が必要

まず、Dockerを動かすためのEC2インスタンス自体を管理しなければなりません。OSのパッチ適用やセキュリティアップデート、ディスク容量の監視、インスタンスの障害対応など、サーバ運用の負担がそのまま残ります。コンテナによりアプリケーションのデプロイは容易になっても、その外側のインフラの運用負荷は軽減されません。

スケーリングや障害復旧が手動になる

アクセスの増加に応じてコンテナを増やしたり、異常終了したコンテナを再起動したりする作業を手動で行う必要があります。トラフィックの変動にリアルタイムで対応することが難しく、障害発生時にはサービスが停止し続けるリスクがあります。また、複数サーバにコンテナを分散配置する場合、どのサーバにどのコンテナを配置するかの管理も煩雑になります。

ダウンタイムなしのデプロイが難しい

アプリケーションを更新する際、既存のコンテナを停止してから新しいコンテナを起動する必要があるため、デプロイ時にサービスの中断が発生します。ローリングデプロイやBlue/Greenデプロイといった高度なデプロイ戦略を、ロードバランサーとの連携も含めて手動で実現するのは非常に手間がかかります。

以上のような課題を解決するために必要となるのが、コンテナオーケストレーションです。

1.2 Amazon ECSとは

Amazon ECS(Elastic Container Service)は、AWSが提供するコンテナオーケストレーションサービスです。前述したスケーリング・障害復旧・デプロイといった課題を、AWSの仕組みの中で自動的に解決してくれます。

代表的なコンテナオーケストレーションツールとしてはKubernetesが広く知られていますが、Kubernetesは学習コストや運用の複雑さが課題となることがあります。ECSはAWSに特化することでよりシンプルな構成となっており、AWSを利用しているプロジェクトであれば導入しやすいのが特徴です。

ECSの主な特徴を以下にまとめます。

フルマネージドである

コンテナのスケーリングや配置、障害時の復旧といった管理の仕組みをAWSが提供・運用します。ユーザはこれらの仕組みを自前で構築する必要がなく、アプリケーションの開発・運用に集中できます。

💡 ポイント
ECSのようなコンテナオーケストレーションでは、コンテナの管理・指示を行う部分を「コントロールプレーン」、実際にコンテナが動作する部分を「データプレーン」と呼びます。ECSではコントロールプレーンをAWSが完全に管理しており、ユーザはデータプレーン(EC2またはFargate)を選択するだけで利用できます。
なお、これらはアーキテクチャ上の概念であり、ECSに「コントロールプレーン」「データプレーン」という設定項目があるわけではありません。

AWSサービスとの統合がしやすい

ECSは、ECR(コンテナイメージの管理)、ALB(ロードバランシング)、CloudWatch(監視・ログ)、IAM(権限管理)など、AWSの各種サービスと深く統合されています。これらを組み合わせることで、効率的なコンテナ環境を容易に構築できます。

Kubernetesと比べて学習コスト・運用難易度が低い

Kubernetesは非常に高機能ですが、その分構成要素や概念が多く、学習や運用のハードルが高くなりがちです。ECSはAWSに特化したシンプルな設計のため、覚えるべき概念が少なく、AWSの知識があれば比較的短期間で導入・運用を始めることができます。

2. ECSの構成要素

続いて、ECSを構成する要素をみていきたいと思います。

ECSの構成要素の階層関係を以下に示します。

graph TB
  subgraph Cluster["クラスター"]
    subgraph Service["サービス"]
      subgraph Task1["タスク"]
        C1[コンテナ]
      end
      subgraph Task2["タスク"]
        C2[コンテナ]
      end
    end
  end
  TD[タスク定義] -. "テンプレート" .-> Task1
  TD -. "テンプレート" .-> Task2

2.1 クラスター

クラスターは、ECSの論理的なグループ単位です。タスクやサービスは、必ずいずれかのクラスターに属します。

環境ごと(開発、ステージング、本番など)にクラスターを分けたり、アプリケーションごとにクラスターを分けたりする運用が一般的です。

ちょっとイメージがつきにくいかもしれませんが、簡単に言えば「この後説明するタスクやサービスをまとめて管理するための一つの箱のようなもの」と考えていただければ大丈夫です。

2.2 タスク定義

タスク定義は、コンテナの実行設定を定義するテンプレートです。Dockerのdocker runコマンドに指定する内容を、JSON形式で記述したものと考えることができます。

タスク定義には以下のような内容が設定できます。

項目 説明
コンテナイメージ 使用するDockerイメージのURI(ECRのURIを指定することが多い)
CPU・メモリ コンテナに割り当てるリソース
ポートマッピング コンテナが公開するポート
環境変数 コンテナに渡す環境変数
ログ設定 CloudWatch Logsへのログ出力設定
タスクロール コンテナ内のアプリケーションがAWSサービスにアクセスするための権限
タスク実行ロール ECSがECRからのイメージ取得やCloudWatch Logsへのログ書き込みを行うための権限

なお、コンテナイメージの保管先としては、AWSのコンテナレジストリサービスであるECR(Elastic Container Registry)を使用するのが一般的です。ECRにプッシュしたイメージのURIをタスク定義に指定することで、ECSがそのイメージを取得してコンテナを起動します。タスク定義の項目の詳細はCreating an Amazon ECS task definition using the console(AWS公式ドキュメント)に記載があります。

2.3 タスク

タスクは、先程説明したタスク定義をもとに実際に起動された実行単位です。タスク定義が「設計図」であるのに対し、タスクは「設計図から作られた、実際に動いているコンテナ」を表します。

1つのタスクには、1つ以上のコンテナを含めることができます。一つのタスクに一つのコンテナだけを紐づけることが多いですが、一つのタスクで複数のコンテナを起動させることもできます。

2.4 サービス

サービスは、実際にタスクを実行する単位です。クラスターの中に作成され、サービスの中に、指定した数のタスクが起動されます。

具体的には、クラスターの中にサービスを作成し、サービスに「どのタスク定義でタスクを起動するか」「何個のタスクを同時に実行するか」といった定義を行います。

サービスの主な機能として、以下があります。

機能 説明
起動数 常に維持するタスクの数を指定
オートスケーリング 負荷に応じてタスク数を自動調整
ロードバランサー ALB/NLBと連携してトラフィックを分散
ローリングデプロイ ダウンタイムなしでタスクを更新
💡 ポイント
Docker Composeを使ったことがある方は、docker-compose.ymlに記述する内容がECSではどこに対応するかを意識すると理解しやすくなります。
コンテナのイメージやポート、環境変数といったコンテナ自体の設定はECSの「タスク定義」に、レプリカ数やリスタートポリシーといった運用・管理の設定は「サービス」に、それぞれ対応します。

2.5 まとめ

最後に、ここまでの内容を表で整理しておきます。

名称 説明 主な設定内容
クラスター タスクやサービスをまとめて管理するグループ 環境別・アプリケーション別の分離
タスク定義 コンテナの実行設定を定義するテンプレート イメージ、CPU/メモリ、ポート、環境変数、IAMロール など
タスク タスク定義をもとに起動された実行単位 (タスク定義の内容に従って自動的に決まる)
サービス タスクの起動数や運用ルールを管理する仕組み 起動数、オートスケーリング、ロードバランサー、デプロイ戦略 など

3. AWS Fargateとは

3.1 ECSの起動タイプ

ECSには、コンテナをどの環境で実行するかを決める「起動タイプ」という設定があり、「EC2起動タイプ」と「Fargate起動タイプ」の2つから選択できます。

EC2起動タイプは、ECSによるコンテナの管理は行いつつも、コンテナが動作するサーバとしてEC2インスタンスを利用する方式です。そのため、EC2自体の管理(OSのパッチ適用やキャパシティの管理など)は引き続き必要になります。

一方、Fargate起動タイプは、コンテナが動作するサーバの管理をAWSに任せる「サーバレス」の方式です。Fargateを利用することで、開発者はコンテナイメージを用意し、先程説明したクラスターやサービスなどの設定を行うだけで、コンテナのアプリケーションをデプロイできます。

きめ細かいサーバの設定が必要な場合はEC2起動タイプが適していますが、多くのケースではFargateで十分に対応できるため、まずはFargateを検討するのがおすすめです。

3.2 Fargateのメリット

AWS Fargateを使用することで、以下のメリットが得られます。

運用負荷の軽減

EC2インスタンスの管理(OSのパッチ適用、セキュリティ更新、キャパシティプランニングなど)が不要になります。インフラ運用に時間を取られることなく、アプリケーション開発に集中できます。

セキュリティの向上

各タスクは独立した環境で実行されるため、タスク間のセキュリティ境界が明確です。また、ホストOSへのアクセスが不要なため、攻撃対象領域が縮小されます。

スケーラビリティ

タスクの起動が高速なため、負荷に応じた迅速なスケーリングが可能です。EC2起動タイプのように、インスタンスの起動を待つ必要がありません。

3.3 Fargateの料金体系

Fargateは、タスクに割り当てたCPUとメモリの量、および実行時間に基づいて課金されます。

  • vCPU: 1時間あたりの単価 × 使用時間
  • メモリ: 1GBあたりの単価 × 使用時間

タスクが実行されていない時間は課金されないため、一時的に起動して処理を行う「バッチ処理」などとも相性が良いです。

3.4 EC2起動タイプとFargateの比較

項目 EC2起動タイプ Fargate
サーバ管理 必要 不要
起動速度 インスタンス起動が必要 高速
コスト リザーブド・スポット利用可能 使用量ベース
カスタマイズ性 高い 限定的
適したワークロード GPU利用、特殊なOS設定が必要な場合 一般的なWebアプリ、バッチ処理

プロジェクトの要件に応じて、適切な起動タイプを選択することが重要です。初めてECSを使用する場合や、運用負荷を最小限にしたい場合は、Fargateがおすすめです。

4. ECS/Fargateの主要な設定項目

4.1 ネットワークモード

Fargateでは、awsvpcネットワークモードが使用されます。各タスクに専用のENI(Elastic Network Interface)とプライベートIPアドレスが割り当てられます。

つまり「ECS/Fargateで起動したタスクは、EC2と同じようにVPCやサブネット内で動作しますよ」という形です。

4.2 セキュリティグループ

ECS/Fargateで起動するタスクにも、EC2と同様にセキュリティグループが設定できます。そのため、インバウンドやアウトバウンドの通信をきめ細かく制御できます。

4.3 IAMロール(タスクロール・タスク実行ロール)

タスク定義の表でも触れましたが、ECSでは2種類のIAMロールを設定します。混同しやすいポイントなので、改めて整理しておきます。

タスク実行ロールは、ECSの仕組み側が使うロールです。ECRからコンテナイメージを取得したり、CloudWatch Logsにログを書き込んだりする際に必要になります。ほぼすべてのタスクで設定が必要です。AWS公式のAmazon ECS task execution IAM roleでも「The task execution role grants the Amazon ECS container and Fargate agents permission to make AWS API calls on your behalf.」と説明されており、ECRからのイメージ取得やCloudWatch Logsへのログ送信といった「ECS本体が代行して実行する処理」のために必要なロールであることが分かります。

タスクロールは、コンテナ内で動くアプリケーションが使うロールです。例えば、アプリケーションからS3にファイルをアップロードしたり、DynamoDBにデータを書き込んだりする場合に、必要な権限をこのロールに付与します。AWSサービスにアクセスしないアプリケーションであれば、設定は不要です。

4.4 ログ設定

ECS/Fargateでは、コンテナのログをCloudWatch Logsに出力するのが一般的です。タスク定義でログドライバーとしてawslogsを指定すれば、自動でCloudWatch Logsにログが出力されるようになります。具体的な設定例はSend Amazon ECS logs to CloudWatch(AWS公式ドキュメント)に記載があります。

4.5 ロードバランサーとの接続

ALBとECSサービスの連携構成を以下に示します。

flowchart LR
  Internet[インターネット] --> ALB[ALB]
  ALB --> Task1[タスク AZ-a]
  ALB --> Task2[タスク AZ-c]
  ECR[Amazon ECR] -- "イメージをpull" --> Task1
  ECR -- "イメージをpull" --> Task2

  subgraph ECS["ECS サービス"]
    Task1
    Task2
  end

ECSのサービスは、ALB(Application Load Balancer)やNLB(Network Load Balancer)と連携させることができます。ロードバランサーを設定すると、外部からのリクエストが複数のタスクに自動で振り分けられるようになります。

タスクが増減した場合もロードバランサーが自動的に振り分け先を更新してくれるため、手動で設定を変更する必要はありません。

4.6 オートスケーリング

ECSのサービスには、オートスケーリングを設定できます。CPU使用率やリクエスト数などの指標に基づいて、タスクの数を自動的に増減させることが可能です。

例えば「CPU使用率が70%を超えたらタスクを追加し、30%を下回ったら減らす」といったルールを設定しておけば、アクセスの増減に合わせてタスク数が自動で調整されます。スケーリング方式の種類や設定方法はAutomatically scale your Amazon ECS service(AWS公式ドキュメント)に記載があります。

5. 主なユースケース

ECS/Fargateは、さまざまなコンテナワークロードに対応できます。以下に代表的なユースケースを紹介します。

5.1 Webアプリケーションのホスティング

ALB(Application Load Balancer)と組み合わせて、Webアプリケーションをホスティングする構成が最も一般的です。複数のタスクにトラフィックを分散し、タスクの異常を検知して自動的に置き換えることで、高可用性を実現できます。Auto Scalingを設定すれば、アクセス数の増減に応じてタスク数を自動調整できます。

5.2 マイクロサービスアーキテクチャ

複数のマイクロサービスをそれぞれ独立したECSサービスとして運用できます。サービスごとに個別にデプロイ・スケーリングができるため、チームごとに独立した開発・リリースサイクルを実現できます。サービス間の通信には、AWS App MeshやCloud Mapを活用できます。

5.3 バッチ処理・定期実行タスク

EventBridge(旧CloudWatch Events)と連携して、定期的なバッチ処理を実行できます。Fargateを使用すれば、処理が実行されている時間だけ課金されるため、常時稼働するEC2インスタンスと比較してコストを削減できます。

6. 設計のポイント

ECS/Fargateを運用する際の主要な検討項目を以下にまとめます。

設計項目 検討内容 推奨・注意事項
起動タイプの選択 EC2 vs Fargate 運用負荷を減らしたい場合はFargate、コスト最適化や細かい制御が必要な場合はEC2
タスクのサイズ設計 CPU・メモリの割り当て 実際の使用量を監視し、適切なサイズを選択。過剰なリソースはコスト増加の原因に
サービスの分割単位 1サービスに含めるコンテナ 密結合なコンテナは同一タスク内に、独立してスケールしたい場合は別サービスに
Auto Scaling設定 スケーリングのトリガー CPU使用率やリクエスト数など、アプリケーション特性に合った指標を選択
ヘルスチェック設計 正常性確認の方法 アプリケーションの依存サービス(DB等)も含めてチェックする/healthエンドポイントを用意
ログ・監視設計 運用可視性の確保 CloudWatch Logsへの出力を有効化し、Container Insightsでメトリクスを収集
セキュリティ設計 最小権限の原則 タスクロールには必要最小限のIAM権限のみ付与、セキュリティグループは必要なポートのみ許可

7. まとめ

この講座では、Amazon ECSとAWS Fargateについて学びました。

  • Amazon ECSは、AWSのフルマネージドコンテナオーケストレーションサービス
  • クラスタータスク定義タスクサービスが主な構成要素
  • AWS Fargateは、サーバレスでコンテナを実行できる起動タイプ
  • Fargateを使用すると、サーバ管理が不要になり運用負荷が軽減される
  • 次の講座では、実際にECS/Fargateを使ってコンテナをデプロイする方法を学ぶ

この教材は役に立ちましたか?

いいねをたくさんいただけると、制作者の励みになり、より多くの講座が作れるようになります。

感想を一言(任意)

いただいたコメントは次の制作のヒントになります。ぜひお気軽にご投稿ください。

このコメントは他の受講生には公開されません。DevOps Camp運営が、教材改善のために確認します。

0 / 2000