【问题标题】:Create subnets with tag Name that include the AZ of the subnet using Terraform使用 Terraform 创建带有标签名称的子网,其中包括子网的可用区
【发布时间】:2022-10-15 04:16:55
【问题描述】:

我正在使用 terraform VPC 模块创建一个 VPC, 并尝试给出有意义的子网名称,例如:data-vpc-private-subnet-a, “a”代表子网所在的可用区。

但我不知道该怎么做,这就是我目前所拥有的:

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"

  name = "${local.name}"
  cidr = "10.70.0.0/16"

  azs             = ["${local.region}a", "${local.region}b"]
  az              = ["a", "b"]

  private_subnets = ["10.70.1.0/24", "10.70.2.0/24"]
  public_subnets  = ["10.70.3.0/24", "10.70.4.0/24"]

  manage_default_network_acl = true
  default_network_acl_tags   = { Name = "${local.name}-default-nacl" }

  manage_default_route_table = true
  default_route_table_tags   = { Name = "${local.name}-default-route-table" }

  manage_default_security_group = true
  default_security_group_tags   = { Name = "${local.name}-default-sg" }

  enable_dns_hostnames = true
  enable_dns_support   = true

  map_public_ip_on_launch = false
  enable_nat_gateway      = true
  enable_vpn_gateway      = true
  single_nat_gateway      = false
  one_nat_gateway_per_az  = false
  reuse_nat_ips           = true                    # <= Skip creation of EIPs for the NAT Gateways
  external_nat_ip_ids     = "${aws_eip.nat.*.id}"   # <= IPs specified here as input to the module

  # VPC Flow Logs (Cloudwatch log group and IAM role will be created)
  enable_flow_log                      = true
  create_flow_log_cloudwatch_log_group = true
  create_flow_log_cloudwatch_iam_role  = true
  flow_log_max_aggregation_interval    = 60

  tags =     var.vpc_tags
  private_subnet_tags = { Name = "${local.name}-private-subnet-${az[count.index]}" }
  public_subnet_tags = { Name = "${local.name}-public-subnet-${az[count.index]}" }

}

任何帮助,将不胜感激。

【问题讨论】:

  • 您不能以这种方式引用为模块定义的变量。您可以做的是定义您的变量variable "az" {},然后尝试这种方式。 count.index 肯定不会工作,因为您没有为模块定义 count 元参数。

标签: amazon-web-services terraform


【解决方案1】:

在公共 vpc 模块中,子网标签在模块中定义如下(公共子网示例):

    "Name" = format(
        "${var.name}-${var.public_subnet_suffix}-%s",
        element(var.azs, count.index),
      )

所以在主模块中你必须设置:

data "aws_availability_zones" "zones" {}

locals
{
  [...]
  azs = data.aws_availability_zones.zones.names
}

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  [...]

  name = "my-project"
  azs = slice(local.azs, 0, 3)
  
}

然后子网的名称是例如my-project-private-eu-central-1a。

如果您打算摆脱该区域并只留下a,那么您必须下载该模块,修改定义标签的行(例如main.tf 用于专用网络的第394 行)并将此代码用作本地模块资源:

  tags = merge(
    {
      "Name" = format(
        "${var.name}-${var.private_subnet_suffix}-%s",
        replace(element(var.azs, count.index), var.region ,""),
      )
    }

上面的代码从子网的名称中删除了区域,当然前提是您还将region 变量推送到模块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 2021-06-10
    • 1970-01-01
    • 2020-12-09
    • 2018-03-22
    • 2021-01-07
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多