はじめに
Terraformを勉強中にハマった箇所があり、調べても中々出てこなかったので共有します。
結論
変数を渡そうとしているModuleのディレクトリ(本記事ではbase
ディレクトリ)内に、variables.tf
を作成し、渡そうとしている変数を定義しましょう。
# base/variables.tf
variable "vpc_id" {}
variable "region" {}
状況
発生した状況は以下のような形です。
Moduleを使用しており、ルートモジュールから子モジュールへ変数を渡そうとしています。
# ディレクトリ構成
❯ tree .
.
├── base
│ └── vpc.tf
├── main.tf
└── variables.tf
# main.tf
variable "vpc_id" {}
variable "region" {}
provider "aws" {
profile = "default"
region = var.region
}
module "base" {
source = "./base"
vpc_id = var.vpc_id
region = var.region
}
# variables.tf
variable "vpc_id" { default = "xxxxxxxxxxxxxx" }
variable "region" { default = "ap-northeast-1" }
# base/vpc.tf
data "aws_vpc" "selected" {
id = "${var.vpc_id}"
}
resource "aws_subnet" "example" {
vpc_id = "${data.aws_vpc.selected.id}"
availability_zone = "${var.region}a"
cidr_block = "${cidrsubnet(data.aws_vpc.selected.cidr_block, 4, 1)}"
}
エラー内容
この状況でterraform apply
を実行するとエラーが発生します。
❯ terraform apply
Error: Unsupported argument
on main.tf line 12, in module "base":
12: vpc_id = var.vpc_id
An argument named "vpc_id" is not expected here.
Error: Unsupported argument
on main.tf line 13, in module "base":
13: region = var.region
An argument named "region" is not expected here.
原因
子モジュール内で変数を定義していないことが原因です。
TerraformのMuduleは、あるディレクトリ内の設定ファイル(.tf
ファイル)の集合体です。
モジュールで使用する変数は、モジュール毎に定義してあげる必要があります。
そのため、変数を渡そうとしているModuleのディレクトリ内で、変数を定義する必要があります。
個人的には、Moduleブロック内で変数を渡すだけで、子モジュールで使用可能になると勘違いしていました。
最後に
公式ドキュメントは一通り読んでいましたが、モジュール毎に変数の定義が必要とは書いていなかったような気が、、、。(見落としていたのかもしれません)
見落としていました!
@raki さんコメントで教えて頂きありがとうございます!
Terraform Creating Modules - 公式ドキュメント
最終的にはStackOverflowの回答からヒントを得て解決しました。
何方かの助けになれば幸いです。