実践LESSON 18
この教材で学ぶこと ECR・ECS・EKSの役割と運用パターンを学びます。AWS コンテナサービス — ECS・EKS・ECR
前提知識: Docker と Kubernetes の基礎。本教材ではAWS上のコンテナ設計と運用を扱います。
1. ECR(Elastic Container Registry)— イメージ管理
# ログイン(OIDC や IAM Role で認証)
aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin \
123456789.dkr.ecr.ap-northeast-1.amazonaws.com
# イメージをプッシュ
docker build -t myapp:latest .
docker tag myapp:latest 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
docker push 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest
# ライフサイクルポリシーで古いイメージを自動削除
aws ecr put-lifecycle-policy \
--repository-name myapp \
--lifecycle-policy-text '{
"rules": [{
"rulePriority": 1,
"description": "最新10件を保持",
"selection": {
"tagStatus": "untagged",
"countType": "imageCountMoreThan",
"countNumber": 10
},
"action": {"type": "expire"}
}]
}'
2. ECS Fargate — サーバーレスコンテナ
タスク定義(docker-compose.yml の AWS 版)
{
"family": "myapp",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"executionRoleArn": "arn:aws:iam::123456789:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789:role/ecsTaskRole",
"containerDefinitions": [{
"name": "myapp",
"image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:latest",
"portMappings": [{"containerPort": 8080}],
"environment": [
{"name": "ENV", "value": "production"}
],
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789:secret:db-password"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/myapp",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "ecs"
}
},
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3,
"startPeriod": 60
}
}]
}
ECS サービス(常時稼働・ALB 連携)
aws ecs create-service \
--cluster production \
--service-name myapp \
--task-definition myapp:5 \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={
subnets=[subnet-xxx,subnet-yyy],
securityGroups=[sg-zzz],
assignPublicIp=DISABLED
}" \
--load-balancers "targetGroupArn=arn:aws:...,containerName=myapp,containerPort=8080" \
--deployment-configuration "minimumHealthyPercent=100,maximumPercent=200"
# minimumHealthyPercent=100 → 無停止デプロイ
3. ECS デプロイパターン
ローリングアップデート(デフォルト):
既存タスク: [v1][v1][v1]
デプロイ中: [v1][v1][v2]
完了後: [v2][v2][v2]
→ ダウンタイムなし(minimumHealthyPercent=100 の場合)
Blue/Green(CodeDeploy 連携):
ALB → Target Group Blue [v1][v1]
↘ Target Group Green [v2][v2](新バージョン)
テスト後に ALB を Green に切り替え
→ 即時ロールバック可能(Blue を残しているため)
4. ECS Auto Scaling
# Application Auto Scaling でタスク数を自動調整
# スケーリングポリシー(CPU 70% を目標)
aws application-autoscaling put-scaling-policy \
--service-namespace ecs \
--resource-id service/production/myapp \
--scalable-dimension ecs:service:DesiredCount \
--policy-name cpu-tracking \
--policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{
"TargetValue": 70.0,
"PredefinedMetricSpecification": {
"PredefinedMetricType": "ECSServiceAverageCPUUtilization"
},
"ScaleInCooldown": 300,
"ScaleOutCooldown": 60
}'
5. EKS(Managed Kubernetes)
# eksctl でクラスター作成(Terraform でも可)
eksctl create cluster \
--name production \
--region ap-northeast-1 \
--nodegroup-name standard \
--node-type t3.medium \
--nodes 2 \
--nodes-min 1 \
--nodes-max 5 \
--managed
# kubectl の設定を更新
aws eks update-kubeconfig --name production --region ap-northeast-1
# EKS 固有の設定: IAM Roles for Service Accounts (IRSA)
# PodがIAMロールを使えるようにする(EC2のインスタンスプロファイルに相当)
eksctl create iamserviceaccount \
--name myapp-sa \
--namespace production \
--cluster production \
--attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
--approve
EKS vs ECS の選び方(再掲・深掘り)
ECS を選ぶとき:
✅ AWS ネイティブで完結したい
✅ K8s の学習コストをかけたくない
✅ チームが小さい / 移行コストが気になる
EKS を選ぶとき:
✅ 既に K8s の知識・資産がある
✅ Helm チャートなど K8s エコシステムを使いたい
✅ マルチクラウドへの対応を見越している
✅ 細かいネットワークポリシーが必要(NetworkPolicy)
6. コンテナのコスト最適化
# Fargate Spot(最大70%削減、中断リスクあり)
# バッチ処理・開発環境に向く
aws ecs create-service \
--capacity-provider-strategy '[
{"capacityProvider": "FARGATE", "weight": 1, "base": 1},
{"capacityProvider": "FARGATE_SPOT", "weight": 4}
]'
# → 80%をSpot、20%をオンデマンドで実行
# ECR イメージスキャン(脆弱性検出)
aws ecr start-image-scan \
--repository-name myapp \
--image-id imageTag=latest
aws ecr describe-image-scan-findings \
--repository-name myapp \
--image-id imageTag=latest \
--query 'imageScanFindings.findings[?severity==`CRITICAL`]'
🔗 次のステップ
- ../../06_DevOps/Kubernetes/01_K8s基礎.md — K8s マニフェスト設計
- ../../06_DevOps/IaC/01_Terraform.md — ECS/EKS を Terraform で管理
- ../../06_DevOps/CICD/01_GitHub_Actions.md — ECR/ECS への CI/CD パイプライン