繁体   English   中英

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

[英]How to block Terraform from deleting an imported resource?

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

我有一个 AWS VPC/安全组,我们需要在其下创建我们的 EC2 实例,并且该 VPC/SG 已经创建。 要创建 EC2 实例,Terraform 要求如果我没有默认 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"
  }
}

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

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

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

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

或者

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

然后参考它: data.aws_vpc.main

Also, if you already included your VPC but would like not to destroy it while remove it from your state, you can manage to do it with the terraform state command: https://www.terraform.io/docs/commands/state/索引.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM