🪣

ECS で使用する Amazon Linux の選択肢について調査

2023/08/08に公開

仕事の中で、 ECS (ECS on EC2) の環境を構築する際に Amazon Linux を 使用するケースがあったのですが、その際に軽くサーベイをしました。
あまり 「Amazon Linux とは何なのか」 的な内容は記載していない浅い内容になります。
また、上述のユースケースのため、ECS の動作環境として使用する事を前提としています

nutshell

  • ECS-Optimized インスタンスを使用する (※当ドキュメントでは特に言及しない)
  • Amazon Linux 2023 を使用する
  • X86_64 と Arm ではどちらの選択肢もあり得ると思う
    • 価格の安さを優先するなら Arm
    • Compatibility、安定さを優先するなら X86_64
  • EBS 最適化インスタンスを選択する
  • Volume Type は gp3

Amazon Linux のバージョン

以下が存在する

  • Amazon Linux
    • 割愛
  • Amazon Linux 2
  • Amazon Linux 2023
    • もともとは 2022 になる予定だったが、開発遅延で1年遅れたらしい
    • 今後は2年毎に最新バージョンがリリースされることになる。既存バージョンは最新バージョンリリース後もメンテナンス期間が3年用意される。つまり最大5年間サポートされる

今から構築するのなら、特別な理由が無い限り最新のバージョン (Amazon Linux 2023) を使用するのが良い。
ただ、以前のバージョンに比べていくつかセキュリティ的な最適化が行われており、その結果、既存の Experience と異なる可能性があるため注意が必要。

Amazon Linux の CPU

ざっくり、X86_64 か Arm か。
ここでは価格のみにフォーカスして表を作成。

instance type X86_64 Arm
t*.medium t3.medium (2vCPU / 4GiB mem) $0.054 t4g.medium (2vCPU / 4GiB mem) $0.043
c*.xlarge c5a.xlarge (4vCPU / 8GiB mem) $0.192 c7g.xlarge (4vCPU / 8GiB mem) $0.182
r*.4xlarge r5.4xlarge (16vCPU / 128GiB mem) $1.216 r6g.4xlarge (16vCPU / 128GiB mem) $0.973

確実に Arm チップ(Graviton)の方が20%程度安いが、圧倒的というほどでも無い
安定した挙動を求めるなら X86_64 でも良いかもしれない

AMI ID

ref. https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html

Amazon Linux 2023 (X86_64)

% aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended --region ap-northeast-1
{
    "Parameters": [
        {
            "Name": "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended",
            "Type": "String",
            "Value": "{\"ecs_agent_version\":\"1.72.0\",\"ecs_runtime_version\":\"Docker version 20.10.23\",\"image_id\":\"ami-0013f7c005123f191\",\"image_name\":\"al2023-ami-ecs-hvm-2023.0.20230606-kernel-6.1-x86_64\",\"image_version\":\"2023.0.20230606\",\"os\":\"Amazon Linux 2023\",\"schema_version\":1,\"source_image_name\":\"al2023-ami-minimal-2023.0.20230607.0-kernel-6.1-x86_64\"}",
            "Version": 6,
            "LastModifiedDate": "2023-06-14T00:09:48.411000+09:00",
            "ARN": "arn:aws:ssm:ap-northeast-1::parameter/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

Amazon Linux 2023 (Arm)

% aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended --region us-east-1 
{
    "Parameters": [
        {
            "Name": "/aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended",
            "Type": "String",
            "Value": "{\"ecs_agent_version\":\"1.72.0\",\"ecs_runtime_version\":\"Docker version 20.10.23\",\"image_id\":\"ami-089c99bab97824f11\",\"image_name\":\"al2023-ami-ecs-hvm-2023.0.20230606-kernel-6.1-arm64\",\"image_version\":\"2023.0.20230606\",\"os\":\"Amazon Linux 2023\",\"schema_version\":1,\"source_image_name\":\"al2023-ami-minimal-2023.0.20230607.0-kernel-6.1-arm64\"}",
            "Version": 6,
            "LastModifiedDate": "2023-06-14T00:06:06.708000+09:00",
            "ARN": "arn:aws:ssm:us-east-1::parameter/aws/service/ecs/optimized-ami/amazon-linux-2023/arm64/recommended",
            "DataType": "text"
        }
    ],
    "InvalidParameters": []
}

EBS 最適化インスタンス

EBS をディスクボリュームとして使用するのなら、基本的に EBS 最適化インスタンスを使用するのが良い
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-optimized.html

基本的に、上述の価格表でリストアップしているようなインスタンスタイプについてはすべて EBS 最適化インスタンスであるため、この辺の範疇で選ぶのであればあまり悩むところはなさそう

EBS Volumes

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html
Provisioned IOPS を採用する場合はそちらを使用。
そうでない場合はおおむね gp2 と gp3 の比較になり、この比較であれば新規に構築するのであれば gp3 で良いと思われる

Max throughput per volume
gp3: 1,000 MiB/s
gp2: 250 MiB/s *

Appendix. terraform の設定

上記の選択肢を選んだ時の、Terrraform における AutoScaling Group の launch_template の記述例を蛇足的に追記。
X86_64 を前提に記述。

resource "aws_launch_template" "ecs_on_ec2" {
  name_prefix = "sada-cluster"
  # image_id      = "ami-0013f7c005123f191" # Amazon Linux 2 X86_64 ECS Optimized
  image_id      = "ami-07695fdb89e41b9f8" # Amazon Linux 2023 X86_64 ECS Optimized
  instance_type = "....."
  user_data = base64encode(<<EOF
#!/bin/bash
echo "ECS_CLUSTER=sada-cluster" >> /etc/ecs/ecs.config;
echo "ECS_WARM_POOLS_CHECK=true" >> /etc/ecs/ecs.config;
EOF
  )

  ebs_optimized = true
  block_device_mappings {
    # 採用する Amazon Linux のバージョンにあわせて指定する必要がある
    # https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html
    device_name = "/dev/sdf" # HVM の推奨は /dev/sd[f-p]
    ebs {
      delete_on_termination = true
      encrypted             = true
      volume_size           = 30
      volume_type           = "gp3"
    }
  }

  network_interfaces {
    security_groups = [...]
  }

  iam_instance_profile {
    arn = ...
  }

  monitoring {
    enabled = true
  }

  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance#metadata-options
  # IMDSv2 endpoint を使用するなら以下の設定が必要
  # https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html
  metadata_options {
    http_endpoint = "enabled"
    http_tokens   = "required"
  }

  # https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template#tag-specifications
  tag_specifications {
    resource_type = "instance"
    tags = {
    }
  }

  tags = {
  }
}

Discussion