我有以下内容,我想知道我做错了什么,因为我确信我不应该因为条件而加倍我的代码.
所以我想做:
variable "https" { value = true }
resource "aws_security_group" "http_instance_sg" {
count = "${var.https ? 0 : 1}"
......
}
resource "aws_security_group" "https_instance_sg" {
count = "${var.https ? 1 : 0}"
......
}
resource "aws_elb" "fe_elb" {
security_groups = ["${var.https ? aws_aws_security_group.https_instance_sg.id : aws_aws_security_group.http_instance_sg.id}"]
.....
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,terraform抱怨http_instance_sg无法找到,我得到它没有建立,但我当然不必加倍所有的代码,并有:
resource "aws_elb" "http_fe_elb" {
count = "${var.https ? 0 : 1}"
security_groups = ["${aws_aws_security_group.http_instance_sg.id}"]
.....
}
resource "aws_elb" "https_fe_elb" {
count = "${var.https ? 1 : 0}"
security_groups = ["${aws_aws_security_group.https_instance_sg.id}"]
.....
}
Run Code Online (Sandbox Code Playgroud)
当前使用count定义代码的方式意味着资源的响应是一个列表。这意味着您将需要以不同的方式访问值
resource "aws_elb" "fe_elb" {
security_groups = ["${var.https ? element(aws_security_group.https_instance_sg.*.id,0) : element(aws_security_group.http_instance_sg.*.id,0)}"]
.....
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,如果尝试使用此方法访问空列表,则会收到错误消息。
这意味着您将需要为每个连接一个空值,以确保元素的响应不会抛出。
使用concat的示例
"${var.https ? element(concat(aws_security_group.https_instance_sg.*.id, list("")), 0) : element(concat(aws_security_group.http_instance_sg.*.id, list("")), 0)
不同的方法
在没有看到代码的情况下,我可能会在这里问,是否有更简单的方法可以使用security_group_rule实现您要尝试的操作
variable "https" { value = true }
resource "aws_security_group" "instance_sg" {
# notice we no longer have a count here
}
resource "aws_elb" "fe_elb" {
security_groups = ["${aws_security_group.instance_sg.id}"]
.....
}
resource "aws_security_group_rule" "http" {
count = "${var.https ? 0 : 1}"
.... http definitions
security_group_id = "${aws_security_group.instance_sg.id}"
}
resource "aws_security_group_rule" "https" {
count = "${var.https ? 0 : 1}"
.... https definitions
security_group_id = "${aws_security_group.instance_sg.id}"
}
Run Code Online (Sandbox Code Playgroud)
你必须使用:
resource "aws_security_group" "http_instance_sg"
Run Code Online (Sandbox Code Playgroud)
代替:
resource "aws_aws_security_group" "http_instance_sg"
Run Code Online (Sandbox Code Playgroud)
Terraform 中没有名称为“aws_aws_security_group”的资源,该错误很可能是由于此资源名称拼写错误造成的。
希望它会有所帮助!
| 归档时间: |
|
| 查看次数: |
3535 次 |
| 最近记录: |