Amazon web services 如何阻止Terraform删除导入的资源?
我对Terraform是全新的,所以我肯定我遗漏了一些东西,但我找到的答案似乎与我提出的问题不同 我有一个AWS专有网络/安全组,我们需要在该组下创建EC2实例,并且该专有网络/安全组已经创建。为了创建EC2实例,Terraform要求如果我没有默认的VPC,我必须导入自己的VPC。但一旦我导入并应用了我的计划,当我想要销毁它时,它也试图销毁我的专有网络。我如何封装我的资源,以便在运行“terraform apply”时,我可以使用导入的VPC创建EC2实例,但在运行“terraform destroy”时,我只销毁我的EC2实例 如果有人想提及,我理解: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
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时测试后才添加它们。我一直都有解决办法。非常感谢。