Terraform-文字列変数を子モジュールに渡すことができません

Aug 21 2020

ネストされたモジュールがいくつかあるテラフォームのセットアップがあります。簡略化すると次のようになります

├── modules
│   ├── sec-groups
│   │   ├── main.tf
│   │   ├── outputs.tf
│   │   ├── variables.tf
│   │   └── versions.tf
├── dev
│   ├── env.dev.tfvars
│   ├── main.tf
│   ├── versions.tf
│   └── variables.tf
└── prod
    ├── env.prod.tfvars
    ├── main.tf
    ├── versions.tf
    └── variables.tf



開発の場所:

main.tf

module "aws_dev_sec-groups" {
  source = "../modules/sec-groups"

  vpc_name   = aws_vpc.dev_bp_vpc
  vpc_id     = aws_vpc.dev_bp_vpc.id

  localip  = var.localip
}

変数.tf

variable "localip" {
  type = string
}

env.dev.tfvars

localip = "1.1.1.1/32"



そして、sec-groupsモジュールでは:

main.tf

resource "aws_security_group" "servers_sg" {
  name = "servers_sg"
  description = "Traffic allowed to and from Servers"
  vpc_id = var.vpc_id
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = [var.localip]
  }
}

変数.tf

variable vpc_id {}
variable localip {
  type = string
}

-

'terraform init'は、期待される結果を生成します。ただし、「テラフォームプラン」では次のエラーが発生します。私にとって、これは空のlocalip変数を示唆しています。これは、変数を正しく宣言していないことを意味します。これは事実ですか?

Error: "" is not a valid CIDR block: invalid CIDR address:

  on ../modules/sec-groups/main.tf line 63, in resource "aws_security_group" "servers_sg":
  63: resource "aws_security_group" "servers_sg" {
  }

前もって感謝します

-

% terraform -v
    Terraform v0.13.0
    + provider registry.terraform.io/hashicorp/aws v3.2.0
    + provider registry.terraform.io/hashicorp/random v2.3.0

回答

Tiemen Aug 24 2020 at 22:06

.tfvarsファイルの変数はルートモジュールに割り当てられます。

投稿したコードが実際にルートレベルにある場合は、を指定すると機能します-var-file

実際にルートレベルにない場合は、localip変数を正しく渡していない可能性があります。表示されているという事実は、Error: "" is not a valid CIDR block: invalid CIDR address:どこかに空の文字列を渡していることを示しています。.tfvars正しくロードされず、上記のコードが実際にルートレベルにある場合、localip変数にデフォルトを指定しなかったため、別のエラー(変数がない)が発生します。

Adam Sep 28 2020 at 16:25

モジュールがどのように機能するかを完全に理解していないことがわかりました。サブモジュール内で複数のモジュールブロックを指定することにより、サブモジュールが親または他のサブモジュールからの変数を使用する必要があると想定しました。複数のサブモジュールからすべてのサブモジュールに変数を渡していたことがわかりました。これは後から考えると奇妙に思えますが、当時はそうではありませんでした。

これは、一部のサブモジュールがループ内で複数回再インスタンス化しようとしたため、エラーメッセージが表示されたことを意味します。獣のアプローチは、親モジュールがサブモジュールの出力値を呼び出して他のサブモジュールに渡すことであり、サブモジュールが親モジュールと同じ変数を使用して相互に参照するべきではないことを理解しました。

これに関するすべてのポインタに感謝します。赤ニシンがlocalip変数を参照していることをお詫びします。