今時あまり流行らないが、「AMIを作り込んでEC2を起動」というサイクルを繰り返す運用があるとする。それをTerraformに組み込む場合の、AMIの参照方法。
AMIを以下のようにデータソースとして定義する。実際のAMIの名前は更新する度にdev-example-20220130, dev-example-20220215…と日付が付与されるとする。
#####################################################
# aws ami
#####################################################
data "aws_ami" "ami_example" {
most_recent = true
owners = ["self"]
fileter {
name = "name"
values =["dev-example-*"]
}
}
先のAMIを参照してインスタンスを起動する例。以下のami行の記述により、AMI更新後も名前が「dev-example-*」のAMIを元にインスタンスを作成する。
#####################################################
# EC2 instance
#####################################################
resource "aws_instance" "instance_example_001" {
ami = ${data.aws.ami.ami_example.id}"
availability_zone = "ap-northeast-1c"
instance_type = "m5.large"
vpc_security_group_ids = [var.example-sg]
subnet_id = var.example-subnet-id
iam_instance_profile = var.example-instance-prolie
key_name = var.exapmple-key
tags = {
Name = "example-instance"
}
}
ところでvpc_security_group_idsは以下のようにリストにしないとエラーになる。([ ]で囲む)いつもそれを忘れてつまづいてしまう。idsと言うくらいだから複数アイテムを前提としているせいか?
追記
この方式はapply時に更新したAMIでインスタンスを再作成する場合はいいのだが、そうしたくない場合もある。(更新前のAMIから起動したいとか)現在のインスタンスの中身を変えずに起動したい場合は、ami = ${data.aws.ami.ami_example.id}"
としているのを、所定のAMI IDの定数に置き換える。