前提:module化してある
概要:再作成防ぐ楽な方法ないのか模索
①for eachのリファクタリングで関連するリソースをすべてmoved blockで定義 → 王道
②module 名を無理やり変えてmoduleで作成されるリソースはすべてmovedで切り替えるといった手法を取る → 楽にできたら神
https://www.terraform.io/language/modules/develop/refactoring#enabling-count-or-for_each-for-a-module-call
結論:結局①に落ち着いた
本編
module側
変更前
変更後
resource "aws_efs_file_system" "a-efs" {
for_each = var.efs-list
encrypted = true
performance_mode = "generalPurpose"
throughput_mode = "bursting"
tags = {
Name = "${var.project}-${var.environment}-efs-${each.key}"
}
}
resource "aws_efs_mount_target" "efs-mount-a" {
for_each = var.efs-list
file_system_id = aws_efs_file_system.a-efs[each.key].id
subnet_id = lookup(each.value, "subnet_a_id")
security_groups = [lookup(each.value, "security_group_id")]
}
main側
変更前
module "efs" {
source = "../../module/efs"
#システム/環境名
project = var.project
environment = var.environment
efs-list = {
"Test1" = {
"security_group_id" = module.vpc.sg["sg-efs"].id
"subnet_a_id" = module.vpc.subnet["pri-1a"].id
"subnet_c_id" = module.vpc.subnet["pri-1c"].id
"subnet_d_id" = module.vpc.subnet["pri-1d"].id
}
"Test2" = {
"security_group_id" = module.vpc.sg["sg-efs-ProdJobWeb"].id
"subnet_a_id" = module.vpc.subnet["1a"].id
"subnet_c_id" = module.vpc.subnet["1c"].id
"subnet_d_id" = module.vpc.subnet["1d"].id
}
}
}
変更後
module "a-efs" {
source = "../../module/efs"
#システム/環境名
project = var.project
environment = var.environment
efs-list = {
"Test1" = {
"security_group_id" = module.vpc.sg["sg-efs-TestJobWeb"].id
"subnet_a_id" = module.vpc.subnet["pri-1a"].id
"subnet_c_id" = module.vpc.subnet["pri-1c"].id
"subnet_d_id" = module.vpc.subnet["pri-1d"].id
}
"Test2" = {
"security_group_id" = module.vpc.sg["sg-efs-ProdJobWeb"].id
"subnet_a_id" = module.vpc.subnet["1a"].id
"subnet_c_id" = module.vpc.subnet["1c"].id
"subnet_d_id" = module.vpc.subnet["1d"].id
}
}
}
moved block パターン①→module名変えずにやったパターン→こっちは普通にできる
moved {
from = module.efs.aws_efs_file_system.efs-Test2
to = module.efs.aws_efs_file_system.efs["Test2"]
}
moved {
from = module.efs.aws_efs_file_system.efs-Test1
to = module.efs.aws_efs_file_system.efs["Test1"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test2-mount-a
to = module.efs.aws_efs_mount_target.efs-mount-a["Test2"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test2-mount-c
to = module.efs.aws_efs_mount_target.efs-mount-c["Test2"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test2-mount-d
to = module.efs.aws_efs_mount_target.efs-mount-d["Test2"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test1-mount-a
to = module.efs.aws_efs_mount_target.efs-mount-a["Test1"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test1-mount-c
to = module.efs.aws_efs_mount_target.efs-mount-c["Test1"]
}
moved {
from = module.efs.aws_efs_mount_target.efs-Test1-mount-d
to = module.efs.aws_efs_mount_target.efs-mount-d["Test1"]
}
module block パターン②→module名を変えるだけでできたら神パターン
moved {
from = module.efs
to = module.a-efs
}
結果(一部)
# module.a-efs.aws_efs_file_system.efs-Test1 will be destroyed
# (because aws_efs_file_system.efs-Test1 is not in configuration)
# (moved from module.efs.aws_efs_file_system.efs-Test1)
movedブロックが無視されているわけではないけど再作成は発生している(バタン