AWS Terraform:通过匹配标签名称中的子字符串来过滤特定子网

Pat*_*ick 13 amazon-web-services terraform

我有 6 个子网,我想从中过滤 3 个子网匹配子字符串internal并在 rds 中使用。

标签名称有内部词,并希望以此为基础进行过滤。

有人可以帮我吗?

data "aws_vpc" "vpc_nonprod-sctransportationops-vpc" {
  tags {
    Name = "vpc_nonprod-sctransportationops-vpc"
  }
}
    
data "aws_subnet_ids" "all" {
  vpc_id = "${data.aws_vpc.vpc_nonprod-sctransportationops-vpc.id}"
}
    
output "aws_subnet_ids" {
  value = "${data.aws_subnet_ids.all.ids}"
}
# 6 subnets
# Now look up details for each subnet
     

data "aws_subnet" "filtered_subnets" {
  count = "${length(data.aws_subnet_ids.all.ids)}"
  id    = "${data.aws_subnet_ids.all.ids[count.index]}"

  filter {
    name   = "tag:Name"
    values = ["*internal*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

一些标签名称有internal子串

需要获取标签名称具有内部子字符串的所有子网ID

values = ["*"]6但是,返回IDvalues = ["any word not work"]values = ["*internal*"]不起作用。

以下是错误:

Error: Error refreshing state: 1 error(s) occurred:

* data.aws_subnet.publicb: 3 error(s) occurred:

* data.aws_subnet.publicb[1]: data.aws_subnet.publicb.1: no matching subnet found
* data.aws_subnet.publicb[4]: data.aws_subnet.publicb.4: no matching subnet found
* data.aws_subnet.publicb[0]: data.aws_subnet.publicb.0: no matching subnet found
Run Code Online (Sandbox Code Playgroud)

应该有 6 个,但我只得到 3 个,这意味着应该有部分好的东西和部分坏的东西。

这 3 个子网internal在标签名称中没有子字符串。

这意味着它正在解析。aws_subnet_ids没有过滤选项。

应该有。对于一场比赛,这很简单,但是,我需要多场比赛。

在我现在的猜测中,错误是因为循环运行了 6 次。

这是没有过滤器的相同输出:

data "aws_vpc" "vpc_nonprod-sctransportationops-vpc" {
  tags {
    Name = "vpc_nonprod-sctransportationops-vpc"
  }
}
    
data "aws_subnet_ids" "all" {
  vpc_id = "${data.aws_vpc.vpc_nonprod-sctransportationops-vpc.id}"
}
    
output "aws_subnet_ids" {
  value = "${data.aws_subnet_ids.all.ids}"
}
# 6 subnets
# Now look up details for each subnet
     

data "aws_subnet" "filtered_subnets" {
  count = "${length(data.aws_subnet_ids.all.ids)}"
  id    = "${data.aws_subnet_ids.all.ids[count.index]}"

  filter {
    name   = "tag:Name"
    values = ["*internal*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*ick 23

aws_subnet_ids有这个功能,但是方式不同。在这里它解决了我的问题:

data "aws_subnet_ids" "all" {
  vpc_id = "${data.aws_vpc.vpc_nonprod-sctransportationops-vpc.id}"

  tags = {
    Name = "*internal*"
  }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的审核 :D


小智 13

根据 Terraform 文档,aws_subnet_ids数据源已被弃用,并将在未来版本中删除(https://registry.terraform.io/providers/hashicorp/aws/4.67.0/docs/data-sources/subnet_ids)。

你可以用aws_subnets它代替。

例子:

    # Private Subnets (db_subnet) 
    data "aws_subnets" "private_db_subnet" {

      filter {
        name   = "vpc-id"
        values = [data.aws_vpc.main_vpc.id]
      }

      tags = {
        Name = "{YOUR_FILTER}"
      }
    }
Run Code Online (Sandbox Code Playgroud)

它的输出是子网列表:data.aws_subnets.private_db_subnet.ids

用例示例:

    resource "aws_lambda_function" "lambda_json_documentdb" {
        ...
        vpc_config {
            subnet_ids             = data.aws_subnets.private_db_subnet.ids
            security_group_ids     = [aws_security_group.lambda_sg.id]
        }
        ...
    }
Run Code Online (Sandbox Code Playgroud)