我想识别terraform执行环境的公共IP并将其添加到安全组

时间:2017-10-16 05:06:52

标签: terraform

我想识别terraform执行环境的公共IP 并将其添加到aws安全组入站以防止从其他环境访问。

目前,我手动编辑variables.tf文件中的值。

variables.tf

variable public_ip_address {
  default     = "xx"
}

我想执行" curl ifconfig.co"命令在本地主机上,并根据结果自动设置安全组

有没有办法做这些事情?

我可以通过将local-exec的结果放在某个变量中来实现 但我不知道该怎么做。

感谢您阅读我的问题。

3 个答案:

答案 0 :(得分:15)

没有任何脚本,这是一种更简单的方法。诀窍是拥有一个诸如icanhazip.com之类的网站来检索您的IP,因此请将其在terraform文件中设置为data

data "http" "myip" {
  url = "http://ipv4.icanhazip.com"
}

每当要放置IP时,只需使用data.http.myip.body,例如:

ingress {
  from_port = 5432
  to_port = 5432
  protocol = "tcp"
  cidr_blocks = ["${chomp(data.http.myip.body)}/32"]
}
  • 请注意,我使用terraform chomp()方法删除了body附带的任何尾随空格或换行。

  • 您可以将ipv6与http://ipv6.icanhazip.com一起使用。只需使用http://icanhazip.com即可,因为它可以检索ipv4或ipv6

答案 1 :(得分:1)

我能提出的最优雅的解决方案是使用"外部数据源"供应商。 https://www.terraform.io/docs/providers/external/data_source.html

这是为了这些目的编写的,人们将local-exec,null-resource和vars结合起来在本地注入一些东西。

无论如何,我确信你可以不用写一个小脚本就可以做到这一点。事情是"外部数据源"期望阅读JSON。所以在我的例子中,我只是在程序中构建了一个JSON字符串,然后调用该程序。我确定这可以使用echo或jq在一个班轮中完成......

这是我的main.tf文件:

data "external" "example" {
  program = ["sh", "test.sh" ]
}

output "commandout" {
  value = "${data.external.example.result}"
}

这是我的shell脚本(test.sh):

#!/bin/bash

echo {\"ip\":\""`hostname -I`"\"}

从技术上讲,一旦遇到这种情况,您可以使用:

${data.external.example.result}

作为你的var输入。

以下是我使用terraform输出的工作示例。

data.external.example: Refreshing state...

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

commandout = {
  ip = 10.0.2.15
}

请注意,hostname -I如果您只有一个网卡就可以了:)否则请使用替代命令或剪切输出以获得所需结果。

答案 2 :(得分:1)

在Terraform 0.12及更高版本中,您可以使用本机jsondecode和jsonencode以获得更好的可靠性和长期可重复性,而不必依赖于字符串操作。作为参考,此实现已在Terraform 0.12.16上进行了测试。

下面是使用最新的Terraform方法获取公共IP地址的示例实现。添加了输出块,以提供视觉验证其是否按预期工作。

git update-index --assume-unchanged [<file>...]

如果要在网络入口规则中使用此功能,可以执行以下操作(示例中用于测试性的icmp,无需在盲目复制和粘贴的情况下不必打开端口):

data "http" "my_public_ip" {
  url = "https://ifconfig.co/json"
  request_headers = {
    Accept = "application/json"
  }
}

locals {
  ifconfig_co_json = jsondecode(data.http.my_public_ip.body)
}

output "my_ip_addr" {
  value = local.ifconfig_co_json.ip
}

请注意,所引用的服务速率限制为每分钟〜1个请求,因此,如果您的需求超出此范围,您可能最终想自己托管该服务;或者如果您需要更多有保证的可用性。 echoip服务是容器化的,因此可以托管在几乎任何地方。

https://github.com/mpolden/echoip