Terraform-문자열 변수를 자식 모듈에 전달할 수 없습니다.
여러 중첩 모듈이있는 테라 폼 설정이 있습니다. 다음과 같이 단순화
├── 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
}
variables.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]
}
}
variables.tf
variable vpc_id {}
variable localip {
type = string
}
-
'terraform init'는 예상 된 결과를 생성합니다. 그러나 'terraform plan'에서는 다음과 같은 오류가 발생합니다. 나에게 이것은 빈 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
답변
.tfvars
파일의 변수 는 루트 모듈에 할당됩니다.
게시 한 코드가 실제로 루트 수준에있는 경우 -var-file
.
실제로 루트 수준이 아닌 경우 localip
var를 올바르게 전달하지 않을 가능성이 큽니다 . 보이는 사실은 Error: "" is not a valid CIDR block: invalid CIDR address:
어딘가에 빈 문자열을 전달하고 있음을 나타냅니다. .tfvars
올바르게 로드하지 않고 위의 코드가 실제로 루트 수준에있는 경우 localip
변수에 기본값을 제공하지 않았기 때문에 다른 오류 (변수 누락)가 발생 합니다.
모듈 작동 방식을 완전히 이해하지 못한 것으로 나타났습니다. 하위 모듈 내에서 여러 모듈 블록을 지정하여 하위 모듈이 상위 또는 다른 하위 모듈의 변수를 사용해야한다고 가정했습니다. 여러 하위 모듈에서 모든 하위 모듈로 변수를 전달하고 있다는 것을 알았습니다. 돌이켜 보면 이상해 보이지만 당시에는 그렇지 않았습니다.
이것은 일부 서브 모듈이 루프에서 여러 번 다시 인스턴스화하려고 시도했기 때문에 오류 메시지가 발생했음을 의미합니다. 이제 야수 접근 방식은 상위 모듈이 하위 모듈의 출력 값을 호출하여 다른 하위 모듈로 전달하는 것이며 하위 모듈이 상위 모듈과 동일한 변수를 사용하여 서로를 참조해서는 안된다는 것을 알고 있습니다.
이것에 대한 모든 포인터에 감사드립니다. red-herring에 대한 사과는 localip 변수를 참조합니다.