最近在一个IaC的项目中以虚拟网络集成的方式部署Azure API Management的时候遇到了一个网络方面的问题,在此记录一下,给大家提供一些参考。具体如下:
服务:Azure API Management
部署方式:Terraform部署
网络模式:Internal VNet模式
错误信息:Error: retrieving Policy for Service (Subscription: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
235│ Resource Group Name: "XXXX-XXX-XXXX-Management-Dev-APIM"
236│ Service Name: " XXXX-XXX-XXXX-Management-Dev-APIM "): unexpected status 422 (422 Unprocessable Entity) with error: ManagementApiRequestFailed: Failed to connect to management endpoint XXXX-XXX-XXXX-Management-Dev-APIM.management.azure-api.cn:3443 for a service deployed in a Virtual Network. Make sure to follow guidance at https://aka.ms/apim-vnet-common-issues for Inbound connectivity to Management endpoint. Check 'ApiManagement Control Plane - inbound' connectivity at https://aka.ms/apimnetworkstatus.
报错现象:
Terraform部署窗口会报错unexpected status 422,如下所示:
Azure 平台报错现象
Azure Portal会报错提示有一项网络链接检查有问题:
问题原因:
启用了Azure 虚拟网络中部署(注入)的 API 管理实例,其部署所在虚拟网络的虚拟网络安全组规则控制其中部署了 API 管理的子网的入站和出站流量。 如果特定的端口不可用,API 管理可能无法正常工作且不可访问。因此,需要在VNET中显示开放相关规则
解决办法:
按照Azure文档中的描述,需要在APIM所处的VNET所关联的NSG中,显示的开启相关网络规则来放行流量,具体可以参考下表开通NSG规则
源/目标端口 | 方向 | 传输协议 | 服务标记源/目标 | VNet 类型 |
* / [80], 443 | 入站 | TCP | Internet / VirtualNetwork | 仅外部 |
* / 3443 | 入站 | TCP | ApiManagement / VirtualNetwork | 外部和内部 |
* / 443 | 出站 | TCP | VirtualNetwork / Storage | 外部和内部 |
* / 443 | 出站 | TCP | VirtualNetwork / AzureActiveDirectory | 外部和内部 |
* / 443 | 出站 | TCP | VirtualNetwork / AzureConnectors | 外部和内部 |
* / 1433 | 出站 | TCP | VirtualNetwork / Sql | 外部和内部 |
* / 443 | 出站 | TCP | VirtualNetwork / AzureKeyVault | 外部和内部 |
* / 5671, 5672, 443 | 出站 | TCP | VirtualNetwork / EventHub | 外部和内部 |
* / 445 | 出站 | TCP | VirtualNetwork / Storage | 外部和内部 |
* / 1886、443 | 出站 | TCP | VirtualNetwork / AzureMonitor | 外部和内部 |
* / 6380 | 入站和出站 | TCP | VirtualNetwork / VirtualNetwork | 外部和内部 |
* / 6381 - 6383 | 入站和出站 | TCP | VirtualNetwork / VirtualNetwork | 外部和内部 |
* / 4290 | 入站和出站 | UDP | VirtualNetwork / VirtualNetwork | 外部和内部 |
* / 6390 | 入站 | TCP | AzureLoadBalancer / VirtualNetwork | 外部和内部 |
* / 443 | 入站 | TCP | AzureTrafficManager / VirtualNetwork | 外部 |
* / 6391 | 入站 | TCP | AzureLoadBalancer / VirtualNetwork | 外部和内部 |