我使用該vpc模塊通過以下代碼創建我的 VPC:
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "${var.namespace}-vpc"
cidr = "10.0.0.0/16"
azs = data.aws_availability_zones.available.names
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
#assign_generated_ipv6_cidr_block = true
create_database_subnet_group = true
enable_nat_gateway = true
single_nat_gateway = true
enable_dns_hostnames = true
enable_dns_support = true
}
此模塊自動創建兩個公有子網,其中包含指向 Internet 網關的路由表。但是,我想修改兩個公共子網之一,使其具有指向我創建的防火墻的不同路由表。
我所做的是創建一個新的路由表pub_to_firewall,然后創建一個新aws_route_table_association的以將公共子網與新的路由表相關聯。
resource "aws_route_table_association" "sn_to_fw_rt_association" {
subnet_id = module.vpc.public_subnets[0]
route_table_id = aws_route_table.pub_to_firewall.id
depends_on = [
aws_route_table.pub_to_firewall,
]
}
我已經能夠按照說明將原始關聯匯入到這個新關聯,并terraform apply讓公共子網擁有這個包含防火墻參考的新路由表。
但是,當我terraform apply再次運行時,terraform 現在想要回到“默認”關聯:
Objects have changed outside of Terraform
Terraform detected the following changes made outside of Terraform since the last "terraform apply":
# module.networking.module.vpc.aws_route_table_association.public[0] has been deleted
- resource "aws_route_table_association" "public" {
- id = "rtbassoc-[ ]" -> null
- route_table_id = "rtb-0cabc2388adXXXXX" -> null
- subnet_id = "subnet-0a2b011cd7aXXXXX" -> null
}
Unless you have made equivalent changes to your configuration, or ignored the relevant attributes using ignore_changes, the following plan may include actions to undo or respond to these
changes.
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
create
~ update in-place
Terraform will perform the following actions:
# module.networking.module.vpc.aws_route_table_association.public[0] will be created
resource "aws_route_table_association" "public" {
id = (known after apply)
route_table_id = "rtb-0cabc2388adXXXXX"
subnet_id = "subnet-0a2b011cd73XXXXX"
}
我不希望重新創建此資源,因為它│ Error: error creating Route Table (rtb-0cabc2388adXXXXX) Association: Resource.AlreadyAssociated: the specified association for route table rtb-0cabc2388adXXXXX conflicts with an existing association顯然會引發錯誤,因為我已經將它與新路由表相關聯。
我怎么能:
- 強制 terraform“忽略”路由表設定的默認子網
- 或者更新
vpc創建的 aws_route_table_association 資源module.networking.module.vpc.aws_route_table_association.public[0]以參考新的路由表?
uj5u.com熱心網友回復:
您無法更改它,因為這就是 aws vpc 模塊的作業方式。您需要為此定制設計的 VPC。因此,您必須分叉整個模塊并進行所需的更改,或者根據您的需求從頭開始創建新的 VPC 模塊。
uj5u.com熱心網友回復:
感謝馬爾辛的回答!我做了更多的研究并詢問了一些人,看起來使用“vpc”模塊來設定初始基礎設施的最初決定是在無法修改單個資源的情況下做出的權衡。
我在下面采取的步驟是保留我需要的現有子網等而不破壞它們。更改子網將意味著我們不想要的相關 EC2 實體等的破壞。
因此,我不得不執行按資源重新創建基礎設施資源的繁瑣步驟。以下是我為對未來感興趣的人提供的步驟:
運行
terraform state list以查看與模塊關聯的所有資源vpc,您可以過濾以查看 module.networking.module.vpc.aws_eip.nat[0]、module.networking.module.vpc.aws_internet_gateway.this[0] 等對于
module.networking.module.vpc串列下的每個資源,再次單獨創建資源。例如,如果您需要一個私有子網,則創建一個新aws_subnet資源。這會很痛苦,但是您需要將其他資源中指向 Terraform 代碼中舊資源的所有鏈接更改為指向這些新資源。創建每個單獨的資源后,告訴 Terraform 將現有資源指向您要創建的新資源(請記住
terraform init首先讓 Terraform 知道新資源),例如terraform state mv module.networking.module.vpc.aws_subnet.private[0] module.vpc.aws_subnet.private_subnet_1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/419436.html
標籤:
上一篇:如何跨區域維護AWS中的應用程式
