【问题标题】:How to assign an AWS Elastic IP to a newly created EC2 instance with Terraform without it getting reassigned when another instance is created?如何使用 Terraform 将 AWS Elastic IP 分配给新创建的 EC2 实例,而不会在创建另一个实例时重新分配?
【发布时间】: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


【解决方案1】:

也许是aws_eip_association,这里是sn-p:

resource "aws_eip_association" "eip_assoc" {
  instance_id   = aws_instance.ec2.id
  allocation_id = aws_eip.eip_manager.id
}

更多信息在这里:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/eip_association

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 2021-04-19
    • 2019-10-14
    • 1970-01-01
    • 2019-09-12
    • 2021-07-02
    • 2021-09-03
    • 2021-08-19
    相关资源
    最近更新 更多