Fargate Spotってschedule task適用できないの!?誰か教えて!
— adachin👾SRE (@adachin0817) April 11, 2022
さてFargate Spotですが、ECSのサービスでの設定はTerraformでサクッとできるものの、Scheduled Taskでは少し設定等ややこしいので、ブログします。まずは概要から。
Fargate Spotとは
https://aws.amazon.com/jp/blogs/news/aws-fargate-spot-now-generally-available/
EC2のスポットインスタンスと概念はほぼ一緒で、タスクで定義した容量がFargate Spotで利用可能になります。メリットとしては最大70%引きになりますが、デメリットとしては運用している最中にFargate Spotの開放が必要になるとタスクが中断される可能性があります。なので、いつ落ちたのかは検知しなければなりません。ステージング環境は全てFargate Spotにして、本番環境は一台Fargate、2台目やオートスケールする場合はFargate Spotにすればサービスがダウンすることはありません。
そして、Fargate SpotにはCapacity provider strategyというタスク数の割合をチューニングする機能があります。この機能がさっぱりわからないと思いますので、以下わかりやすく書いておきます。
- base(必ず動いてほしいタスク数)
- weight(タスクが増える際にどの比率で増やしていくかの対比)
例えば、本番環境のように1台目はFargate、2台目やオートスケールをFargate Spotにしたい場合は以下のようにすると良いです。
・capacity_provider(Fargate)
・base = 1
・weight = 0
・capacity_provider(FARGATE_SPOT)
・base = 0
・weight = 1
また、ステージング環境はFARGATE_SPOTのみにする場合は以下の通り。
・capacity_provider(Fargate)
・base = 0
・weight = 0
・capacity_provider(FARGATE_SPOT)
・base = 1
・weight = 1
では現状動作しているコンテナらをFargate Spotに切り替えてみましょう。
既存のコンテナをFargate Spotに切り替える手順
- awscliで適用
1 2 3 4 5 |
$ aws --profile=hoge --region=ap-northeast-1 ecs update-service \ --capacity-provider-strategy capacityProvider=FARGATE,base=1,weight=0 capacityProvider=FARGATE_SPOT,base=0,weight=1 \ --cluster hoge \ --service hoge \ --force-new-deployment |
- 変更後確認
- Terraformで差分修正(ecs.tf)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
~省略~ #launch_type = "FARGATE" #コメントアウト # 追加 capacity_provider_strategy { base = 1 capacity_provider = "FARGATE" weight = 0 } capacity_provider_strategy { base = 0 capacity_provider = "FARGATE_SPOT" weight = 1 } deployment_circuit_breaker { enable = true rollback = true } deployment_controller { type = "ECS" } |
- タスクがFargate Spotになっていること
2台目以降、上記のようにFargate Spotになっていれば完了です。
Scheduled TaskのコンテナをFargate Spotに切り替える手順
Scheduled TaskのFargate Spotはデフォルトキャパシティーに変更後、EventBridge>容量プロバイダー戦略>クラスターのデフォルトを使用にするのか。後でブログ書こう。
— adachin👾SRE (@adachin0817) April 19, 2022
- ecs.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
resource "aws_ecs_cluster" "hoge" { name = "hoge" capacity_providers = [ "FARGATE", "FARGATE_SPOT", ] #追加 default_capacity_provider_strategy { capacity_provider = "FARGATE_SPOT" base = "1" weight = "1" } } |
- cloudwatch_event_target.tf
1 2 3 4 5 |
ecs_target { launch_type = "" #空白 task_count = 1 task_definition_arn = "arn:aws:ecs:xxxxxxx:xxxxxxxxxxx:task-definition/hoge" #platform_version = "1.4.0" #コメントアウト |
Scheduled Taskの場合はCapacity provider strategyを予めFargate Spotとして適用する必要があります。EventBridgeでは launch_type
を空白にしないと以下のようにコンピューティングオプション>容量プロバイダー戦略>クラスターのデフォルトを使用にならないので注意するところです。
まとめ
気になるコストの部分はコンテナのスペックが高ければ高いほど削減できますが、そこまでスペックがないコンテナだと月$70くらいしか変わらないので、あまり効果的ではないように見受けられました。が、コスト削減としての取り組みはマストで対応すべきでしょう。また、現段階では今の所コンテナは落ちていないですが、ステージング環境は監視せずに気づいたら立ち上げる感じでも良さそう。むしろいつどんなときに落ちるのか調査したい。
0件のコメント