Terraform:如何在 Azure RM 中实现应用程序安全组

问题描述

问题

我发现我可以integrate Application Security Groups (ASG) into a Network Interface when using the azurestack resource provider,但我cannot do so when using the azurerm resource provider

我的理解

我不明白为什么我不能。我其实不明白 Azure Stack 和 Azure RM 之间的区别。 This article 建议 Azure Stack 适用于混合部署,Azure RM(或 Azure Provider)适用于纯云部署。

我和其他同事之前所做的所有工作都是与 azurerm 一起完成的。如果可以,我宁愿坚持使用 azurerm。或者,如果可能的话,我想“混合和匹配”azurermazurestack,仅在必要时使用 azurestack,就像在这种情况下一样。但我真的很想知道为什么有些事情只能通过一个提供商实现,因为就纯 Azure 服务而言,它们都应该提供相同的产品。


有什么想法吗?

不过,最终,我只是想解决将网络接口附加到 VM 的问题,其中 NIC 已关联 ASG。如果可能的话,我想用 azurerm 来做这件事。我可以用 azurestack 做到这一点,只要 azurestack 与通过 azurerm 启动的其他服务兼容。

解决方法

无需使用 azurestack 将 NIC 与 ASG 关联

Terraform 提供程序 azurerm 具有名为 azurerm_network_interface_application_security_group_association

的资源

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/network_interface_application_security_group_association

您只需要创建 ASG 并将其与 NIC 关联即可。

示例:

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

resource "azurerm_virtual_network" "example" {
  name                = "example-network"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_subnet" "example" {
  name                 = "internal"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
}

resource "azurerm_application_security_group" "example" {
  name                = "example-asg"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
}

resource "azurerm_network_interface" "example" {
  name                = "example-nic"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = azurerm_subnet.example.id
    private_ip_address_allocation = "Dynamic"
  }
}

resource "azurerm_network_interface_application_security_group_association" "example" {
  network_interface_id          = azurerm_network_interface.example.id
  application_security_group_id = azurerm_application_security_group.example.id
}