我是Terraform的新手,所以我确定我缺少什么,但是我找到的答案似乎并没有问我同样的问题。
我有一个AWS VPC /安全组,我们需要在其下创建EC2实例,并且该VPC / SG已经创建。要创建EC2实例,Terraform要求如果我没有默认的VPC,则必须导入自己的VPC。但是,一旦导入并应用了计划,当我希望销毁它时,它也会尝试销毁我的VPC。如何封装我的资源,以便在运行“ terraform apply”时可以使用导入的VPC创建EC2实例,但是在运行“ terraform destroy”时只能销毁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"
}
}
答案 0 :(得分:0)
Terraform不应要求您部署或导入VPC才能将EC2实例部署到其中。您应该能够通过ID引用VPC,子网和安全组,以便TF知道您现有的网络基础结构,就像对SG和子网所做的一样。部署EC2实例“ aws_instance”所需要做的就是像在已有的VPC中一样为它提供一个现有子网ID。为什么您说Terraform需要部署或导入VPC?在没有VPC且仅使用现有的VPC的情况下,您会部署什么错误或问题?
如果确实愿意,您可以通过AWS保护VPC,但我不认为您真的希望将VPC导入Terraform状态并让Terraform在此处进行管理。听起来您想让VPC服务其他资源,也许是手动部署的应用程序或通过其他TF堆栈提供的服务,并且VPC能够独立于任何应用程序部署而生存。
答案 1 :(得分:0)
要回答原始问题,您可以使用数据源,并按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