2020年8月25日火曜日

ECS Capacity providers を試す環境をCloudFormationで構築してみた

 

ECS Capacity providers を試す環境をCloudFormationで構築してみました。

構成イメージは下図のとおり。


[MEMO]


環境構築手順


## 作業環境(ローカル環境)

構築作業は、WSL2(ubuntu20.04)で実施します。
なお、AWSのリージョンは us-east-1を使用します。
  • Windows10
  • WSL2(ubuntu20.04)
  • docker 19.03.12
  • make 4.2.1
  • aws-cli 1.17.14

1. aws-cli の設定


aws-cli実行時はプロファイルを指定します。プロファイルの設定は下記のとおり。
  • blue21 という名称でプロファイルを作成
  • リージョンは us-east-1 を使用し, Output形式は json
  • 管理者権限のアクセスキーを使用

2. ソース一式のdownload


環境構築に必要なCloudFormationテンプレートなどは、Bitbucketに登録しています。
Bitbucketの下記URLからダウンロードできます。

レポジトリの内容は以下のとおり。
.
├── README.md
├── bin
│   ├── Makefile
│   ├── README.md
│   ├── cfn_validate.sh
│   └── cfn_wait.sh
├── cfn
│   ├── Makefile
│   ├── README.md
│   ├── cfn_ecs_cluster00.yml
│   ├── cfn_ecs_cluster01.yml
│   ├── cfn_ecs_service.yml
│   └── cfn_vpc.yml
└── img
    ├── image01.drawio
    └── image01.png

3. 環境構築


構築は、aws-cli で行います。
aws-cliのコマンドはMakefileに記述しています。
cfnディレクトリで、下記のmakeコマンドを実行すると、CloudFormationのスタックを作成します。
なお、EC2用にキーペア(名称:virginia_key)を使用するので、事前に同じ名前で用意するかMakefileに記述したaws-cliコマンドのパラメータでキーペアを変更してください。
$ make cfnall


cfnディレクトリで下記コマンドを実行すると、作成したスタック一覧を参照できます。

このコマンドはスタック名に "Blue21" を含むものをリストします。

$ make stackls
aws cloudformation describe-stacks \
--profile blue21 \
--query 'Stacks[?contains(StackName,`Blue21`)].{StackName:StackName,StackStatus:StackStatus,Desc:Description}' \
--output table
--------------------------------------------------------------------
|                          DescribeStacks                          |
+---------------------------+------------------+-------------------+
|           Desc            |    StackName     |    StackStatus    |
+---------------------------+------------------+-------------------+
|  Ecs service              |  Blue21Svc01PoC  |  CREATE_COMPLETE  |
|  Ecs service              |  Blue21Svc00PoC  |  CREATE_COMPLETE  |
|  Ecs cluster (Ec2)        |  Blue21Ecs01PoC  |  CREATE_COMPLETE  |
|  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
|  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
+---------------------------+------------------+-------------------+


[MEMO]

  • タスク定義の LaunchType を指定すると、キャパシティプロバイダ戦略を使用せずにECSサービスが起動する。
    LaunchTypeを指定しなければ、デフォルトのキャパシティプロバイダ戦略が使用される。
  • EcsClusterのDefaultCapacityProviderStrategyのWeightに 0 (default) を設定するとエラーになる。
  • CloudFormationでは、デフォルトのキャパシティプロバイダ戦略しか指定できない。ECSサービスやタスクにはキャパシティプロバイダ戦略を指定するパラメータが見当たらない。


4. 環境確認

構築した環境を確認します。

(1) EC2の起動テンプレート

下図は起動テンプレートです。AutoScalingGroupで使用します。
t2.small または t3.small のECS用のSpotインスタンスを起動します。


(2) AutoScalingGroup

下図は、AutoScalingGroupです。ECSのCapacityProviders で使用します。
下図の「自動スケーリング」タブに表示されたスケーリングポリシーは、CapacityProvidersによって設定されたものです。


(3) ECSクラスタ

下図はECSクラスタです。
Blue21Ecs00PoCは、CapacityProvidersをFargateSpotに設定しています。
Blue21Ecs00Pocは、CapacityProvidersをAutoScalingGroupに設定しています。


FargateSpotのキャパシティプロバイダは下図のとおり
デフォルトのキャパシティプロバイダ戦略を FargateSpotにしています。


AutoScalingGroupのキャパシティプロバイダは下図のおり。
デフォルトのキャパシティプロバイダ戦略をAutoScalingGroupにしています。


(5) FargateSpotのサービス

下図は、FargateSpotのサービスです。
CapacityProvidersの管理下にあるサービスの場合は、「キャパシティプロバイダ戦略」が表示されます。


下図は、FargateSpotのタスクです。
CapacityProvidersの管理下にあるタスクの場合は、「キャパシティープロバイダー」が表示されます。


(6) AutoScalingGroupのサービス

下図は、AutoScalingGroupのサービスです。
CapacityProvidersの管理下にあるサービスの場合は、「キャパシティプロバイダ戦略」が表示されます。


下図は、AutoScalingGroupのタスクです。
CapacityProvidersの管理下にあるタスクの場合は、「キャパシティープロバイダー」が表示されます。


(7) ECSインスタンス

下図は、ECSのEC2インスタンスです。


5. 環境破棄


下記のスタックをAWSコンソールで削除します。
上から順番に削除します。

--------------------------------------------------------------------
|                          DescribeStacks                          |
+---------------------------+------------------+-------------------+
|           Desc            |    StackName     |    StackStatus    |
+---------------------------+------------------+-------------------+
|  Ecs service              |  Blue21Svc01PoC  |  CREATE_COMPLETE  |
|  Ecs service              |  Blue21Svc00PoC  |  CREATE_COMPLETE  |
|  Ecs cluster (Ec2)        |  Blue21Ecs01PoC  |  CREATE_COMPLETE  |
|  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
|  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
+---------------------------+------------------+-------------------+

[MEMO]

  • キャパシティプロバイダのAutoScalingGroupはスタック削除のときにエラーになる場合がある。
    もし、エラーになったら、EcsCluster, EcsCapacityProvidersは残してスタックを削除し、AWSコンソールで EcsClusterを削除する。
  • キャパシティプロバイダのAutoScalingGroupはスタック削除のときにAutoScalingGroupに起動中のインスタンスがゼロなら、エラーにならない。