如何在 Terraform 中自动配置 Azure 容器实例和 Azure MySql 之间的防火墙?

How to configure firewall between Azure Container Instance and Azure MySql automatically in Terraform?

我在 Azure 容器实例中有一个 terraformed Azure MySQL 实例和一个 WordPress docker 实例 运行。两者都很好,但我看不到 自动 允许从容器实例访问 MySQL 的方法,因为 1) 流量不是来自外部 IP 地址,以及 2) 我不知道实际 IP 地址是在哪里创建的,并且 3) 我看不到确定 IP 地址的方法。

resource "azurerm_container_group" "wp-container-group" {
   name                = var.container_group_name
   location            = azurerm_resource_group.wordpress-resource-group.location
   resource_group_name = azurerm_resource_group.wordpress-resource-group.name
   ip_address_type     = "public"
   dns_name_label      = var.dns_label
   os_type             = "Linux"

   container {
      name   = "wordpress"
      image  = "wordpress:latest"
      ...
   }
   ...
}


resource "azurerm_mysql_server" "wordpress_mysql" {
   name                = "foo-bar"
   location            = azurerm_resource_group.wordpress-resource-group.location
   resource_group_name = azurerm_resource_group.wordpress-resource-group.name

   ....
}


resource "azurerm_mysql_database" "wp-db" {
   name                = "wordpress"
   resource_group_name = azurerm_resource_group.wordpress-resource-group.name
   server_name         = azurerm_mysql_server.wordpress_mysql.name
   charset             = "utf8"
   collation           = "utf8_general_ci"
}

这设置为允许来自外部 IP 地址的流量:

resource "azurerm_mysql_firewall_rule" "allow_container" {
   name                = "allow_wordpress_container"
   resource_group_name = azurerm_resource_group.wordpress-resource-group.name
   server_name         = azurerm_mysql_server.wordpress_mysql.name
   start_ip_address    = azurerm_container_group.wp-container-group.ip_address
   end_ip_address      = azurerm_container_group.wp-container-group.ip_address
}

当我通过 SSH 进入容器实例并尝试通过命令行 mysql 连接时,它告诉我它使用的 IP 地址与外部地址不同——内部地址在 52.x.x.x范围。我可以手动将此 IP 地址添加为防火墙规则,但我想自动添加。

所以我的问题是:这个 52.x.x.x 地址在哪里分配,我如何在 Terraform 中访问它以便我可以自动配置容器实例和 mysql 之间的防火墙规则?

与容器实例关联的出站 IP 地址不可用作容器的 属性。 IP 地址也不能保证在容器重启后仍然存在,因此它不是防火墙规则的可靠标识符。

在这种情况下,最简单的解决方案是在数据库防火墙中“允许访问 Azure 服务”。这是通过创建一个 azurerm_sql_firewall_rule 并将 start_ip_addressend_ip_address 设置为“0.0.0.0”

来实现的

请注意,“允许访问 Azure 服务”意味着访问所有 Azure 服务,即使不是您的服务。 Azure 门户允许在配置 Azure 数据库的网络连接时选中“允许 public 从 Azure 中的 Azure 服务和资源访问此服务器组”,这看起来不错。但是相关的工具提示说“此选项将防火墙配置为允许来自分配给任何 Azure 服务或资产的 IP 地址的连接,包括来自其他客户订阅的连接。

并且还允许 IP 0.0.0.0 到 255.255.255.255 访问您的数据库打开通往整个世界的大门...