我有一个在Azure容器实例中运行的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 服务"。这是通过创建一个start_ip_address
和end_ip_address
设置为"0.0.0.0"的azurerm_sql_firewall_rule
来实现的
请注意,"允许访问 Azure 服务"意味着访问所有 Azure 服务,即使不是你的服务。Azure 门户允许在配置 Azure 数据库的网络连接时选中"允许从 Azure 中的 Azure 服务和资源对此服务器组进行公共访问",这看起来不错。但关联的工具提示显示"此选项将防火墙配置为允许来自分配给任何 Azure 服务或资产的 IP 地址的连接,包括来自其他客户订阅的连接。">
并且允许 IP 0.0.0.0 到 255.255.255.255 访问您的数据库,为全世界打开了大门......