2026年10月25日
2026年10月25日
AWS ECSでDockerコンテナ運用
はじめに
AWS ECS (Elastic Container Service) は、Dockerコンテナを本番環境で運用するためのマネージドオーケストレーションサービスです。Kubernetes (EKS) ほどの学習コストを支払わずに、自動スケール、ヘルスチェック、ローリングデプロイといった本番運用に必要な機能を一通り手に入れられます。
実行基盤はサーバーレスの「Fargate」と、自前EC2クラスタを使う「EC2起動タイプ」から選択でき、可変ワークロードや小規模運用ではFargateが、コストを抑えたい大規模運用ではEC2タイプが選ばれます。いずれもタスク定義(JSON)とサービス定義によりIaC的に管理できます。
本記事では、ECRへのイメージpushからECSサービス作成・運用までを、AWS CLIで再現性のある形で実施する手順を紹介します。
症状・背景
- 開発環境のDockerをそのまま本番運用したいがEC2手運用は辛い
- アクセス急増に応じて自動でコンテナをスケールしたい
- デプロイ時のダウンタイムを無くしたい(ローリング更新)
- KubernetesではなくAWSネイティブなマネージド基盤を使いたい
手順・設定方法
ステップ1: ECRリポジトリの作成とイメージpush
コンテナイメージをAWSのレジストリに保存します。
# ECRリポジトリを作成
aws ecr create-repository --repository-name myapp --region ap-northeast-1
# ECRへログイン用トークンを取得しdockerに渡す
aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
# ローカルイメージにECR用タグを付与
docker tag myapp:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
# ECRへpush
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
ステップ2: クラスタとタスク定義を作成
Fargateクラスタとタスク定義JSONを用意します。
# クラスタを作成
aws ecs create-cluster --cluster-name prod-cluster
# タスク定義JSONを作成(taskdef.json)
# {
# "family": "myapp",
# "networkMode": "awsvpc",
# "requiresCompatibilities": ["FARGATE"],
# "cpu": "512", "memory": "1024",
# "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
# "containerDefinitions": [{ "name":"app", "image":"...:latest", "portMappings":[{"containerPort":8080}] }]
# }
# タスク定義を登録
aws ecs register-task-definition --cli-input-json file://taskdef.json
ステップ3: サービスを作成しデプロイ
ALBと連携したサービスを作成します。
# サービス作成(ALBターゲットグループに紐付け)
aws ecs create-service \
--cluster prod-cluster \
--service-name myapp-svc \
--task-definition myapp \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-aaa,subnet-bbb],securityGroups=[sg-xxx],assignPublicIp=ENABLED}" \
--load-balancers targetGroupArn=arn:aws:elasticloadbalancing:...,containerName=app,containerPort=8080
# サービス状態を確認
aws ecs describe-services --cluster prod-cluster --services myapp-svc
ステップ4: デプロイ更新と運用監視
新バージョンのローリング更新を行います。
# 新イメージをpush後、タスク定義のリビジョンを更新
aws ecs register-task-definition --cli-input-json file://taskdef.json
# サービスに新リビジョンを適用(自動ローリングデプロイ)
aws ecs update-service --cluster prod-cluster --service myapp-svc --task-definition myapp
# 起動中のタスク一覧
aws ecs list-tasks --cluster prod-cluster --service-name myapp-svc
# CloudWatch Logsで標準出力を確認
aws logs tail /ecs/myapp --follow
注意事項
- Fargateは1分単位の課金、最小0.25 vCPUからで起動が遅い点に注意
- タスクIAMロール(
taskRoleArn)と実行ロール(executionRoleArn)は別物 - awsvpcネットワークモードはENI数の上限消費に注意(高密度な場合EC2タイプ検討)
- イメージタグに
latestを使うとローリング検知が不安定なため、コミットSHA等の固定タグ推奨
まとめ
1. ECRへのpush がコンテナ運用の起点
2. タスク定義JSON をGit管理しIaC化
3. Fargate ならEC2管理不要で運用負荷が劇的に低下
4. ALBと連携 で無停止ローリングデプロイを実現
5. CloudWatch Logs で集中ログ管理し障害解析を高速化
関連記事: