ECS Capacity providers を試す環境をCloudFormationで構築してみました。
構成イメージは下図のとおり。
[MEMO]
- 「Fargate(FargateSpot)」 と 「AutoScalingGroup」は、同じクラスタに混在できますが、戦略に指定できるのはどちらか一方だけみたいです。(下記URL参照)
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cluster-capacity-providers.html - 費用を抑えたいので、FargateSpotとAutoScalingGroup(SpotInstance)の2つを使用します。
- ECSクラスタを2つ作成します。FargetSpot用とAutoScalingGroup用です。
- AutoScalingGroupは MixedInstnacesPolicy を使用してインスタンスを起動します。(下記URL参照)
https://aws.amazon.com/jp/blogs/news/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase-options/ - 現時点で、ECS Capacity providers をCloudFormationで構築するには、いろいろ、問題があるようです。
https://github.com/aws/containers-roadmap/issues/631 - SSMのセッションマネージャでECSインスタンスにログインできるようにします。
環境構築手順
## 作業環境(ローカル環境)
構築作業は、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コマンドのパラメータでキーペアを変更してください。
なお、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に起動中のインスタンスがゼロなら、エラーにならない。