nato243 weblog.n-jitter brand iconweblog.n-jitter
テクノロジー

Fargate Spot が AWS Graviton ベースのコンピューティングをサポート。AWS Batch立ててみた

2024.09.11
DockerAWSTerraform
Fargate Spot が AWS Graviton ベースのコンピューティングをサポート。AWS Batch立ててみた アイキャッチ

Fargate Spot で ARM64サポート



https://aws.amazon.com/jp/about-aws/whats-new/2024/09/amazon-ecs-graviton-based-spot-compute-fargate/

アナウンスがでていました。

外道父 さんのブログでも検証が行われていますね。
クラスメソッドさんの方での検証では、X86が$0.01525211/n に対して、ARMは$0.0122023/h ほどだそうです。

どういうものかというと、今までAWS FargateはSPOTモードは今までX86_64しか指定できませんでしたが、今回のアップデートでGraviton ベースのコンピューティングが利用可能になりました。

具体的にどんな効能があるかというと、高性能なCPUがさらにお安く使えるようになったよ、ということです。
それでもEC2 SPOT/RIに比べたら高額なので、常駐サーバーではやはりEC2版を使っていくことになると思いますが、

AWS Batchなどの一時コンピューティング環境としてはファーストチョイスになっていきそうです。

なにしろECS-EC2でAWS Batch組むのはAMI更新だのTerraform更新時の段階デプロイの必要だったり、けっこうコンピューティング環境の維持が面倒なので...。(それでも昔よりはだいぶマシになりましたが、職人芸感がいつも漂う)

FargateはAWS BatchのTerraformの記述がわりと簡潔なので、できるならこれを使っていきたいわけです。


AWS Batch立ててみた

resource "aws_batch_job_definition" "arm_job" {
  name = "arm_job"
  type = "container"
  retry_strategy {
    attempts = 1 # ジョブの再試行回数を1回に設定
  }

  platform_capabilities = [
    "FARGATE",
  ]

  # コンテナプロパティの設定をJSON形式で指定
  container_properties = jsonencode({
    image      = "${aws_ecr_repository.arm_job.repository_url}:latest" # コンテナイメージを指定
    jobRoleArn = aws_iam_role.app_role.arn                                                    # ジョブロールを指定. バッチジョブが実行されるコンテナ内で使用されるIAMロール
    //実行ロールを指定. バッチジョブを実行する際にAWS Batchが使用するIAMロールを指定します。このロールは、AWS Batchがジョブを起動し、実行するための権限を持ちます
    // FARGATEには必要
    executionRoleArn = aws_iam_role.iam_role_for_sfn.arn # 実行ロールを指定. バッチジョブを実行する際にAWS Batchが使用するIAMロールを指定します。このロールは、AWS Batchがジョブを起動し、実行するための権限を持ちます
    logConfiguration = {
      logDriver = "awslogs" # ログドライバーをawslogsに設定
      options = {
        "awslogs-group"         = "/aws/batch/job" # ロググループを指定
        "awslogs-region"        = "ap-northeast-1" # ログのリージョンを指定(適宜変更)
        "awslogs-stream-prefix" = "batch"          # ログストリームのプレフィックスを指定
      }
    }
    resourceRequirements = [
      {
        type  = "MEMORY"
        value = "8192" # メモリサイズを指定(MB単位)
      },
      {
        type  = "VCPU"
        value = "4" # vCPU数を指定
      }
    ]
    ephemeralStorage = {
      sizeInGiB = 100 # 一時ストレージのサイズを100GBに設定
    }
    fargatePlatformConfiguration = {
      platformVersion = "LATEST"
    }
    networkConfiguration = {
      assignPublicIp = "ENABLED"
    }
    runtimePlatform = {
      cpuArchitecture       = "ARM64"
      operatingSystemFamily = "LINUX"
    }

  })
}

コンピューティング環境でなく、ジョブ定義 aws_batch_job_definitioncontainer_properties に以下を追加するようです。

    runtimePlatform = {
      cpuArchitecture       = "ARM64"
      operatingSystemFamily = "LINUX"
    }

ちゃんと反映されておりました。