我想识别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)
注意我使用了terraform chomp()
方法来删除body附带的任何尾随空格或换行符。
您可以将ipv6与http://ipv6.icanhazip.com一起使用。请仅使用http://icanhazip.com小心,因为它可以检索ipv4或ipv6
小智 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
根据之前的答案,这是一个更短的方法:
data "http" "ip" {
url = "https://ifconfig.me/ip"
}
output "ip" {
value = data.http.ip.response_body
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3469 次 |
最近记录: |