Azure 当NSG必须与子网关联时,如何使应用程序服务虚拟网络快速连接

Azure 当NSG必须与子网关联时,如何使应用程序服务虚拟网络快速连接,azure,azure-web-app-service,terraform,terraform-provider-azure,infrastructure-as-code,Azure,Azure Web App Service,Terraform,Terraform Provider Azure,Infrastructure As Code,处理自定义策略强制子网和nsg关联的项目。如果子网没有与其关联的NSG,则无法设置 使用terraform部署资源-资源组、VNET、NSG,在创建子网之前,我创建了与子网关联的NSG,作为VNET部署的一部分,部署了应用服务计划、web应用,然后尝试进行应用服务虚拟网络swify连接,但由于缺少服务委派而失败 地形文字 我唯一搞不懂的是如何应用服务委派。如果在创建子网之前强制NSG的自定义策略不存在的话,我可以很容易地做到这一点 地形文字 如果需要,我可以使用下面的tf配置来设置NSG关联 r

处理自定义策略强制子网和nsg关联的项目。如果子网没有与其关联的NSG,则无法设置

使用terraform部署资源-资源组、VNET、NSG,在创建子网之前,我创建了与子网关联的NSG,作为VNET部署的一部分,部署了应用服务计划、web应用,然后尝试进行应用服务虚拟网络swify连接,但由于缺少服务委派而失败

地形文字

我唯一搞不懂的是如何应用服务委派。如果在创建子网之前强制NSG的自定义策略不存在的话,我可以很容易地做到这一点

地形文字

如果需要,我可以使用下面的tf配置来设置NSG关联

resource "azurerm_subnet_network_security_group_association" "example" {
  subnet_id                 = azurerm_subnet.example.id
  network_security_group_id = azurerm_network_security_group.example.id
}
但这种方法的问题是,关联将在子网部署后发生,但由于自定义策略已就位,tf apply将失败并出现策略冲突错误


有什么方法可以在创建子网之前关联NSG并应用服务委派吗?

因为您的自定义策略要求NSG需要与子网创建时间或子网创建之前关联。必须使用block创建子网和安全组

在本例中,您可以使用在创建资源后调用本地可执行文件

示例

resource "azurerm_virtual_network" "test" {
  name                = "acctestvnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

 subnet {
   name = var.subnet
   address_prefix = "10.0.1.0/24"
   security_group = azurerm_network_security_group.main.id
 }

}

resource "azurerm_app_service" "test" {
  name                = "acctestas"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.test.id

provisioner "local-exec" {
  command = "az webapp vnet-integration add --name ${azurerm_app_service.test.name} --resource-group ${azurerm_resource_group.main.name}  --vnet ${azurerm_virtual_network.test.name} --subnet ${var.subnet}"
  interpreter = ["PowerShell", "-command" ]
}

}
结果


因为您的自定义策略要求NSG需要与子网创建时间或子网创建之前关联。必须使用block创建子网和安全组

在本例中,您可以使用在创建资源后调用本地可执行文件

示例

resource "azurerm_virtual_network" "test" {
  name                = "acctestvnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

 subnet {
   name = var.subnet
   address_prefix = "10.0.1.0/24"
   security_group = azurerm_network_security_group.main.id
 }

}

resource "azurerm_app_service" "test" {
  name                = "acctestas"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.test.id

provisioner "local-exec" {
  command = "az webapp vnet-integration add --name ${azurerm_app_service.test.name} --resource-group ${azurerm_resource_group.main.name}  --vnet ${azurerm_virtual_network.test.name} --subnet ${var.subnet}"
  interpreter = ["PowerShell", "-command" ]
}

}
结果


您能否共享子网创建过程中收到的terrafrom错误?创建应用程序服务“acctestas”(资源组“terraform VNET webApp Rg”)时出错:web.AppsClient#CreateOrUpdate:发送请求失败:StatusCode=403--原始错误:Code=“RequestDisallowedByPolicy”消息=“策略不允许使用资源“acctestas”。策略标识符:您能否共享子网创建期间收到的terrafrom错误?创建应用程序服务“acctestas”(资源组“terraform VNET webApp Rg”)时出错:web.AppsClient#CreateOrUpdate:发送请求失败:StatusCode=403--原始错误:Code=“RequestDisallowedByPolicy”消息=“策略不允许使用资源“acctestas”。策略标识符:感谢您的解决方案,但我面临的问题是“exec:“PowerShell”:在%PATH%中找不到可执行文件。输出:“我已将C:\Windows\System32\WindowsPowerShell\v1.0\PowerShell.exe添加到系统路径变量中,但运气不好,有任何建议说明我的本地文件中可能缺少什么吗?是否在PowerShell上运行terraform.tf文件?”?您可以导航到terraform.exe文件所在的目录以运行您的terraform文件,还可以将terraform.exe路径添加到系统路径变量。我必须指定完整的powershell exe路径。此外,我还遇到了另一个问题,在我指定后执行vnet集成时tf找不到资源组--然后订阅它工作。现在我不确定这在AzDevOps中如何工作,我们是否可以在本地exec中设置订阅上下文?我可以创建另一个变量,但如果我可以动态查找订阅id并传递给az webapp vnet integration addI还没有使用devops,那就更好了。谢谢,在运行az webapp vnet integration的本地exec时设置上下文add--name${azurerm_app_service.main.name}--resource group如何${azurerm_resource_group.main.name}--vnet${azurerm_virtual_network.main.name}--subnet${var.subNetName}--subscription'someid'我想根据资源组读取subscriptionid感谢您的解决方案,但我面临“exec:”PowerShell:在%PATH%中找不到可执行文件。输出:我已将C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe添加到系统路径变量中,但运气不好,我的本地文件中可能缺少什么?是否在powershell上运行terraform.tf文件?您可以导航到terraform.exe文件所在的目录以运行terraform文件,还可以将terraform.exe路径添加到系统中m path variable..我必须指定完整的powershell EXE路径。我还面临另一个问题,在我指定--subscription之后,tf在执行vnet集成时找不到资源组。现在我不确定在AzDevOps中这将如何工作,我们是否可以在本地exec中设置订阅上下文?我可以创建另一个r变量,但如果我能动态地找到订阅id并传递给az webapp vnet integration addI还没有使用devops,那就更好了。谢谢在运行az webapp vnet integration的本地exec时设置上下文add--name${azurerm_app_service.main.name}--resource group${azurerm u resource_group.main.name}--vnet如何${azurerm_virtual_network.main.name}--子网${var.subNetName}--订阅'someid'我想根据资源组读取订阅ID
resource "azurerm_virtual_network" "test" {
  name                = "acctestvnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name

 subnet {
   name = var.subnet
   address_prefix = "10.0.1.0/24"
   security_group = azurerm_network_security_group.main.id
 }

}

resource "azurerm_app_service" "test" {
  name                = "acctestas"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.test.id

provisioner "local-exec" {
  command = "az webapp vnet-integration add --name ${azurerm_app_service.test.name} --resource-group ${azurerm_resource_group.main.name}  --vnet ${azurerm_virtual_network.test.name} --subnet ${var.subnet}"
  interpreter = ["PowerShell", "-command" ]
}

}