最近在一个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 APIM 部署报错:“unexpected status 422” 一例_API


Azure 平台报错现象

Azure Portal会报错提示有一项网络链接检查有问题:

 

处理Azure APIM 部署报错:“unexpected status 422” 一例_APIM_02


问题原因:

启用了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

外部和内部

* / 1886443

出站

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

外部和内部