aws-cloudformation-ecs について
AWS CloudFormation で Amazon ECS を構成する開発者や運用担当者向けのスキルです。クラスター、タスク、サービスのテンプレートに加え、デプロイ、スケーリング、監視のパターンを扱います。
主な機能
- 01ECS クラスターとタスク定義
- 02Fargate と EC2 の起動タイプ
- 03ALB 連携とブルーグリーンデプロイ
- 04サービスの自動スケーリング
- 05Container Insights による監視
活用シーン
- 01CloudFormation で ECS クラスターを作成
- 02ロードバランサー配下に ECS サービスをデプロイ
- 03サービスの自動スケーリングを設定
- 04コンテナ監視とクロススタック参照を構成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-cloudformation-ecsインストール後、Claude Code で/aws-cloudformation-ecsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/constraints.mdexamples.mdreference.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、ヘルスチェック、サービスディスカバリー)
関連リソース
コメント
Markdown 対応