AWS ECS入門|FargateでDockerコンテナを本番運用する

AWS ECS(Elastic Container Service)とFargateを活用すれば、Dockerコンテナを数分で本番環境にデプロイできます。サーバーレスでインフラ管理が不要なFargateは、運用負荷を大幅に削減しながら高いパフォーマンスを実現します。本記事では、ECSの基礎からFargateを使った本番運用まで、具体的な手順とベストプラクティスを解説します。AWS公式ドキュメントに準拠した設定方法を中心に、実務で即戦力となる知識を網羅的に紹介します。
目次
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.25 | 0.5 | $0.00001124 | $0.00027 |
| 1 | 2 | $0.00004496 | $0.00108 |
| 2 | 4 | $0.00008992 | $0.00216 |
| 4 | 8 | $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を作成してください。
- AWS Management Consoleにログインし、VPCサービスを開きます。
- VPCとサブネットを選択し、VPCの作成をクリックします。
- 以下の設定を行います。
- 名前タグ:任意の名前(例:
ecs-fargate-vpc) - IPv4 CIDRブロック:
10.0.0.0/16 - テナンシー:
デフォルト - VPCの作成をクリックします。
- 次に、サブネットを作成します。サブネットを選択し、サブネットの作成をクリックします。
- 以下の設定を行います。
- VPC ID:先ほど作成したVPCを選択
- サブネット名:任意の名前(例:
ecs-fargate-subnet-1a) - アベイラビリティゾーン:
ap-northeast-1a - IPv4 CIDRブロック:
10.0.1.0/24 - 同様の手順で、別のアベイラビリティゾーンにサブネットを作成します(例:
10.0.2.0/24)。 - 最後に、インターネットゲートウェイを作成します。インターネットゲートウェイを選択し、インターネットゲートウェイの作成をクリックします。
- 名前タグ:任意の名前(例:
ecs-fargate-igw) - インターネットゲートウェイの作成をクリックします。
- インターネットゲートウェイをVPCにアタッチします。アクションからVPCにアタッチを選択し、先ほど作成したVPCを選択します。
- 最後に、ルートテーブルを編集します。ルートテーブルを選択し、メインルートテーブルを選択します。
- ルートタブで編集をクリックし、以下のルートを追加します。
- 宛先:
0.0.0.0/0 - ターゲット:先ほど作成したインターネットゲートウェイ
以上でVPCの作成は完了です。VPC内に2つのサブネット(10.0.1.0/24と10.0.2.0/24)が作成され、インターネットに接続可能な状態になりました。
4-3. ECSクラスター…
次に、ECSクラスターを作成します。以下の手順でクラスターを作成してください。
- AWS Management ConsoleでECSサービスを開きます。
- クラスターを選択し、クラスターの作成をクリックします。
- 新しい起動タイプとしてFargateを選択します。
- クラスター名:任意の名前(例:
ecs-fargate-cluster) - インフラストラクチャ:AWS管理を選択します。
- VPC:先ほど作成したVPCを選択します。
- サブネット:2つのサブネットを選択します。
- セキュリティグループ:新しいセキュリティグループを作成します。
- セキュリティグループ名:任意の名前(例:
ecs-fargate-sg) - 説明:
ECS Fargate用セキュリティグループ - ルール:以下のルールを追加します。
- タイプ:
カスタムTCP - ポート範囲:
80 - ソース:
0.0.0.0/0
- タイプ:
- クラスターの作成をクリックします。
以上でECSクラスターの作成は完了です。クラスター内でFargateタスクを実行する準備が整いました。
4-4. IAMロールの作成
ECS Fargateタスクを実行するためには、IAMロールが必要です。以下の手順でIAMロールを作成してください。
- AWS Management ConsoleでIAMサービスを開きます。
- ロールを選択し、ロールの作成をクリックします。
- 信頼されたエンティティタイプとしてAWSサービスを選択します。
- ユースケースとしてElastic Container Serviceを選択します。
- 次へをクリックします。
- 以下のポリシーをアタッチします。
- AmazonECSTaskExecutionRolePolicy
- CloudWatchLogsFullAccess(任意)
- ロール名:任意の名前(例:
ecsTaskExecutionRole) - ロールの作成をクリックします。
以上でIAMロールの作成は完了です。このロールは、ECSタスクがECRからイメージをプルしたり、CloudWatch Logsにログを送信したりする際に使用されます。
4-5. ECRリポジトリ…
Dockerイメージを格納するためのECRリポジトリを作成します。以下の手順でリポジトリを作成してください。
- AWS Management ConsoleでECRサービスを開きます。
- リポジトリの作成をクリックします。
- リポジトリ名:任意の名前(例:
my-ecs-app) - タグの immutable性:有効または無効を選択します。
- リポジトリポリシー:必要に応じて設定します。
- リポジトリの作成をクリックします。
以上で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では、以下の手順が定義されています。
- ベースイメージの指定:
nginx:latestを使用します。 - HTMLファイルのコピー:ローカルの
index.htmlファイルをコンテナ内の/usr/share/nginx/html/にコピーします。 - ポートの公開:ポート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にプッシュします。以下の手順で実行してください。
- AWS CLIを使用してECRにログインします。以下のコマンドを実行します。
- 次に、ECRリポジトリのURIを確認します。AWS Management ConsoleでECRサービスを開き、先ほど作成したリポジトリを選択します。URIの項目に表示されているURIをコピーします(例:
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app)。 - Dockerイメージにタグを付けます。以下のコマンドを実行します。
- DockerイメージをECRにプッシュします。以下のコマンドを実行します。
- プッシュが完了すると、以下のような出力が表示されます。
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に置き換えてください。
docker tag my-ecs-app:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app:latest
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app:latest
The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-ecs-app]
latest: digest: sha256 【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。ABOUT ME




