CDKを使用してAuto ScalingでFargateを作成してみた。

2022.03.15

概要

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

 

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 :

Fargate Service using Application Load Balancer

Fargate Auto Scaling