はじめに
DSOCインフラチームの藤田です。昨年からプレイしているデス・ストランディングがまだ折り返し地点にも至っていなかったことを知りました。原因は一生懸命国道を作りすぎたためだと思います。
今回は昨年のre:Inventで発表されたECS Capacity Auto ScalingをTerraformで実装してみた結果を共有します。
ECS Cluster Auto Scaling とは
一言でとても乱暴に説明すると、ECS on EC2においてEC2のオートスケーリングを考えなくても良くなります。今回はTerraformで実装した部分にのみフォーカスするので詳細は割愛します。以下リンクで詳しく説明されています。
またこちらではキャパシティの計算方法や、スケールインの挙動などが詳しく説明されています。
Terraformで実装
ゴール
ECS Serviceで必要なタスク数に応じてEC2インスタンスが0台からスケールアウトしていくことの確認をゴールとします。
注意
2020/01時点で、一度作成したCapacity Provider(CP)は削除できません。 terraform destroy
してもtfstaeから削除されるのみでAWS上には残ったままになります。aws-cliでも対応していないようなので一度作成すると現状削除する方法がありません(今後削除できるようになるとは思いますが)。
コード
ECS on EC2の環境を作成してくれます。突貫で作ったので大分乱雑ですがご勘弁ください。 VPC, Subnet, Internet Gateway, IAM Roleなども作成されますので必要に応じて書き換えていただければと思います。また今回は検証用途のため、EC2はスポットインスタンスを利用しています。
ECS Cluster Auto Scalingの実装部分について簡単に説明します。aws_ecs_capacity_providerリソースでEC2 Auto Scaling Group(ASG)と紐付けたCPを作成しています。これをaws_ecs_clusterリソースに紐付け、aws_ecs_serviceリソースのcapacity_provider_strategyで指定することで、ECS Serviceの必要なタスク数がCPに連携されてASGで自動的にインスタンスを起動してくれます。
少し脱線しますがCPとしてFargateを利用したい場合、aws_ecs_clusterリソースで以下のように定義できます。
resource "aws_ecs_cluster" "tmp-cluster" { name = "${var.ecs_cluster_name}" capacity_providers = ["FARGATE", "FARGATE_SPOT"] default_capacity_provider_strategy { base = 0 capacity_provider = "FARGATE" weight = 1 } default_capacity_provider_strategy { base = 0 capacity_provider = "FARGATE_SPOT" weight = 1 } }
実行
クローンして terraform init
, terraform apply
をするとECS Serviceを起動するのに必要なリソースが作成されます。その後、AWSコンソールから作成されたECS Serviceのタスク数を変更してみると、ECSインスタンスが作成されてタスクがRUNNINGになることが確認できると思います。
備考
- CPはterraform-provider-aws v2.42.0から対応しています
- aws_ecs_capacity_providerリソースの
managed_termination_protection
を有効化したい場合、aws_autoscaling_groupリソースのprotect_from_scale_in
をtrue
にする必要があります- コンテナが稼働しているEC2インスタンスはインスタンスの保護機能が有効になり、スケールインされなくなります
- 本筋とはそれますが、terraform-provider-aws v2.41.0からaws_autoscaling_groupリソースで
weighted_capacity
を設定できるようになっています- 起動するインスタンスタイプ毎に重み付けが可能になっており、より柔軟に様々なインスタンスタイプを組み合わせたオートスケーリンググループが構築可能です
- 前章で説明していますがECS ServiceでCPを利用する場合、CPを指定してECS Serviceを作成する必要があります
- AWSコンソールからECS Serviceを作成する際はECSクラスタに設定されたデフォルトのCP戦略(
default_capacity_provider_strategy
)を引き継いでくれます - ECS用のコマンドラインツールであるecs-cliを利用して
ecs-cli compose
からECS Serviceを作成した場合、ECSクラスタに設定されたCP戦略が引き継がれないようです
- AWSコンソールからECS Serviceを作成する際はECSクラスタに設定されたデフォルトのCP戦略(
感想
CPの裏ではCloudWatch AlarmやApplication Auto Scalingなどが動いていますが、Terraformから構築するときはこれらを意識する必要はなさそうなので楽ちんでした。 大分駆け足になりましたが今回は以上となります。少しでも参考になれば幸いです。