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