如何用Terraform在Lightsail中添加IP限制的防火墙规则?
解决方案
是的,可以通过Terraform实现这个需求,核心是利用aws_lightsail_instance_public_ports资源的port_info块中的cidrs参数指定允许访问的IP范围,同时结合Terraform的资源引用或数据源获取目标实例的公网IP。
具体实现方式
1. 同一配置内的实例引用
如果两个实例都在当前Terraform配置中创建,直接引用源实例的public_ip_address属性即可:
# 源实例(需要被允许访问的实例) resource "aws_lightsail_instance" "source" { name = "source-instance" availability_zone = "us-east-1a" blueprint_id = "amazon_linux_2" bundle_id = "nano_2_0" } # 目标实例(需要配置防火墙规则的实例) resource "aws_lightsail_instance" "target" { name = "target-instance" availability_zone = "us-east-1a" blueprint_id = "amazon_linux_2" bundle_id = "nano_2_0" } # 配置目标实例的端口规则,仅允许源实例IP访问 resource "aws_lightsail_instance_public_ports" "target_ports" { instance_name = aws_lightsail_instance.target.name port_info { from_port = 22 to_port = 22 protocol = "tcp" # 引用源实例公网IP,/32表示精确匹配单个IP cidrs = ["${aws_lightsail_instance.source.public_ip_address}/32"] cidrs_are_public = true } }
2. 引用外部已存在的实例
如果源实例是手动创建或在其他配置中部署的,使用data "aws_lightsail_instance"数据源获取其公网IP:
# 获取已存在的源实例信息 data "aws_lightsail_instance" "source" { name = "existing-source-instance" } # 目标实例(或已存在的目标实例) resource "aws_lightsail_instance" "target" { name = "target-instance" availability_zone = "us-east-1a" blueprint_id = "amazon_linux_2" bundle_id = "nano_2_0" } # 配置防火墙规则 resource "aws_lightsail_instance_public_ports" "target_ports" { instance_name = aws_lightsail_instance.target.name port_info { from_port = 80 to_port = 80 protocol = "tcp" cidrs = ["${data.aws_lightsail_instance.source.public_ip_address}/32"] cidrs_are_public = true } }
关键说明
cidrs参数支持单个或多个CIDR范围,使用/32可精确匹配单个公网IP,和Web UI中添加单个IP的效果完全一致。- 若需允许多个实例访问,只需在
cidrs列表中追加对应的IP/32条目即可。 - 执行
terraform apply后,目标实例的防火墙规则会自动更新为仅允许指定实例的IP访问对应端口。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

