ネストした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がうまくできなかった話は解決したら別の機会に投下します。。。