首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有方法可以更改已创建资源的aws资源属性?

是否有方法可以更改已创建资源的aws资源属性?
EN

Stack Overflow用户
提问于 2021-03-04 22:11:50
回答 2查看 231关注 0票数 0

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

代码语言:javascript
复制
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}"
  }
}

有没有办法在私有网络创建后引用私有网络的子网并更改标签?如下所示:

代码语言:javascript
复制
for instance in module.vpc.outputs.private_subnets:
    instance.tags = { Name = "vpc-private-subnet-${self.availability_zone}"}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-05 00:48:49

我会这样做,如下所示。

我已经尝试在代码中添加注释,以提供所有步骤的解释:

代码语言:javascript
复制
## 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"
    
  }
}

第一次运行

代码语言:javascript
复制
terraform apply target=module.vpc

在那之后

代码语言:javascript
复制
terraform apply

这将根据需要标记子网

票数 0
EN

Stack Overflow用户

发布于 2021-08-27 22:00:47

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

我的方法不需要您先单独申请私有网络,因为空资源有一个depends_on块。

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

在variables.tf中:

代码语言:javascript
复制
public_subnets = {
  "Public 1" = "10.0.0.0/24",
  "Public 2" = "10.0.1.0/24",
  "Public 3" = "10.0.2.0/24"
}

在vpc模块中:

代码语言:javascript
复制
public_subnets        = values(var.public_subnets)

在data.tf中:

代码语言:javascript
复制
// 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中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
// 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
  ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66476756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档