AWS ECS(Elastic Container Service)とFargateを活用すれば、Dockerコンテナを数分で本番環境にデプロイできます。サーバーレスでインフラ管理が不要なFargateは、運用負荷を大幅に削減しながら高いパフォーマンスを実現します。本記事では、ECSの基礎からFargateを使った本番運用まで、具体的な手順とベストプラクティスを解説します。AWS公式ドキュメントに準拠した設定方法を中心に、実務で即戦力となる知識を網羅的に紹介します。


目次

1. AWS ECSとは?Fargateとの違いを理解する

2. ECSの基本アーキテクチャと主要コンポーネント

3. Fargateのメリットとデメリットを徹底比較

4. ECS Fargate環境をゼロから構築する手順

5. Dockerイメージのビルドとレジストリ登録

6. タスク定義の作成と最適化テクニック

7. サービスデプロイメントとロードバランサー連携

8. 自動スケーリングとリアルタイムモニタリング

9. セキュリティベストプラクティスとIAM設定

10. コスト最適化と料金シミュレーション

11. 一般的なトラブルシューティングと解決策

12. よくある質問と回答

13. まとめと次のステップ


1. AWS ECSとは?Fargateとの違いを理解する

AWS ECSは、Dockerコンテナを実行・管理するためのフルマネージド型コンテナオーケストレーションサービスです。EC2インスタンス上で動作するECSクラスターと、サーバーレスで動作するFargateという2つの実行モードがあります。Fargateは、インフラ管理が不要で、タスク単位でリソースを割り当てられるため、運用負荷を大幅に削減できます。

ECSの主な特徴は以下の通りです。

  • フルマネージド型:AWSが基盤の管理を担当し、ユーザーはアプリケーションの運用に集中できます。
  • 柔軟なスケーリング:需要に応じてタスク数を自動的に調整できます。
  • 統合されたサービス:AWSロードバランサー、VPC、IAMなどとシームレスに連携します。
  • マルチAZ展開:高可用性を確保するために、複数のアベイラビリティゾーンにタスクを分散できます。

一方で、ECSとFargateの違いを明確に理解しておくことが重要です。以下の比較表で、それぞれの特徴を整理します。

機能ECS(EC2モード)ECS Fargate
インフラ管理ユーザーがEC2インスタンスを管理AWSが完全に管理(サーバーレス)
課金モデルEC2インスタンスの料金 + ECS無料タスク実行時間に応じた従量課金
起動時間数分(EC2インスタンスの起動待ち)数秒(即時起動)
カスタマイズ性高(EC2インスタンスのスペックやOSを選択可能)低(タスクに割り当てるvCPUとメモリのみ指定)
セキュリティEC2インスタンスのセキュリティグループで制御タスクレベルのIAMロールとネットワーク分離

Fargateを選択するメリットは、運用負荷の軽減と即時のスケーリングです。一方で、カスタマイズ性が低く、コストが高くなる傾向があるため、用途に応じて使い分けることが重要です。


2. ECSの基本アーキテクチャと主要コンポーネント

ECSのアーキテクチャを理解するためには、以下の主要コンポーネントを把握する必要があります。

2-1. ECSクラスター

ECSクラスターは、タスクやサービスを実行するための論理的なグループです。Fargateを使用する場合、クラスターはサーバーレスで動作し、ユーザーは基盤の管理を行いません。クラスター内には、複数のタスクやサービスをデプロイできます。

2-2. タスク定義(Ta…

タスク定義は、コンテナの実行に必要な設定を定義したドキュメントです。以下の要素を含みます。

  • コンテナイメージ:DockerイメージのURI(例:nginx:latest
  • vCPUとメモリ:タスクに割り当てるリソース量
  • 環境変数:コンテナ内で使用する環境変数
  • ポートマッピング:ホストとコンテナ間のポートマッピング
  • ストレージ:EFSやEBSなどの永続ストレージ
  • IAMロール:タスクに付与するIAMロール

タスク定義は、JSON形式で記述され、バージョン管理が可能です。Fargateでは、タスク定義のバージョンを更新することで、新しいコンテナイメージや設定を反映できます。

2-3. タスク(Task)

タスクは、タスク定義に基づいて実行される1つ以上のコンテナの集合です。Fargateでは、タスクはEC2インスタンスではなく、AWSが管理する基盤上で実行されます。タスクは、ステートレスなアプリケーションやバッチ処理に適しています。

2-4. サービス(Ser…

サービスは、タスクの定常的な実行を管理するリソースです。サービスを使用すると、以下の機能を実現できます。

  • タスクの維持:指定したタスク数を常に維持します。
  • ローリングアップデート:新しいタスク定義を反映したタスクに段階的に置き換えます。
  • ロードバランサー連携:ALBやNLBと連携して、トラフィックを分散します。

サービスは、WebアプリケーションやAPIサーバーなど、常時稼働が必要なアプリケーションに適しています。

2-5. タスクスケジューラ

ECSは、タスクのスケジューリングを自動的に行います。Fargateでは、タスクのスケジューリングはAWSが管理しますが、以下のスケジューリングオプションを指定できます。

  • REPLICA:指定したタスク数を維持します。
  • DAEMON:クラスター内の各EC2インスタンス(Fargateでは非対応)に1つのタスクを配置します。
  • CUSTOM:カスタムのスケジューリングルールを適用します。

2-6. コンテナエージェント

コンテナエージェントは、ECSクラスター内の各EC2インスタンス(Fargateでは非対応)で実行されるソフトウェアです。タスクの起動や停止、状態の報告などを行います。Fargateでは、コンテナエージェントはAWSが管理するため、ユーザーは意識する必要がありません。

以上のコンポーネントが連携することで、ECSは柔軟でスケーラブルなコンテナオーケストレーションを実現します。


3. Fargateのメリットとデメリットを徹底比較

Fargateを選択する際には、そのメリットとデメリットを正確に理解しておくことが重要です。以下に、主要なポイントを比較表で整理します。

カテゴリメリットデメリット
運用負荷・サーバーレスでインフラ管理が不要
・EC2インスタンスの管理やパッチ適用が不要
・自動スケーリングが容易
・カスタマイズ性が低い
・特定のハードウェア要件に対応できない場合がある
コスト・従量課金で無駄なコストが発生しない
・アイドル状態のリソースに対して課金されない
・EC2モードと比較してコストが高くなる傾向がある
・長時間実行するタスクではEC2モードより高額になる可能性がある
パフォーマンス・即時のタスク起動(数秒で実行可能)
・マルチテナント環境でリソースが効率的に活用される
・タスク当たりのリソース上限がEC2モードより低い(最大30vCPU、240GBメモリ)
・ネットワーク帯域幅に制限がある
セキュリティ・タスクレベルのIAMロールで細粒度のアクセス制御が可能
・ネットワーク分離が強化されている
・EC2インスタンスの管理ができないため、一部のセキュリティ設定が制限される
柔軟性・Dockerコンテナの実行に特化しており、開発環境との整合性が高い・GPUタスクや特定のカーネルモジュールが必要なタスクに対応できない
・ストレージオプションが限定的(EFSやEBSのみ)

Fargateの最大のメリットは、運用負荷の軽減です。特に、EC2インスタンスの管理やパッチ適用に煩わされることなく、アプリケーションの開発と運用に集中できます。また、即時のスケーリングが可能なため、トラフィックの急増に柔軟に対応できます。

一方で、デメリットとしては、コストが高くなる傾向があることと、カスタマイズ性が低いことが挙げられます。例えば、GPUを活用した機械学習タスクや、特定のカーネルモジュールが必要なタスクにはFargateは適していません。このような場合は、EC2モードのECSを検討する必要があります。

また、Fargateの料金は、vCPUとメモリの割り当てに応じて課金されるため、リソースの最適化が重要です。例えば、メモリを大量に消費するタスクでは、vCPUを増やすことでパフォーマンスを向上させつつ、コストを抑えることができます。

以下に、Fargateの料金シミュレーションの例を示します。AWS公式の料金計算ツールを使用して、タスクの実行時間とリソース割り当てに応じたコストを算出できます。

vCPUメモリ(GB)1時間当たりの料金(米ドル)1日当たりの料金(米ドル)
0.250.5$0.00001124$0.00027
12$0.00004496$0.00108
24$0.00008992$0.00216
48$0.00017984$0.00432

上記の表からわかるように、Fargateの料金は非常に安価です。例えば、vCPU 1、メモリ 2GBのタスクを1日8時間実行した場合、1日当たり約0.001米ドル(日本円で約0.15円)のコストが発生します。これは、EC2インスタンスを使用する場合と比較して、大幅なコスト削減につながります。

Fargateを選択する際の判断基準として、以下のポイントを参考にしてください。

  • 運用負荷を軽減したい場合:EC2インスタンスの管理が不要なため、運用コストを大幅に削減できます。
  • 即時のスケーリングが必要な場合:トラフィックの急増に柔軟に対応できます。
  • 短期間のタスク実行が多い場合:アイドル状態のリソースに対して課金されないため、コスト効率が高いです。
  • セキュリティ要件が厳しい場合:タスクレベルのIAMロールで細粒度のアクセス制御が可能です。

一方で、以下のような場合はEC2モードのECSを検討してください。

  • GPUタスクや特定のカーネルモジュールが必要な場合:Fargateでは対応できません。
  • 長時間実行するタスクでコストを抑えたい場合:EC2モードの方がコスト効率が高い場合があります。
  • ストレージ要件が大きい場合:EFSやEBSのストレージコストが高額になる可能性があります。

4. ECS Fargate環境をゼロから構築する手順

ECS Fargate環境を構築するための手順を、具体的な画面操作と共に解説します。本章では、AWS Management Consoleを使用した手順を中心に説明しますが、AWS CLIやTerraformなどのInfrastructure as Code(IaC)ツールを使用することも推奨します。

4-1. 前提条件

以下の条件を満たしていることを確認してください。

  • AWSアカウントを所有していること
  • AWS CLIがインストールされていること(任意)
  • Dockerがインストールされていること(任意)
  • AWS IAMユーザーにECS、EC2、VPC、IAM、ELBなどの権限が付与されていること

4-2. VPCの作成

ECS Fargateは、VPC内で実行されるため、まずVPCを作成します。以下の手順でVPCを作成してください。

  1. AWS Management Consoleにログインし、VPCサービスを開きます。
  2. VPCとサブネットを選択し、VPCの作成をクリックします。
  3. 以下の設定を行います。
    • 名前タグ:任意の名前(例:ecs-fargate-vpc
    • IPv4 CIDRブロック10.0.0.0/16
    • テナンシーデフォルト
  4. VPCの作成をクリックします。
  5. 次に、サブネットを作成します。サブネットを選択し、サブネットの作成をクリックします。
  6. 以下の設定を行います。
    • VPC ID:先ほど作成したVPCを選択
    • サブネット名:任意の名前(例:ecs-fargate-subnet-1a
    • アベイラビリティゾーンap-northeast-1a
    • IPv4 CIDRブロック10.0.1.0/24
  7. 同様の手順で、別のアベイラビリティゾーンにサブネットを作成します(例:10.0.2.0/24)。
  8. 最後に、インターネットゲートウェイを作成します。インターネットゲートウェイを選択し、インターネットゲートウェイの作成をクリックします。
  9. 名前タグ:任意の名前(例:ecs-fargate-igw
  10. インターネットゲートウェイの作成をクリックします。
  11. インターネットゲートウェイをVPCにアタッチします。アクションからVPCにアタッチを選択し、先ほど作成したVPCを選択します。
  12. 最後に、ルートテーブルを編集します。ルートテーブルを選択し、メインルートテーブルを選択します。
  13. ルートタブで編集をクリックし、以下のルートを追加します。
    • 宛先0.0.0.0/0
    • ターゲット:先ほど作成したインターネットゲートウェイ

以上でVPCの作成は完了です。VPC内に2つのサブネット(10.0.1.0/2410.0.2.0/24)が作成され、インターネットに接続可能な状態になりました。

4-3. ECSクラスター…

次に、ECSクラスターを作成します。以下の手順でクラスターを作成してください。

  1. AWS Management ConsoleでECSサービスを開きます。
  2. クラスターを選択し、クラスターの作成をクリックします。
  3. 新しい起動タイプとしてFargateを選択します。
  4. クラスター名:任意の名前(例:ecs-fargate-cluster
  5. インフラストラクチャAWS管理を選択します。
  6. VPC:先ほど作成したVPCを選択します。
  7. サブネット:2つのサブネットを選択します。
  8. セキュリティグループ:新しいセキュリティグループを作成します。
    • セキュリティグループ名:任意の名前(例:ecs-fargate-sg
    • 説明ECS Fargate用セキュリティグループ
    • ルール:以下のルールを追加します。
      • タイプカスタムTCP
      • ポート範囲80
      • ソース0.0.0.0/0
  9. クラスターの作成をクリックします。

以上でECSクラスターの作成は完了です。クラスター内でFargateタスクを実行する準備が整いました。

4-4. IAMロールの作成

ECS Fargateタスクを実行するためには、IAMロールが必要です。以下の手順でIAMロールを作成してください。

  1. AWS Management ConsoleでIAMサービスを開きます。
  2. ロールを選択し、ロールの作成をクリックします。
  3. 信頼されたエンティティタイプとしてAWSサービスを選択します。
  4. ユースケースとしてElastic Container Serviceを選択します。
  5. 次へをクリックします。
  6. 以下のポリシーをアタッチします。
    • AmazonECSTaskExecutionRolePolicy
    • CloudWatchLogsFullAccess(任意)
  7. ロール名:任意の名前(例:ecsTaskExecutionRole
  8. ロールの作成をクリックします。

以上でIAMロールの作成は完了です。このロールは、ECSタスクがECRからイメージをプルしたり、CloudWatch Logsにログを送信したりする際に使用されます。

4-5. ECRリポジトリ…

Dockerイメージを格納するためのECRリポジトリを作成します。以下の手順でリポジトリを作成してください。

  1. AWS Management ConsoleでECRサービスを開きます。
  2. リポジトリの作成をクリックします。
  3. リポジトリ名:任意の名前(例:my-ecs-app
  4. タグの immutable性有効または無効を選択します。
  5. リポジトリポリシー:必要に応じて設定します。
  6. リポジトリの作成をクリックします。

以上でECRリポジトリの作成は完了です。次章では、Dockerイメージのビルドとレジストリ登録について解説します。


5. Dockerイメージのビルドとレジストリ登録

ECS Fargateでコンテナを実行するためには、Dockerイメージをビルドし、ECR(Elastic Container Registry)に登録する必要があります。本章では、Dockerfileの作成からECRへのプッシュまでの手順を解説します。

5-1. Dockerfi…

Dockerfileは、Dockerイメージをビルドするための設定ファイルです。以下に、シンプルなNginxサーバーを実行するためのDockerfileの例を示します。

# ベースイメージとして公式のNginxイメージを使用
FROM nginx:latest

HTMLファイルをコピー

COPY index.html /usr/share/nginx/html/

ポート80を公開

EXPOSE 80

このDockerfileでは、以下の手順が定義されています。

  1. ベースイメージの指定nginx:latestを使用します。
  2. HTMLファイルのコピー:ローカルのindex.htmlファイルをコンテナ内の/usr/share/nginx/html/にコピーします。
  3. ポートの公開:ポート80を公開します。

次に、index.htmlファイルを作成します。以下は、シンプルなHTMLファイルの例です。

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to ECS Fargate!</title>
</head>
<body>
    <h1>Hello, ECS Fargate!</h1>
    <p>This is a sample application running on ECS Fargate.</p>
</body>
</html>

5-2. Dockerイメ…

Dockerfileとindex.htmlファイルを同じディレクトリに配置し、以下のコマンドでDockerイメージをビルドします。

docker build -t my-ecs-app .

このコマンドでは、以下の処理が行われます。

  • -t my-ecs-app:イメージにmy-ecs-appというタグを付けます。
  • .:カレントディレクトリ内のDockerfileを使用します。

ビルドが完了すると、以下のような出力が表示されます。

Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> 2bdc49f2f6d3
Step 2/3 : COPY index.html /usr/share/nginx/html/
 ---> 8f3260650130
Step 3/3 : EXPOSE 80
 ---> Running in 1a2b3c4d5e6f
Removing intermediate container 1a2b3c4d5e6f
 ---> 7e4b3a2d1c0e
Successfully built 7e4b3a2d1c0e
Successfully tagged my-ecs-app:latest

次に、ビルドしたイメージをローカルで実行してみましょう。以下のコマンドでコンテナを起動します。

docker run -d -p 8080:80 --name my-nginx my-ecs-app

このコマンドでは、以下の処理が行われます。

  • -d:バックグラウンドで実行します。
  • -p 8080:80:ホストのポート8080をコンテナのポート80にマッピングします。
  • --name my-nginx:コンテナにmy-nginxという名前を付けます。
  • my-ecs-app:ビルドしたイメージを使用します。

コンテナが起動したら、ブラウザでhttp://localhost:8080にアクセスして、Nginxサーバーが正常に動作していることを確認します。

5-3. ECRへのログイ…

次に、ビルドしたDockerイメージをECRにプッシュします。以下の手順で実行してください。

  1. AWS CLIを使用してECRにログインします。以下のコマンドを実行します。
  2. aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
    

    注意<アカウントID>は、ご自身のAWSアカウントIDに置き換えてください。

  3. 次に、ECRリポジトリのURIを確認します。AWS Management ConsoleでECRサービスを開き、先ほど作成したリポジトリを選択します。URIの項目に表示されているURIをコピーします(例:123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app)。
  4. Dockerイメージにタグを付けます。以下のコマンドを実行します。
  5. docker tag my-ecs-app:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app:latest
    
  6. DockerイメージをECRにプッシュします。以下のコマンドを実行します。
  7. docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app:latest
    
  8. プッシュが完了すると、以下のような出力が表示されます。
  9. The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app]
    latest: digest: sha256
    【編集・制作ポリシー】
    本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。
    ABOUT ME
    たから
    サラリーマンをしながら開業して経営やってます。 今年、本業で独立・別事業を起業予定です。 ◆経験:IT講師/インフラエンジニア/PM/マネジメント/採用/運用・保守・構築・設計 ◆取得資格:CCNA/CCNP/LPIC-1/AZ-900/FE/サーティファイC言語 ◆サイドビジネス:アパレル事業/複数のWEBメディアを運営