有没有办法更改已创建资源的 aws 资源属性?

Is there a way to change aws resource properties of a resource that is already created?

我正在使用 terraform-aws-modules/vpc/aws 创建一个 vpc,我想单独标记 vpc 的每个子网,并在末尾连接 availability_zone。我尝试在 subnet_tag 属性 中使用自我引用,但出现错误:“自我”引用无效,因为我正在使用模块。

module "vpc" {
  source          = "terraform-aws-modules/vpc/aws"
  name            = "${var.app_name}-vpc"
  cidr            = var.vpc_cird
  azs             = var.vpc_azc
  private_subnets = var.vpc_private_subnets
  public_subnets  = var.vpc_public_subnets
  create_vpc      = local.create_vpc 
  enable_ipv6     = true
  enable_dns_hostnames = true
  tags = merge(
    {
      Name = "${var.app_name}-${terraform.workspace}"
    },
    local.default_tags,
    var.vpc_tags,
  )
  private_subnet_tags = {
    Name = "vpc-private-subnet-${self.availability_zone}"
  }
  public_subnet_tags = {
    Name = "vpc-public-subnet-${self.availability_zone}"
  }
}

有没有办法在创建后引用 vpc 的子网并更改它的标签?像这样:

for instance in module.vpc.outputs.private_subnets:
    instance.tags = { Name = "vpc-private-subnet-${self.availability_zone}"}

我的做法如下。

我尝试在代码中添加注释以解释所有步骤:


## Create the VPC and the subnets
module "vpc" {
  source          = "terraform-aws-modules/vpc/aws"
  name            = "my-vpc"
  cidr            = "10.0.0.0/16"
  azs             = ["eu-west-1a", "eu-west-1b", "euw1-az3"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
  enable_ipv6     = true
  enable_dns_hostnames = true
  
}

## Extract the subnets using the vpc id from the module
data "aws_subnet_ids" "my_vpc" {
  vpc_id = module.vpc.vpc_id
}

## Extract the subnets (to get the az values)
data "aws_subnet" "subnets" {
  for_each = data.aws_subnet_ids.my_vpc.ids
  id       = each.value
}

## Then tag your subnets automatically with the local-exec and the aws-cli (modify the region if required)
resource "null_resource" "tagging_subnets" {
  for_each = data.aws_subnet.subnets

  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${each.value.id} --tags Key=az,Value=${each.value.availability_zone} --region=eu-west-1"
    
  }
}

第一个运行

terraform apply target=module.vpc

之后

terraform apply

这将根据需要标记子网

我做了一些与 Jaime S 提供的答案类似的事情。希望它能帮助人们对如何做大致相同的事情有不同的想法。

我的方法不需要您先单独应用 VPC,因为空资源有一个 depends_on 块。

它使用数据、本地和空资源:

在variables.tf中:

public_subnets = {
  "Public 1" = "10.0.0.0/24",
  "Public 2" = "10.0.1.0/24",
  "Public 3" = "10.0.2.0/24"
}

在 vpc 模块中:

public_subnets        = values(var.public_subnets)

在data.tf中:

// Get IDs for Public Subnets
data "aws_subnet_ids" "public_subnet_0" {
  vpc_id = module.vpc.vpc_id
  filter {
    name = "cidr-block"
    values = [
      values(var.public_subnets)[0]
    ]
  }
}

data "aws_subnet_ids" "public_subnet_1" {
  vpc_id = module.vpc.vpc_id
  filter {
    name = "cidr-block"
    values = [
      values(var.public_subnets)[1]
    ]
  }
}

data "aws_subnet_ids" "public_subnet_2" {
  vpc_id = module.vpc.vpc_id
  filter {
    name = "cidr-block"
    values = [
      values(var.public_subnets)[2]
    ]
  }
}

在main.tf中:

locals {
  // Public Subnet IDs
  // Used for subnet Name tags  
  public_subnet_0_id = tolist(data.aws_subnet_ids.public_subnet_0.ids)[0]
  public_subnet_1_id = tolist(data.aws_subnet_ids.public_subnet_1.ids)[0]
  public_subnet_2_id = tolist(data.aws_subnet_ids.public_subnet_2.ids)[0]
}

在tagging.tf中:

// Public Subnets
// Assigns Name tags to subnets
resource "null_resource" "public_subnet_0" {
  // Re-apply tags every time because VPC module replaces the subnet Name tags
  triggers = {
    timestamp = timestamp()
  }
  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${local.public_subnet_0_id} --tags Key=Name,Value='Public Subnet 1'"
  }
  depends_on = [
    module.vpc
  ]
}

resource "null_resource" "public_subnet_1" {
  // Re-apply tags every time because VPC module replaces the subnet Name tags
  triggers = {
    timestamp = timestamp()
  }
  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${local.public_subnet_1_id} --tags Key=Name,Value='Public Subnet 2'"
  }
  depends_on = [
    module.vpc
  ]
}

resource "null_resource" "public_subnet_2" {
  // Re-apply tags every time because VPC module replaces the subnet Name tags
  triggers = {
    timestamp = timestamp()
  }
  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${local.public_subnet_2_id} --tags Key=Name,Value='Public Subnet 3'"
  }
  depends_on = [
    module.vpc
  ]
}