kikukawa's diary

都内で活動するシステムエンジニアが書いてます。 興味を持った技術やハマったポイント、自分用メモをつけてます。 最近はweb中心

for_eachで作成したリソースのstateを指定する

for_eachで作成したリソースは、どのようにstateを指定するか戸惑ったのでメモです。

リソースの種類.リソース名["for_eachのkey"] で指定するみたいです。

もともとそれぞれ別リソースを作成していた場合にfor_eachで書き直した場合を考えてみます。

before

resource "aws_ssm_parameter" "foo" {
  name  = /foo
  value = "example-foo"
  type  = "String"
}
resource "aws_ssm_parameter" "bar" {
  name  = /bar
  value = "example-bar"
  type  = "String"
}

after

locals {
  params = [
    "foo",
    "bar",
  ]
}
resource "aws_ssm_parameter" "list" {
  for_each = toset(local.params) //listをtosetでfor_eachで使えるようにします。keyもvalueも同じ値が入ります。
  name  = "/${each.key}"
  value = "example-${each.key}"
  type  = "String"
}

state mv

こんな感じで指定します。

$ terraform state mv aws_ssm_parameter.foo 'aws_ssm_parameter.list["foo"]'
$ terraform state mv aws_ssm_parameter.bar 'aws_ssm_parameter.list["bar"]'

参考

https://www.terraform.io/docs/commands/import.html