将预先存在的静态(弹性)IP 分配给 EC2 实例

问题描述 投票:0回答:2

假设我的 AWS 账户上已有弹性 IP。

由于超出此问题范围的原因,此 EIP 不是(也不能)通过 Terraform 进行管理。

我知道想要将此 EIP(比如

11.22.33.44
)分配给我通过 TF 创建的 EC2 实例

传统方法当然是通过 TF 创建 EIP 和 EC2 实例

resource "aws_eip" "my_instance_eip" {
  instance = "my_instance.id"
  vpc      = true
}

resource "aws_eip_association" "my_eip_association" {
  instance_id   = "my_instance.id"
  allocation_id = "aws_eip.my_instance_eip.id"
}

有没有办法让 EC2 通过 TF 知道它应该被分配为 EIP,

11.22.33.44
超出了 TF 生命周期?

amazon-web-services terraform terraform-provider-aws
2个回答
6
投票

您可以使用 aws_eip 数据源获取现有 EIP 的信息,然后在您的

aws_eip_association
中使用该信息:

data "aws_eip" "my_instance_eip" {
  public_ip = "11.22.33.44"
}

resource "aws_eip_association" "my_eip_association" {
  instance_id   = aws_instance.my_instance.id
  allocation_id = data.aws_eip.my_instance_eip.id
}


0
投票

根据之前的答案,Terraform 在 aws_eip 中不再具有“public_ip”属性。

因此,我提出了一个适用于 Terraform v1.7.4 和 hashicorp/aws v5.39.0(2024 年 3 月)的解决方案

问题描述

在 Terraform 中创建 AWS EC2 服务器时,您希望能够销毁并应用(重新创建)该服务器。

但是您的 DNS 中可能有一些域名指向该 EC2 服务器。因此,您希望坚持使用相同的 IP 地址。

您使用AWS-Elastic-IP来获取固定IP地址。但由于您希望能够 Terraform 销毁您的基础设施,因此弹性 IP 是在 Terraform 外部创建的。

该 IP 地址(具有 AWS 标签“Name”=“MY_IP”)应与您使用 Terraform 创建的 EC2 服务器关联。

(我写下来是因为这个业务案例对我来说似乎完全符合逻辑,但我在示例或教程中没有找到它)

在AWS中手动创建EIP

为其命名(Tagname =“Name”)“MY_IP”

在 Terraform 脚本中拾取它

在您的 Terraform 脚本中,您可以使用“data.aws_eip”数据资源来获取它

data "aws_eip" "my_ip" {
  filter {
    name   = "tag:Name"
    values = ["MY_IP"]
  }
}

与之前的答案相比,上述代码是更新的代码,并且适用于上述版本。

aws_eip_协会

使用 aws_eip_association 资源中获取的 IP

resource "aws_eip_association" "eip_assoc" {
  instance_id   = aws_instance.this.id
  allocation_id = data.aws_eip.my_ip.id
}

Terraform 输出中的奇怪行为

创建实例后,您可能想要输出公共IP。

output "Instance_public_ip" {
  value = aws_instance.this.public_ip
}

您会期望它与您的 EIP 相同,但事实并非如此

从 aws_instance 获取公共 IP 将返回在 aws_eip_association 之前给出的初始 IP。

从 aws_eip_association 获取正确的公共 IP 以获取您的弹性 IP

output "Instance_public_ip" {
  value = aws_eip_association.eip_assoc.public_ip
}
© www.soinside.com 2019 - 2024. All rights reserved.