首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以使用Terraform为堡垒分配特定的AWS弹性IP吗?

可以使用Terraform为堡垒分配特定的AWS弹性IP吗?
EN

Stack Overflow用户
提问于 2016-03-18 04:26:18
回答 5查看 2.8K关注 0票数 3

我们需要将企业防火墙中的一些弹性IP列入白名单,作为SSH允许的目的IP。有没有办法通过Terraform配置堡垒实例,并为其分配特定的弹性IP?同样,当堡垒被摧毁时,它会将该EIP返回到配置的池中吗?显然,我们不希望EIP从我们的AWS账户中被释放。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-21 00:40:14

目前,Terraform仅支持在EC2实例上附加弹性IP创建EIP当您可以选择将其附加到实例或弹性网络接口时。NAT网关目前允许您在创建NAT网关时关联弹性公网it,但这是一个稍微特殊的情况。

The 实例module它本身只允许对实例是否获得正常的公共IP地址进行布尔选择。有一个GitHub issue允许实例与预先存在的弹性公网it关联,但在编写时没有拉取请求来支持它。

如果这只是一个简单的案例,想要在公司防火墙上打开一个端口,而不必为了一个定期拆除的堡垒盒子而接触它,并且您愿意允许Terraform为您创建和管理EIP,那么您可以执行类似以下操作:

代码语言:javascript
复制
resource "aws_instance" "bastion" {
  ami           = "ami-abcdef12"
  instance_type = "t2.micro"
  tags {
    Name = "bastion"
  }
}

output "bastion_id" {
  value = "${aws_instance.bastion.id}"
}

在一个单独的文件夹中,您可以拥有自己的EIP定义,还可以从远程状态文件用于堡垒主机,并在应用弹性公网EIP时使用:

代码语言:javascript
复制
resource "terraform_remote_state" "remote_state" {
  backend = "s3"
  config {
    bucket = "mybucketname"
    key    = "name_of_key_file"
  }
}

resource "aws_eip" "bastion_eip" {
  vpc      = true
  instance = "${terraform_remote_state.remote_state.output.bastion_id}"
  lifecycle {
    prevent_destroy = true
  }
}

在上面的例子中,我使用了@BMW‘sapproach因此,在任何试图破坏弹性公网EIP的计划中都会出现错误,因为这是一种安全措施。

这至少应该允许您使用Terraform来构建和销毁生命周期较短的实例,但每次都对实例应用相同的EIP,这样您就不必在防火墙上进行任何更改。

仅使用Terraform的一种稍微简单的方法是将EIP定义放在相同的.tf文件/文件夹作为堡垒实例,但如果您将文件/文件夹作为堡垒实例,您将无法使用Terraform销毁该文件夹中的任何内容(包括堡垒实例本身)。lifecycle配置块,因为它只是在计划期间导致错误。每次销毁实例时,移除封堵只会让您重新销毁弹性公网EIP。

票数 4
EN

Stack Overflow用户

发布于 2017-09-16 02:42:13

现有答案已过时。现在可以关联现有的弹性IP,这要归功于此更改:https://github.com/hashicorp/terraform/pull/5236

文档:https://www.terraform.io/docs/providers/aws/r/eip\_association.html

摘录:

aws_弹性公网eip_协会

提供AWS EIP关联作为顶级资源,以将弹性IP与AWS实例和网络接口关联和取消关联。

注意: aws_弹性公网eip_当弹性公网in已经存在或分发给客户或用户,因此无法更改时,关联非常有用。

票数 5
EN

Stack Overflow用户

发布于 2018-10-16 13:14:54

我花了一些时间解决这个问题,发现其他答案很有帮助,但不完整。

对于那些尝试使用Terraform重新分配AWS弹性IP的用户,我们可以使用terraform_remote_stateaws_eip_association。让我解释一下。

我们应该使用两个独立的根模块,它们位于父文件夹中:

代码语言:javascript
复制
parent_folder
├--elasticip
|   └main.tf
└--server
    └main.tf

elasticip/main.tf您可以使用以下代码创建一个弹性IP,并将状态存储在本地后台,以便您可以从服务器模块访问其输出。输出变量名不能是' id ',因为这将与远程状态变量id冲突,它将无法工作。只需使用不同的名称,例如eip_id

代码语言:javascript
复制
terraform {                                                                                                             
  backend "local" {                                                                                                     
    path = "../terraform-eip.tfstate"                                                                                   
  }                                                                                                                     
}                                                                                                                       

resource "aws_eip" "main" {
  vpc = true
  lifecycle {
    prevent_destroy = true
  }
}

output "eip_id" {
  value = "${aws_eip.main.id}"
}

然后在server/main.tf以下代码将创建一台服务器,并将弹性IP与其关联。

代码语言:javascript
复制
data "terraform_remote_state" "eip" {
  backend = "local"

  config {
    path = "../terraform-eip.tfstate"
  }
}

resource "aws_eip_association" "eip_assoc" {
  instance_id   = "${aws_instance.web.id}"
  allocation_id = "${data.terraform_remote_state.eip.eip_id}"
}

resource "aws_instance" "web" {
  ami = "insert-your-AMI-ref"
}

所有这些都设置好后,您可以进入elasticip文件夹,运行terraform init,以及terraform apply获取您的弹性IP。然后进入server文件夹,然后运行相同的两个命令来获取您的服务器及其关联的弹性IP。在服务器文件夹中,您可以运行terraform destroyterraform apply新服务器将获得相同的弹性IP。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36071026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档