【问题标题】:Can Terraform add individual Digital Ocean firewall rules?Terraform 可以添加单独的 Digital Ocean 防火墙规则吗?
【发布时间】:2022-02-10 20:52:23
【问题描述】:

我正在构建 EC2 实例和 DO Droplet 的混合体,它们必须能够以完全网状的方式进行通信,这需要 AWS 和 DO 的防火墙配置来了解所有创建的资源的 WAN 和 LAN 地址。每个平台的资源数量是可变的。

将 Terraform 与 A​​WS 提供商一起使用时,我可以创建一个安全组,然后向其中添加单独的规则:

resource "aws_security_group" "sg-1" {
 
  ingress {
     ...
  }
  egress {
    ...
  }
}

resource "aws_security_group_rule" "sg1-rule-1" {
  security_group_id = aws_security_group.sg-1.id
  ...
}

DigitalOcean 提供程序提供digitalocean_firewall 资源,但与aws_security_group_rule 资源没有任何相似之处,这意味着必须提前知道整个防火墙规则集并在digitalocean_firewall 资源块中应用。

到目前为止,我唯一的解决方案是在创建资源后从模板动态创建 digitalocean_firewall.tf 文件,但这需要 terraform apply 来应用动态规则。

在没有digitalocean_firewall_rule资源的情况下,有没有更好的办法?

【问题讨论】:

  • 如果 Droplet 由 Terraform 管理,无论您是在防火墙资源的某个部分中定义规则还是在单独的防火墙规则资源中定义规则,都可以引用它们。或者我不明白你的设置。也许您可以包含特定于 DO 的代码。

标签: terraform digital-ocean


【解决方案1】:

回答我自己的问题!

解决方法是使用 Terraform 的 dynamic 块资源:

resource "digitalocean_firewall" "firewall" {
  name = "${var.project_name}-${var.environment}-firewall"

  inbound_rule {
    protocol         = "tcp"
    port_range       = "22"
    source_addresses = ["x.x.x.x/32"]
  }

  dynamic "inbound_rule" {
    for_each = module.ec2_node
    content {
      protocol         = "tcp"
      port_range       = "1-65535"
      source_addresses = [inbound_rule.value.public_ip]
    }
  }

  dynamic "inbound_rule" {
    for_each = module.ec2_node
    content {
      protocol         = "udp"
      port_range       = "1-65535"
      source_addresses = [inbound_rule.value.public_ip]
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2021-04-26
    • 1970-01-01
    • 2014-01-14
    • 2016-07-30
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多