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

Amazon web services 如何阻止Terraform删除导入的资源?,amazon-web-services,amazon-ec2,terraform,amazon-vpc,Amazon Web Services,Amazon Ec2,Terraform,Amazon Vpc,我对Terraform是全新的,所以我肯定我遗漏了一些东西,但我找到的答案似乎与我提出的问题不同 我有一个AWS专有网络/安全组,我们需要在该组下创建EC2实例,并且该专有网络/安全组已经创建。为了创建EC2实例,Terraform要求如果我没有默认的VPC,我必须导入自己的VPC。但一旦我导入并应用了我的计划,当我想要销毁它时,它也试图销毁我的专有网络。我如何封装我的资源,以便在运行“terraform apply”时,我可以使用导入的VPC创建EC2实例,但在运行“terraform des

我对Terraform是全新的,所以我肯定我遗漏了一些东西,但我找到的答案似乎与我提出的问题不同

我有一个AWS专有网络/安全组,我们需要在该组下创建EC2实例,并且该专有网络/安全组已经创建。为了创建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引用专有网络、子网和安全组,以便TF了解您现有的网络基础设施,就像您已经为SGs和子网所做的一样。部署EC2实例“aws_instance”所需的只是在现有VPC中为其提供一个现有子网id,就像您已经做的那样。为什么说Terraform需要部署或导入VPC?在没有VPC的情况下部署,而只使用现有的VPC,会出现什么错误或问题


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

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


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

要回答原始问题,您可以使用数据源,并通过id或标记名匹配您的专有网络:

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

然后用:
data.aws\u vpc.main


此外,如果您已经包含了专有网络,但不想在将其从您的状态中删除的同时将其销毁,则可以使用
地形状态
命令执行此操作:

要回答原始问题,您可以使用数据源并按id或标记名匹配您的专有网络:

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

然后用:
data.aws\u vpc.main


此外,如果您已经包括了VPC,但不想在将其从您的状态中删除时将其销毁,您可以使用
terraform state
命令执行此操作:

听起来您真正想要的是让您的terraform配置知道VPC,而不是主动管理它。对吗?否则,我假设您希望管理专有网络,但防止其被破坏。请更正您的第一个假设。我想把我的EC2实例放在我的非默认预制VPC中,但不想让Terraform管理这个VPC。听起来你真正想要的是Terraform配置知道VPC,但不想主动管理它。对吗?否则,我假设您希望管理专有网络,但防止其被破坏。请更正您的第一个假设。我想将我的EC2实例放入我的非默认预制VPC中,但不让Terraform管理这个VPC。我删除了导入的VPC,它仍然工作。看起来我收到的错误(错误400不存在默认VPC)是因为我没有包括VPC\u安全性\u组\u id和子网\u id。我只是在导入VPC时测试后才添加它们。我一直都有解决办法。非常感谢。我删除了进口的专有网络,它仍然有效。看起来我收到的错误(错误400不存在默认VPC)是因为我没有包括VPC\u安全性\u组\u id和子网\u id。我只是在导入VPC时测试后才添加它们。我一直都有解决办法。非常感谢。