Amazon ECS(Elastic Container Service)は、AWSが提供するコンテナオーケストレーションサービスです。Dockerコンテナのデプロイ、管理、スケーリングを簡単に行えます。Fargateは、ECSの実行モードの一つで、EC2インスタンスの管理を不要にするサーバーレスコンピューティングエンジンです。
Kubernetesと比較した場合のECS+Fargateの利点は、圧倒的なシンプルさにあります。クラスタ管理やノードのスケーリングを意識する必要がなく、コンテナの定義と実行に集中できます。AWS環境に閉じたシステムであれば、Kubernetesの複雑さを回避しつつ十分なコンテナオーケストレーション機能を得られます。
ECSの中核となるのがタスク定義です。コンテナの仕様をJSON形式で定義します。
{
"family": "web-app",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512",
"executionRoleArn": "arn:aws:iam::role/ecsTaskExecutionRole",
"containerDefinitions": [
{
"name": "web",
"image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/web-app:latest",
"portMappings": [
{
"containerPort": 3000,
"protocol": "tcp"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/web-app",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
Fargateではcpuとmemoryの組み合わせが決まっているため、適切なスペックを選択します。最小構成は0.25vCPU/512MBで、最大16vCPU/120GBまでスケールアップ可能です。
ECSサービスは、指定した数のタスクを常時実行し続ける仕組みです。ALB(Application Load Balancer)と組み合わせることで、ヘルスチェックとトラフィック分散が実現できます。
aws ecs create-service \\
--cluster my-cluster \\
--service-name web-service \\
--task-definition web-app:1 \\
--desired-count 2 \\
--launch-type FARGATE \\
--network-configuration "awsvpcConfiguration={subnets=[subnet-xxx],securityGroups=[sg-xxx],assignPublicIp=ENABLED}" \\
--load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=web,containerPort=3000"
desired-countを2に設定することで、常に2つのタスクが実行されます。タスクが異常終了した場合、ECSが自動的に新しいタスクを起動します。
トラフィックの変動に応じて自動でタスク数を調整するAuto Scalingも重要な機能です。Application Auto Scalingを使って、CPU使用率やリクエスト数に基づくスケーリングポリシーを定義します。Target Tracking Scaling Policyを使えば、目標のCPU使用率を指定するだけで自動調整されます。
例えば、CPU使用率を70%に維持するポリシーを設定すると、負荷が増加すれば自動的にタスクが追加され、負荷が下がれば削減されます。最小タスク数と最大タスク数を設定して、コストの上限を制御することも忘れないようにしましょう。
ECS+Fargateの運用で押さえるべきポイントを紹介します。まず、ECR(Elastic Container Registry)にイメージを保存し、ライフサイクルポリシーで古いイメージを自動削除します。次に、Secrets Managerを使って環境変数に機密情報を安全に注入します。CloudWatch Container Insightsを有効にして、コンテナレベルのメトリクスを取得することも推奨されます。デプロイ戦略としてはローリングアップデートが標準ですが、Blue/Greenデプロイメントも CodeDeployと組み合わせて実現可能です。