CDKを使用してAuto ScalingでFargateを作成してみた。
概要
Fargate はECS を使用して、サーバーを管理する必要なくコンテナを実行できるテクノロジーです。Fargateでは、仮想マシンをプロビジョニングと設定する必要がありません。Fargate 起動タイプを使用して Amazon ECS タスクを実行する場合、アプリケーションをコンテナにパッケージ化し、CPU とメモリ要件を指定し、ネットワークとIAM ポリシーを定義して、アプリケーションを起動します。
この記事では、CDKを使用してAuto ScalingでFargateを作成してみました。MemoryUtilization> 50の場合、Auto Scalingグループはスケールアップします。Auto ScalingとApplication Load BalancerでFargateサービスを作成しました。
やってみた
CDKアプリの作成
CDKをインストールする
- 次のコマンドを使用してCDKをインストールしておきます。
npm install aws-cdk-lib
CDKアプリを作成する
- 新しいディレクトリを作成しておきます。
- CDKは、プロジェクトディレクトリの名前に基づいてソースファイルとクラスに名前を付けます。
#create new directory mkdir fargate cd fargate
- cdk initコマンドを使用してアプリを初期化しておきます。
cdk init --language typescript
AWS サービスの作成
- 新しいファイル [lib/index.ts] を作成して、作成する必要のあるAWSサービスを定義しておきます。
- ファイルに次のAWSサービスを定義しておきます。
- VPC : 2つのAvailabilityZonesでVPCを定義しておきます。
- ECS Cluster : 上記で作成したvpcを使用してECSクラスターを定義しておきます。
- Fargate Service - Application Load BalancerでFargateサービスを定義しておきます。
- Auto Scaling : MemoryUtilization>50のときにスケールアップするAutoScalingポリシーを定義しておきます。
- Auto Scaling 構成 :
- Maximum Capacity : 2 (Maximum tasks : 2)
- Minimum Capacity: 1. (Minimum tasks : 1)
- Policy Type : Target tracking
- Scale In Cooldown : 60s
- Scale Out Cooldown : 60s
- Target Utilization Percent : 50
- Auto Scaling 構成 :
import { Construct } from 'constructs'; import { Cluster, ContainerImage} from 'aws-cdk-lib/aws-ecs'; import { Vpc } from 'aws-cdk-lib/aws-ec2'; import { ApplicationLoadBalancedFargateService } from 'aws-cdk-lib/aws-ecs-patterns'; import { StackProps, Duration} from 'aws-cdk-lib'; export class fargateStack extends Construct { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id); //Create a VPC with 2 AvailabilityZones const vpc = new Vpc(this, 'Vpc', { maxAzs: 2 }); //Create a ECS Cluster const cluster = new Cluster(this, 'fargate-service', { vpc, clusterName: 'fargateCluster' }); //Create a Fargate Service with Application Load Balancer const fargateService = new ApplicationLoadBalancedFargateService(this, 'fargateservice', { cluster, serviceName: 'fargateService', taskImageOptions: { image: ContainerImage.fromRegistry("amazon/amazon-ecs-sample") }, }); //Create Auto Scaling Policy const autoscaling = fargateService.service.autoScaleTaskCount({ maxCapacity: 2 }); autoscaling.scaleOnMemoryUtilization('ScalingOnMemory', { targetUtilizationPercent: 50, scaleInCooldown: Duration.seconds(60), scaleOutCooldown: Duration.seconds(60) }); } }
アプリにサービスを追加する
- /lib/fargate_stack.ts ファイルに次のコードを追加しておきます。
#Import the Index file created in the previous step import * as fargate from '../lib/index' new fargate.fargateStack(this, 'fargate-service' );
CDK Deploy
- Deploy する前に、環境をブートストラップする必要があります。
- 次のコマンドを実行して、AWS環境をブートストラップしておきます。
cdk bootstrap
- 次のコマンドを使用してCDKを展開しておきます。
cdk deploy
- コンソールでは、サービスが作成されたことを見ることができます。
ECS Cluster
Fargate Service
Application Load Balancer
Auto Scaling
Auto Scalingをテストする
- Load BalancerDNSを使用してアプリケーションにアクセスできます。
スケーリングする前
- MemoryUtilization metric - average: 3.13%
- Average(3.13%) < 45 であるため、スケールダウンとスケールアップの両方のアラーム状態はOKです。
テストする
- Apache Workbenchコマンドを使用してサービスの負荷を生成しておきます。
//Specify the Load Balancer DNS in the command ab -n 10000 -c 1000 http://ALB-1234567.us-east-1.elb.amazonaws.com/
- 上記のコマンドを実行した後、平均MemoryUtilizatioが50%を超えていることを見ることができます。
- MemoryUtilization > 50の場合、アラーム状態が[In alarm]に変わり、スケールアップポリシーがトリガーされます。
- スケールアップポリシーがトリガーされると、Desiredcountが2に設定されます。
まとめ
CDKを使用してAuto ScalingでFargateを作成してみました。
References :