假设我的 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 生命周期?
您可以使用 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
}
根据之前的答案,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 服务器关联。
(我写下来是因为这个业务案例对我来说似乎完全符合逻辑,但我在示例或教程中没有找到它)
为其命名(Tagname =“Name”)“MY_IP”
在您的 Terraform 脚本中,您可以使用“data.aws_eip”数据资源来获取它
data "aws_eip" "my_ip" {
filter {
name = "tag:Name"
values = ["MY_IP"]
}
}
与之前的答案相比,上述代码是更新的代码,并且适用于上述版本。
使用 aws_eip_association 资源中获取的 IP
resource "aws_eip_association" "eip_assoc" {
instance_id = aws_instance.this.id
allocation_id = data.aws_eip.my_ip.id
}
创建实例后,您可能想要输出公共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
}