LoginSignup
1
1

[Terraform]EC2のAMIが更新されてリソースが削除&再作成されてしまいそうになった

Last updated at Posted at 2023-06-08

背景

terraformでAWS上で展開するためのコードを記載中に、変更を加えていないのにも関わらず既にあるEC2インスタンスが削除&再作成(Destroy& Recreate)されそうになってしまった。

# 他のリソースのコードを書き換えた後にterraform planを実行
@ terraform % terraform plan
Terraform will perform the following actions:

  # aws_instance.app_server must be replaced
-/+ resource "aws_instance" "app_server" {
      ~ ami = "ami-07c2a88388bb80eb0" -> "ami-0d739893974bd27d0" # forces replacement
(以下略)
Plan: 1 to add, 0 to change, 1 to destroy.

発生原因

1, AWSの仕様でEC2インスタンスのAMIが変更されていた。
スクリーンショット 2023-06-08 17.02.55 1.png

赤線で引いた部分が最初のリソース作成時と現在で変更が加えられていた。
(これからも同じようなことは定期的にありそう)

 

2, EC2インスタンスのAMI情報をdataブロック(data.tf)から取得していたが、そのdataブロックが最新のAMIを取得する設定になっていたため。

data.tf
data "aws_ami" "ami" {
  most_recent = true #ここがtrueになっていたため常に最新のAMI情報を取得
  owners      = ["self", "amazon"]
ec2.tf
# --------------------------
# create EC2 instance
# --------------------------
resource "aws_instance" "ec2" {
  ami                         = data.aws_ami.ami.id #data.tfから値を取得
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnet_1a.id
  associate_public_ip_address = true

3, 結果として、現在のリソースとterraform側で管理している情報に差異が生じ、terraform planの時に削除&再作成が出てきてしまった。

対処法

lifecycleブロックのignore changesを使用して、特定の項目をterraformの管理外として設定する。

ec2.tf
resource "aws_instance" "ec2" {
  ami                         = data.aws_ami.ami.id #data.tfから値を取得
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.public_subnet_1a.id
  associate_public_ip_address = true

↓↓↓ 以下を追加

lifecycle {
    ignore_changes = [
      ami,
    ]
  }

解決

No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.

補足

最初に参考にしたサイトで""をつけて使用したところ以下のようなエラーが出ました。teraformのver. 0.11以前については必要だったが、現在は必要がないみたい。

Warning: Quoted references are deprecated
 
   on appserver.tf line 66, in resource "aws_instance" "ec2":
   66:       "ami",
 
 In this context, references are expected literally rather than in quotes. Terraform 0.11 and earlier required quotes, but quoted
 references are now deprecated and will be removed in a future version of Terraform. Remove the quotes surrounding this reference
 to silence this warning.

参考

tfsteteファイルを手動で変更してできないか試したが、この方法ではエラー解消はできなかった。
tfsteate手動編集

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1