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

suk*_*kho 11 terraform

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

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

变量

variable public_ip_address {
  default     = "xx"
}
Run Code Online (Sandbox Code Playgroud)

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

有办法做这种事情吗?

我可以通过将local-exec的结果放在某个变量中来做到这一点,但是我不知道该怎么做。

感谢您阅读我的问题。

Wag*_*rdi 30

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

data "http" "myip" {
  url = "http://ipv4.icanhazip.com"
}
Run Code Online (Sandbox Code Playgroud)

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

ingress {
  from_port = 5432
  to_port = 5432
  protocol = "tcp"
  cidr_blocks = ["${chomp(data.http.myip.body)}/32"]
}
Run Code Online (Sandbox Code Playgroud)

  • 我会添加一个安全警告。您不应该信任远程 IP 服务...您应该检查生成的 IP 是否属于授权的 IP 列表/范围。 (3认同)
  • @Fo。不幸的是,亚马逊返回“200 OK”,但没有返回“text/*”或“application/json”内容类型标头,这是 terraform 的 http 数据源所需的:https://www.terraform.io/docs/providers /http/data_source.html (2认同)
  • 请在 URL 中使用 HTTPS。通过 HTTP,攻击者可以修改 IP。 (2认同)

小智 11

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

如果您想在网络入口规则中使用它,您可以执行以下操作(在示例中用于可测试性的 icmp,无需打开端口,以防盲目复制和粘贴):

ingress {
  from_port = 0
  to_port = 0
  protocol = "-1"
  cidr_blocks = ["${local.ifconfig_co_json.ip}/32"]
}
Run Code Online (Sandbox Code Playgroud)

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

https://github.com/mpolden/echoip

  • 这将返回 ipv6 我如何传递 -4 标志来获取 v4? (2认同)

Neb*_*tic 9

根据之前的答案,这是一个更短的方法:

data "http" "ip" {
  url = "https://ifconfig.me/ip"
}

output "ip" {
  value = data.http.ip.response_body
}
Run Code Online (Sandbox Code Playgroud)

  • “.body”现已弃用,它应该是“.response_body” https://registry.terraform.io/providers/hashicorp/http/latest/docs/data-sources/http#response_body 我还建议保留“/ip”因为您不知道网站是否会改变用户代理检测的行为。至少使用“/ip”,您可以确定正文只是 ip (3认同)