ようへいの日々精進XP

よかろうもん

1 円でもお安く Fargate を動かしたいので Fargate Spot についてザクッと調べた

tl;dr

昨年の re:Invent でリリースされた Fargate Spot というサービス. ECS Fargate を通常の最大 70% オフの価格で利用出来るということで, ギョームで利用すべくドキュメントを斜め読みしたり既存のクラスタに適用してみたりしましたのでメモっておきます.

Fargate Spot をざっくりと理解する

ドキュメント斜め読み

ドキュメントをざっとななめ読みしてみました.

f:id:inokara:20200422202257p:plain

  • クラスタにつき 6 つまでのキャパシティプロバイダを設定出来る
  • 各キャパシティプロバイダには BaseWeight でタスクの数を設定する
    • Base は最低限動かしたいタスクの数を指定 (すべてのプロバイダの中で 1 つのプロバイダのみ指定が可能)
    • Weight には Base の数を超えたタスクをどのように追加するかを指定する

などなど. 終了通知等については, スポットインスタンスと同じような感じです.

Base と Weight が分かりづらい

例えば, 以下のような戦略があった場合.

戦略 Base Weight
FARGATE_SPOT 1 2
FARGATE 1
  • Base で 1 が指定されているので, まず 1 タスクは Fargate Spot で起動する
  • タスク追加される場合, Fargate Spot で 2 , Fargate で 1 の割合でタスクが起動することになる

さらに, 以下のような戦略があった場合,

戦略 Base Weight
FARGATE_SPOT 1 1
FARGATE 1
  • Base は上記の例と同様に Fargate Spot で 1 つ起動
  • タスクが追加された場合, Fargate Spot で 1 , Fargate で 1 の割合でタスクが起動することになる
  • 尚, タスクが 1 つ追加された場合, Fargate から優先的に追加される (ってどこかに書いてあったけど見失った)

稼働中のクラスタで動作確認

マネジメントコンソールからだと操作出来ない

  • 残念

既存のクラスタに対してキャパシティプロバイダを設定

以下のようにキャパシティプロバイダを設定します.

$ aws ecs put-cluster-capacity-providers \
     --cluster ${CLUSTER_NAME} \
     --capacity-providers FARGATE FARGATE_SPOT \
     --default-capacity-provider-strategy capacityProvider=FARGATE_SPOT,weight=1,base=1 capacityProvider=FARGATE,weight=1
  • キャパシティプロバイダとして FARGATE と FARGATE_SPOT を設定
  • キャパシティ戦略として以下のように設定
    • FARGATE_SPOT
      • Base: 1
      • Weight: 1
    • FARGATE
      • Base: 0
      • Weight: 1

マネジメントコンソールで確認することが可能です. キャパシティプロバイダー という項目が増えています.

f:id:inokara:20200422212022p:plain

クラスターの更新 をポチッとなっとすると...

f:id:inokara:20200422211405p:plain

RunTask

以下のように通常の run-task--capacity-provider-strategy capacityProvider=FARGATE_SPOT,weight=1 オプションを付与して実行します.

$ cat test.json
{
  "containerOverrides": [
    {
      "name": "mytask",
      "command": ["sh", "test.sh"]
    }
  ]
}
$ aws ecs run-task \
  --region ap-northeast-1 \
  --cluster ${CLUSTER_NAME} \
  --capacity-provider-strategy capacityProvider=FARGATE_SPOT,weight=1 \
  --task-definition ${TASK_DEFINITION_NAME}:${REVISION} \
  --overrides file://test.json \
  --query 'tasks[].taskArn' \
  --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxxxx,subnet-yyyyyyyy],securityGroups=[sg-zzzzzzzz],assignPublicIp=ENABLED}" \
  --output text

以下のようにキャパシティプロバイダーが FARGATE_SPOT を利用してタスクが起動していることがわかります.

f:id:inokara:20200422211422p:plain

以上

Fargate Spot についてザクッと調べて, ザクッと触ってみました. BaseWeight についてまだ理解が追いついておらず, まだまだトライが必要な感じです.

参考