如何阻止大地删除导入的资源?



我是Terraform的新手,所以我确定我错过了一些东西,但我找到的答案似乎并没有问我同样的问题。

我有一个 AWS VPC/安全组,我们需要在其下创建 EC2 实例,并且此 VPC/SG 已创建。要创建 EC2 实例,Terraform 要求如果我没有默认 VPC,则必须导入自己的 VPC。但是一旦我导入并应用我的计划,当我想销毁它时,它也试图摧毁我的 VPC。如何封装我的资源,以便在运行"terraform apply"时,我可以使用导入的 VPC 创建 EC2 实例,但当我运行"terraform 销毁"时,我只销毁我的 EC2 实例?

如果有人想提及,我理解:

lifecycle = {
prevent_destroy = true
}

不是我要找的。

这是我目前的实践守则。

resource "aws_vpc" "my_vpc" {
cidr_block = "xx.xx.xx.xx/24"
}
provider "aws" {
region = "us-west-2"
}

data "aws_ami" "ubuntu" {
most_recent = true
filter {
name   = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-*"]
}
owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
ami           = "${data.aws_ami.ubuntu.id}"
instance_type = "t3.nano"
vpc_security_group_ids = ["sg-0e27d851dxxxxxxxxxx"]
subnet_id              = "subnet-0755c2exxxxxxxx"
tags = {
Name = "HelloWorld"
}
}

Terraform 不应要求您部署或导入 VPC 才能将 EC2 实例部署到其中。您应该能够按 id 引用 VPC、子网和安全组,以便 TF 了解您现有的网络基础设施,就像您已经对 SG 和子网所做的那样。 要"aws_instance"部署 EC2 实例,您只需像您已经所做的那样在现有 VPC 中为其提供现有子网 ID。 为什么说 Terraform 需要部署或导入 VPC?您在没有 VPC 且仅使用现有 VPC 的情况下进行部署时遇到什么错误或问题?

如果您真的愿意,您可以通过 AWS 保护 VPC,但我认为您并不真的想将 VPC 导入您的 Terraform 状态并让 Terraform 在此处管理它。听起来您希望 VPC 为其他资源提供服务,可能是手动部署或通过其他 TF 堆栈部署的应用程序,而 VPC 独立于任何应用程序部署

要回答原始问题,您可以使用数据源并通过 id 或标签名称匹配您的 VPC:

data "aws_vpc" "main" {
tags = {
Name = "main_vpc"
}
}

data "aws_vpc" "main" {
id = "vpc-nnnnnnnn"
}

然后用 :data.aws_vpc.main

此外,如果您已经包含 VPC,但不想在将其从状态中删除时将其销毁,则可以使用terraform state命令 : https://www.terraform.io/docs/commands/state/index.html

最新更新