有没有办法更改已创建资源的 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
]
}
我正在使用 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
]
}