ECS で使用する Amazon Linux の選択肢について調査
仕事の中で、 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
- LInux 2の中でも、使用する Linux カーネルが異なるものが混在
- 4.14 / 5.10
- LInux 2の中でも、使用する Linux カーネルが異なるものが混在
- Amazon Linux 2023
- もともとは 2022 になる予定だったが、開発遅延で1年遅れたらしい
- 今後は2年毎に最新バージョンがリリースされることになる。既存バージョンは最新バージョンリリース後もメンテナンス期間が3年用意される。つまり最大5年間サポートされる
今から構築するのなら、特別な理由が無い限り最新のバージョン (Amazon Linux 2023) を使用するのが良い。
ただ、以前のバージョンに比べていくつかセキュリティ的な最適化が行われており、その結果、既存の Experience と異なる可能性があるため注意が必要。
- e.g. SE Linux がデフォルトで有効に
- e.g. SSH で使用できるキーの暗号アルゴリズムが変更
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 最適化インスタンスを使用するのが良い
基本的に、上述の価格表でリストアップしているようなインスタンスタイプについてはすべて EBS 最適化インスタンスであるため、この辺の範疇で選ぶのであればあまり悩むところはなさそう
EBS Volumes
そうでない場合はおおむね 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