今時あまり流行らないが、「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の定数に置き換える。

 

参考
Resource: aws_instance

 

Tokyo


関連がありそうな記事