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_definition
の container_properties
に以下を追加するようです。
runtimePlatform = {
cpuArchitecture = "ARM64"
operatingSystemFamily = "LINUX"
}
ちゃんと反映されておりました。