【发布时间】:2020-11-26 20:06:53
【问题描述】:
我目前有以下 Terraform 计划:
provider "aws" {
region = var.region
}
resource "aws_instance" "ec2" {
ami = var.ami
instance_type = var.instanceType
subnet_id = var.subnet
security_groups = var.securityGroups
timeouts {
create = "2h"
delete = "2h"
}
tags = {
Name = "${var.ec2ResourceName}"
CoreInfra = "false"
}
lifecycle {
prevent_destroy = true
}
key_name = "My_Key_Name"
connection {
type = "ssh"
user = "ec2-user"
password = ""
private_key = file(var.keyPath)
host = self.public_ip
}
provisioner "file" {
source = "/home/ec2-user/code/backend/ec2/setup_script.sh"
destination = "/tmp/setup_script.sh"
}
provisioner "remote-exec" {
inline = [
"chmod +x /tmp/setup_script.sh",
"bash /tmp/setup_script.sh ${var.ec2ResourceName}"
]
}
}
resource "aws_eip" "eip_manager" {
name = "eip-${var.ec2ResourceName}"
instance = aws_instance.ec2.id
vpc = true
tags = {
Name = "eip-${var.ec2ResourceName}"
}
lifecycle {
prevent_destroy = true
}
}
此计划可以运行多次,每次创建一个 EC2 实例而不删除前一个实例。但是,有一个弹性 IP 最终会重新分配给最近创建的 EC2 实例。如何为每个未重新分配的新实例添加弹性 IP?
【问题讨论】:
-
This plan can be run multiple times, creating a single EC2 instance each time without removing the previous one是什么意思?如果您使用相同的状态文件,那么如果没有任何更改,Terraform 将不会创建额外的资源。这也应该适用于您的弹性 IP 地址。如果您在每次运行时使用不同的状态文件,那么您最终应该得到一个新的 EC2 实例和一个新的 EIP。你能分享一个计划的输出,显示不同的事情正在发生吗? -
我正在使用以下 npm 脚本运行 Terraform 计划:
terraform apply -auto-approve -var=\"ec2ResourceName=$EC2_INSTANCE_NAME\"; terraform state rm 'aws_instance.ec2'。我不记得确切的细节了,因为已经有一段时间了,但我想我将 AWS 配置为不允许从 Terraform 中删除,所以 Terraform 认为资源已经消失了。这是一个很难解决的问题,但效果很好。实际上,在撰写此评论的过程中,我找到了解决方案,鉴于上述情况,这非常简单。如果你愿意,我会批准你的回答。 -
如果您不想保持状态以便 Terraform 可以管理它正在创建的资源的生命周期,那么使用 Terraform imo 可能不值得,而只需使用 AWS CLI 或其他东西。 Terraform 在管理复杂的、依赖资源的生命周期方面非常出色,因此每次仅自动从状态中删除部分资源就显得过于矫枉过正了。但是是的,这里明显的解决方法是在您从状态中删除实例时也从状态中删除 EIP。
-
@ydaetskcoR 如果您做出上述回答,我会接受。
标签: amazon-web-services amazon-ec2 terraform elastic-ip