首页 > 解决方案 > 在 terraform 中映射所有现有的 aws 安全组

问题描述

我想获取现有的 aws 安全组信息,以便通过名称而不是 id 来引用它们。

我可以使用以下方法引用单个现有实例:

data "aws_security_groups" "single" {
  filter {
    name   = "group-name"
    values = ["Foo-all"]
  }
}

output "singlename" {
  value = "${data.aws_security_groups.single.ids[0]}"
}

这并不理想,因为我需要输入所有安全组 ID 作为自己的块。

我可以使用以下命令打印所有安全组的所有属性:

data "aws_security_groups" "sgroups" {
  filter {
    name   = "vpc-id"
    values = ["${data.aws_vpc.vpc.id}"]
  }
}

data "aws_security_group" "instances" {
  count = length(data.aws_security_groups.sgroups.ids)
  id = data.aws_security_groups.test.ids[count.index]
}

output "groupinfo" {
  value = "${data.aws_security_group.instances}"
}

这对我来说没用,因为我想要一个 Name = id 映射。

我希望做的是将所有现有的安全组定义为一个映射,这样我就可以执行以下操作:

resource "aws_instance" "fooTest" {
  ami           = "${var.ami}"
  instance_type = "t2.nano"
  subnet_id = "${var.subnets["Foo-net"]}"
  key_name = "Fookey"
  vpc_security_group_ids = [ 
    "${var.existingsgs["Foo-all"]}",
  ]
}

这可以做到吗?还是有更好的方法来实现基于名称的安全组引用?

标签: loopsterraform

解决方案


我不认为您可以输出地图,您应该能够使用数据源输出 sec 组 id 的列表,就像您对示例代码所做的那样。通过过滤数据源以获取带有特定标签的资源,更进一步。然后只需引用您的 aws_instance 资源块中的数据资源。

请求示例:

要读取现有的 vpc 和安全组,请使用数据源。通过过滤应用于 vpc 和安全组的特定标签来选择所需的目标。

data "aws_vpc" "my_vpc" {
  tags = {
    Project     = "my_vpc"
    Environment = "qa"
  }
}

data "aws_security_group" "my_sg" {
  vpc_id = "${data.aws_vpc.my_vpc.id}"

  tags = {
    Name        = "my_sg"
    Environment = "qa"
  }
}

创建资源时,您可以引用已获取的数据源。请记住,首先读取数据源以使它们在创建其他资源时可用。

resource "aws_instance" "fooTest" {
  ami           = "${var.ami}"
  instance_type = "t2.nano"
  subnet_id = "${var.subnets["Foo-net"]}"
  key_name = "Fookey"
  vpc_security_group_ids = ["${data.aws_security_group.my_sg.ids}"]
}

您也可以对子网执行相同的操作,AWS 中存在的几乎所有内容都可以读取到数据源块中,以便在创建其他资源时进行引用。

https://www.terraform.io/docs/configuration/data-sources.html


推荐阅读