背景
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が変更されていた。
赤線で引いた部分が最初のリソース作成時と現在で変更が加えられていた。
(これからも同じようなことは定期的にありそう)
2, EC2インスタンスのAMI情報をdataブロック(data.tf)から取得していたが、そのdataブロックが最新のAMIを取得する設定になっていたため。
data "aws_ami" "ami" {
most_recent = true #ここがtrueになっていたため常に最新のAMI情報を取得
owners = ["self", "amazon"]
# --------------------------
# 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の管理外として設定する。
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手動編集