tjinjin's blog

さらなる高みに1nmずつ近づくブログ

ネストしたmoduleをterraform importする

About

前回の Terraformのmoduleを使ってIAMロールを管理する - tjinjin's blog を受けて既存のIAMロールをimportするときにハマったのでメモしておきます。

バージョン

  • terraform v0.9.11

terraform moduleのimportについて

公式ページを見ると下記のように書いてあります。

$ terraform import module.foo.aws_instance.bar i-abcd1234

Command: import - Terraform by HashiCorp

普通に使う分には問題無いですが、moduleがネストしているケースでは少し工夫が必要でした。

サンプルですが、moduleが下記のような構成になっているとします。

module
├── group
│   ├── admin
│   │   ├── fuga.tf
│   │   └── variables.tf
│   └── developer
│       ├── hoge_role.tf
│       ├── main.tf
│       └── variables.tf
└── iam_role
    ├── main.tf
    └── variable.tf
# module/group/admin/fuga.tf
module "fuga" {
  source = "../../iam_role"

  role_arn      = "arn:aws:iam::XXXXXXXXXXXX:root"
  iam_role_name = "fuga"
  policy_arn    = "${var.policy_arn}"
}
# module/iam_role/main.tf
data "aws_iam_policy_document" "assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "AWS"
      identifiers = ["${var.role_arn}"]
    }
  }
}

resource "aws_iam_role" "role" {
  name               = "${var.iam_role_name}"
  assume_role_policy = "${data.aws_iam_policy_document.assume_role.json}"
}

resource "aws_iam_role_policy_attachment" "attach_policy" {
  role       = "${aws_iam_role.role.name}"
  policy_arn = "${var.policy_arn}"
}
# main.tf
module "admin" {
  source = "./module/group/admin"

  policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}

流れ的にはルートのmain.tf -> module/group/admin.fuga.tf -> module/iam_role/main.tf というようになります。

最初にやったimportは下記のようにやったと思います(自信ない)

$ terraform import module.admin.module.fuga.module.iam_role.aws_iam_role.role fuga

これで確かimport自体は成功しましたが、存在しないmoduleとしてimportされてしまったようでtfstateを手動で修正しないといけない状態になってしまいました。(twitterで教えていただきました!)

いろいろ試した結果、下記だと正常にimportができました。

$ terraform import module.admin.module.fuga.aws_iam_role.role fuga

まとめ

無駄にハマってしまったので冷静になろうと思いました。はまったと思ったら、一旦別作業やるのがいいのかもしれない…!

assumeRoleを利用するときにterraform backendがうまくできなかった話は解決したら別の機会に投下します。。。

参考