はじめに
EC2をTerraformで作成する際にとりあえず最新のAMIを設定したいと思ったので調査しました。
目次
1. Terraformの記述(結論)
2. AMI名エイリアスの導出方法
3. 参考
1. Terraformの記述(結論)
dataブロックでAWS Systems Manager Parameter Store(以下、AWS SSM)を利用して最新のAMIを取得します。
data "aws_ssm_parameter" "amzn2_latest" {
name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2"
// カーネル 4.14 の場合
name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}
resource "aws_instance" "this" {
ami = data.aws_ssm_parameter.amzn2_latest.value
associate_public_ip_address = var.associate_public_ip_address
instance_type = var.instance_type
key_name = var.key_name
subnet_id = var.subnet_id
iam_instance_profile = var.iam_instance_profile
vpc_security_group_ids = var.vpc_security_group_ids
user_data = var.user_data
tags = merge(tomap({ Name = "${var.name}-ec2" }), var.tags)
capacity_reservation_specification {
capacity_reservation_preference = "none"
}
}
2. AMI名エイリアスの導出方法
まず、なぜAMI名エイリアスの導出方法を記載するか説明します。
AWS SSMを利用する際に、AMIパラメータストアの名前空間を指定する必要があります。
名前空間は2つのパートから構成されます:
- パラメータストア プレフィクス(ツリー): /aws/service/ami-amazon-linux-latest/
- AMI名エイリアス: (例) amzn-ami-hvm-x86_64-gp2
このAMI名エイリアス
がカーネル5系と4系で異なるため、導出方法を記載することとしました。
4系: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
5系: /aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2
AWSコンソールから目的のAMI名を確認
以下の手順でAMI IDを取得します。
AMI IDでAMIを検索し、AMI名を取得します。
取得したAMI名から日付ベースのバージョン識別子を削除した文字列がAMI名エイリアスとなります。
(上記の場合はamzn2-ami-kernel-5.10-hvm-x86_64-gp2
となります。)
AMI名エイリアスが正しいかはAWS CLIのssm get-parameters-by-path
を利用することで確認できます。
$ aws ssm get-parameters-by-path
--path "/aws/service/ami-amazon-linux-latest"
--query 'reverse(sort_by(Parameters,&LastModifiedDate))[:20].Name'
[
"/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-s3",
"/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-s3",
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-s3",
"/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-s3",
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2",
"/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-x86_64",
"/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-arm64",
"/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64",
"/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-arm64",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-arm64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2", <- こちらと一致
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-ebs",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-arm64-gp2",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2",
"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs"
]
補足
AWSコンソールでなくてもAWS CLIを利用できる場合は以下のコマンドで最新のAMIを確認できます。
検索後は、上記と同様の手順でAMI名エイリアスを導出します。
$ aws ec2 describe-images
--owners amazon
--filters "Name=name,Values=amzn2*-gp2"
--query 'reverse(sort_by(Images, &CreationDate))[:5].Name'
[
"amzn2-ami-minimal-selinux-enforcing-hvm-2.0.20211201.0-x86_64-gp2",
"amzn2-ami-kernel-5.10-hvm-2.0.20211201.0-x86_64-gp2",
"amzn2-ami-minimal-selinux-enforcing-hvm-2.0.20211201.0-arm64-gp2",
"amzn2-ami-hvm-2.0.20211201.0-x86_64-gp2",
"amzn2-ami-kernel-5.10-hvm-2.0.20211201.0-arm64-gp2"
]