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

时间:2019-10-04 16:43:42

标签: amazon-web-services amazon-ec2 terraform amazon-vpc

我是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"
  }
}

2 个答案:

答案 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