如何使用 Terraform 为 AWS Lightsail 实例设置防火墙规则?

How to set up a firewall rule using Terraform for an AWS Lightsail instance?

我已经创建 a simple Terraform recipe to set up an AWS Lightsail instance,以便在其中安装 Open Distro for Elasticsearch。

有几天一切运行很顺利,5601端口可以访问玩Kibana实例,但是过了几天就不能访问了,我发现我需要设置允许流量访问端口 5601 的防火墙规则。

我想在 Terraform 配方中设置它,就像我为 GCP 所做的那样:

resource "google_compute_firewall" "kibana" {
  name    = "kibana-${random_id.instance_id.hex}"
  network = "default"

  allow {
    protocol = "tcp"
    ports    = ["5601"]
  }

  source_ranges = ["0.0.0.0/0"]

}

但我还没有找到明确的方法。 aws_security_group 是我需要的还是无法从 Terraform 进行设置?

谢谢!

哎呀。不要通过 Lightsail 向全世界公开 5601。我至少会设置一个反向代理来使用 SSL,但你最好为 Kibana 配置 Xpack

目前最新的 terraform-provider-aws 2.50.0 不支持我们为 lightsail 实例创建防火墙规则。

但是我们可以通过使用 local-exec 和内置的 aws cli put-instance-public-ports 来欺骗它。在提供实例后,它将是 运行,在 运行 terraform:

的机器中
resource "aws_lightsail_instance" "worker" {
  ...
  name              = "worker-${count.index+1}"
  availability_zone = "ap-southeast-1a"
  blueprint_id      = "ubuntu_18_04"
  bundle_id         = "nano_2_0"
  ...
  provisioner "local-exec" {
    command = "aws lightsail put-instance-public-ports --instance-name=worker-${count.index+1} --port-infos fromPort=22,toPort=22,protocol=tcp fromPort=5601,toPort=5601,protocol=tcp"
  }
}
resource "aws_lightsail_instance_public_ports" "test" {
  instance_name = aws_lightsail_instance.test.name

  port_info {
    protocol  = "tcp"
    from_port = 80
    to_port   = 80
  }
}

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lightsail_instance_public_ports

已添加到 AWS 提供商 3.34.0(2021 年 3 月 26 日)https://github.com/hashicorp/terraform-provider-aws/blob/v3.34.0/CHANGELOG.md