見出し画像

AWS ECSタスクの料金を正確に把握する

こんにちは。求人Hubで主にバックエンドとインフラを担当している川口(@kawasystem)です。

求人HubではECSタスクをFargateやStepFunctionsで使用しています。
今回は、この2つについて解説します。

Fargate

Fargateの場合は簡単です。ECSタスク定義のタグとECSサービスの伝播タグコスト配分タグで設定したタグを設定すれば計測できます。

AWSコンソール

ECSタスク定義
ECSサービスの伝播タグ

Terraform


resource "aws_ecs_task_definition" "default" {

  tags = {
    Feature = "api"
  }
}
resource "aws_ecs_service" "default" {
  propagate_tags = "TASK_DEFINITION"
}

タグ設定後のコストカテゴリ

以下の様にタグ毎にみることができます。これでFargateであるapi, web, worker, logstashがどのぐらい費用がかかるかわかります。

StepFunctions

求人Hubはバッチ処理(ECS run-task)をStepFunctionで実行しています。バッチの種類が多いため、どのバッチがコストがかかっているか特定します。

求人HubではRailsを使っているので、rakeタスクのコマンドを(ECSの)タグに出力するようにします。具体的には、bundle exec xxx:xxxのパラメータのxxx:xxxを部分を取得し、StepFunctionsのステートマシンの定義にECSタスク定義のタグをoverrideする様に設定します。

ステートマシン定義

{
  "StartAt": "Sample",
  "States": {
    "Sample": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.sync",
      "Parameters": {
        "Overrides": {
          "ContainerOverrides": [
            {
              "Name": "app",
              "Command.$": "$.commands"
            }
          ]
        },
        "Tags": [
          {
            "Key": "RakeTask",
            "Value.$": "States.ArrayGetItem(States.StringSplit(States.ArrayGetItem($.commands, 3), '['), 0)"
          }
        ]
      },
      "End": true
    }
  }
}

タグ設定後のコストカテゴリ

以下の様にバッチの種類毎に料金を取得できる様になりました。

これでどのバッチが費用がわかるか特定できたので、さらにコスト削減するには、CPUとメモリを割り当てを見直せば、進むと思います。

おわりに

Rails, AWSを中心とした経験を積みたいエンジニアの方には適した環境です。少しでも興味を持った方は下記の募集から気軽にエントリーしてください。


この記事が気に入ったらサポートをしてみませんか?