実践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`]'

🔗 次のステップ