mcpField
A
aws-cloudformation-ecs

aws-cloudformation-ecs

github.com/giuseppe-trisciuoglioクラウド・DevOps36565 回インストール7 週間前に更新
リポジトリ

aws-cloudformation-ecs について

AWS CloudFormation で Amazon ECS を構成する開発者や運用担当者向けのスキルです。クラスター、タスク、サービスのテンプレートに加え、デプロイ、スケーリング、監視のパターンを扱います。

主な機能

  1. 01ECS クラスターとタスク定義
  2. 02Fargate と EC2 の起動タイプ
  3. 03ALB 連携とブルーグリーンデプロイ
  4. 04サービスの自動スケーリング
  5. 05Container Insights による監視

活用シーン

  1. 01CloudFormation で ECS クラスターを作成
  2. 02ロードバランサー配下に ECS サービスをデプロイ
  3. 03サービスの自動スケーリングを設定
  4. 04コンテナ監視とクロススタック参照を構成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill aws-cloudformation-ecs

インストール後、Claude Code で/aws-cloudformation-ecsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
constraints.md
examples.md
reference.md

詳細

AWS CloudFormation ECS

概要

ECS クラスター、タスク定義、サービス、コンテナ定義、自動スケーリング、ブルー/グリーンデプロイ、ALB 統合、モニタリング、スタック間参照のための CloudFormation パターンを提供します。

使用する場面

  • CloudFormation で ECS クラスターを作成または更新する
  • Fargate/EC2 の起動タイプとキャパシティプロバイダーを設定する
  • ALB/NLB 統合またはブルー/グリーンデプロイを使用してサービスをデプロイする
  • ECS サービスの自動スケーリングを実装する
  • Container Insights でモニタリングを設定する

手順

CloudFormation で ECS インフラストラクチャを作成するには、以下の手順に従ってください。

1. ECS クラスターのパラメーターを定義する

起動タイプ、ネットワーク、キャパシティの設定を指定します。

Parameters:
  LaunchType:
    Type: String
    Default: FARGATE
    AllowedValues:
      - EC2
      - FARGATE
    Description: ECS launch type

  ContainerPort:
    Type: Number
    Default: 80
    Description: Container port

  TaskCPU:
    Type: String
    Default: 256
    AllowedValues:
      - 256
      - 512
      - 1024
      - 2048
      - 4096
    Description: Task CPU units

  TaskMemory:
    Type: String
    Default: 512
    AllowedValues:
      - 512
      - 1024
      - 2048
      - 3072
      - 4096
      - 5120
      - 6144
      - 7168
      - 8192
      - 9216
      - 10240
    Description: Task memory in MB
2. ECS クラスターを作成する

クラスターのインフラストラクチャを定義します。

Resources:
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: !Sub "${AWS::StackName}-cluster"
      ClusterSettings:
        - Name: containerInsights
          Value: enabled
      CapacityProviders:
        - FARGATE
        - FARGATE_SPOT
      DefaultCapacityProviderStrategy:
        - CapacityProvider: FARGATE
          Weight: 1
        - CapacityProvider: FARGATE_SPOT
          Weight: 0
3. タスク定義を作成する

コンテナの設定を定義します。

Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Sub "${AWS::StackName}-task"
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - FARGATE
      Cpu: !Ref TaskCPU
      Memory: !Ref TaskMemory
      ExecutionRoleArn: !Ref ExecutionRole
      TaskRoleArn: !Ref TaskRole
      ContainerDefinitions:
        - Name: application
          Image: !Ref ImageUrl
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              Protocol: tcp
          Environment:
            - Name: LOG_LEVEL
              Value: INFO
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: ecs
          Memory: !Ref TaskMemory

続行する前に、タスク定義の構文を検証してください。

aws cloudformation validate-template --template-body file://template.yaml
4. 実行ロールを設定する

タスク実行用の IAM ロールを設定します。

Resources:
  ExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy

  TaskRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: S3Access
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetObject
                Resource: !Sub "${DataBucket.Arn}/*"
5. ECS サービスを作成する

サービスの設定を定義します。

Resources:
  ECSService:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Sub "${AWS::StackName}-service"
      Cluster: !Ref ECSCluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 2
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsvpcConfiguration:
          Subnets:
            - !Ref PrivateSubnet1
            - !Ref PrivateSubnet2
          SecurityGroups:
            - !Ref SecurityGroup
          AssignPublicIp: DISABLED
      LoadBalancers:
        - TargetGroupArn: !Ref TargetGroup
          ContainerName: application
          ContainerPort: !Ref ContainerPort
6. ロードバランサーを設定する

トラフィックを分散する ALB を設定します。

Resources:
  LoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Sub "${AWS::StackName}-alb"
      Scheme: internet-facing
      Type: application
      Subnets:
        - !Ref PublicSubnet1
        - !Ref PublicSubnet2
      SecurityGroups:
        - !Ref ALBSecurityGroup

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Port: 80
      Protocol: HTTP
      VpcId: !Ref VPC
      TargetType: ip

  Listener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - TargetGroupArn: !Ref TargetGroup
          Type: forward
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
7. 自動スケーリングを実装する

Application Auto Scaling を設定します。

Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 10
      MinCapacity: 1
      ResourceId: !Sub "service/${ECSCluster}/${ECSService}"
      ScalableDimension: ecs:service:DesiredCount
      ServiceNamespace: ecs

  ScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub "${AWS::StackName}-scaling"
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70.0
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageCPUUtilization
8. モニタリングを設定する

CloudWatch Container Insights を有効にします。

Resources:
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/ecs/${AWS::StackName}"
      RetentionInDays: 7

デプロイ前: 変更をプレビューするため、変更セットを作成します。

aws cloudformation create-change-set \
  --stack-name my-ecs-stack \
  --template-body file://template.yaml \
  --change-set-type CREATE
aws cloudformation execute-change-set --change-set-name <arn>

ベストプラクティス

タスク定義
  • バージョン追跡とイミュータブルなデプロイには、Family による命名を使用します
  • 外部設定を参照して、タスク定義を 1 KB(CloudFormation の上限)未満に保ちます
  • ECS のヘルスモニタリングのため、コンテナ定義で HealthCheck を設定します
  • Fargate では、タスクレベルで Cpu と Memory の両方を設定します
サービスのデプロイ
  • 障害時の自動ロールバックのため、DeploymentCircuitBreaker を有効にします
  • アプリケーションの起動時間に合わせて HealthCheckGracePeriodSeconds を設定します
  • ダウンタイムなしで更新するため、MinimumHealthyPercent(100)と MaximumPercent(200)を設定します
  • タスク定義は論理 ID のみで参照します。ECS は最新リビジョンを自動的に使用します
ネットワーク
  • Fargate では必ず awsvpc ネットワークモードを使用します
  • タスクはプライベートサブネットに配置し、アウトバウンドアクセス用に NAT ゲートウェイを使用します
  • セキュリティグループでは、必要なポートのみを許可するように設定します(0.0.0.0/0 は使用しません)
スケーリング
  • コストを最適化するため、オンデマンドのベースキャパシティを 1 にして Fargate Spot を使用します
  • Spot の中断に対応するため、キャパシティプロバイダー戦略で MaxHealthyDuration を設定します
  • タスクの起動に関する問題を把握するため、CloudWatch で STEADY_STATE の失敗をモニタリングします

制約と警告

リソースの制限
  • CloudFormation を使用する場合、タスク定義のサイズ上限は 1 KB です(大きな設定には ParameterStore/Secrets Manager を使用します)
  • Fargate のタスク定義で指定できるコンテナは最大 10 個です
  • Fargate タスクでは CPU の指定が必要です(256~4096 ユニット、1024 刻み)
  • メモリを割り当てる必要があります(CPU に応じて 512~30720 MB)
運用上の制限
  • ENI の上限はサブネットごとに適用されます。各 AZ でタスクあたり少なくとも 1 つの ENI を確保できるよう計画してください
  • Fargate Spot タスクには 2 分前に中断通知が届きます。正常なシャットダウンシグナル(SIGTERM)を実装してください
  • サービスを更新するには新しいタスク定義リビジョンが必要です。既存のバージョンは変更できません
  • デプロイ中の DesiredCount の更新は、自動スケーリングポリシーと競合する可能性があります
CloudFormation 固有
  • スタック間で受け渡す VPC ID、Subnet ID、Security Group ID には、スタック間参照が必要です
  • 同じテンプレート内のスタック出力を参照するには !GetAtt を使用します
  • 可搬性を確保するため、IAM ロール ARN ではスタック名を含む Fn::Sub を使用します

例

最小構成の Fargate サービス
AWSTemplateFormatVersion: "2010-09-09"
Description: Minimal ECS Fargate service

Resources:
  Cluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterName: !Sub "${AWS::StackName}-cluster"

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Sub "${AWS::StackName}-task"
      NetworkMode: awsvpc
      RequiresCompatibilities: [FARGATE]
      Cpu: 256
      Memory: 512
      ContainerDefinitions:
        - Name: app
          Image: nginx:latest
          PortMappings:
            - ContainerPort: 80

  Service:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref Cluster
      ServiceName: !Sub "${AWS::StackName}-svc"
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 2
      LaunchType: FARGATE
      DeploymentCircuitBreaker:
        Enable: true
        Rollback: true
ALB 統合を使用した ECS
Resources:
  Service:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref ECSCluster
      TaskDefinition: !Ref TaskDefinition
      DesiredCount: 2
      LaunchType: FARGATE
      HealthCheckGracePeriodSeconds: 30
      NetworkConfiguration:
        AwsvpcConfiguration:
          Subnets: [!Ref PrivateSubnet1, !Ref PrivateSubnet2]
          SecurityGroups: [!Ref TaskSecurityGroup]
      LoadBalancers:
        - TargetGroupArn: !Ref TargetGroup
          ContainerName: app
          ContainerPort: 8080

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Port: 80
      Protocol: HTTP
      VpcId: !Ref VPC
      TargetType: ip
      HealthCheckPath: /health

参考資料

実装に関する詳しいガイダンスについては、次を参照してください。

  • constraints.md - リソースの制限(タスク定義のサイズ、コンテナの制限、メモリの制限、CPU の制限)、運用上の制約(サービスの更新、ENI の制限、タスクの起動時間、スケーリングの遅延)、セキュリティ上の制約(IAM ロール、ネットワークモード、セキュリティグループ、シークレットのローテーション)、コストに関する考慮事項(Fargate の料金、データ転送、ECR ストレージ、モニタリング)、デプロイの制約(Blue/Green の要件、CodeDeploy との統合、ロールバック、タスクのドリフト)、可用性に関する制約(Fargate Spot、マルチ AZ、ヘルスチェック、サービスディスカバリー)

関連リソース

コメント