你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure API 管理自承载网关部署到 Azure 容器应用

适用于:Developer | Premium

本文提供了将 Azure API 管理的自承载网关组件部署到 Azure 容器应用的步骤。

将自承载网关部署到容器应用,以访问托管在同一 Azure 容器应用环境中的 API。

先决条件

在 API 管理实例中预配网关

在部署自承载网关之前,请在 Azure API 管理实例中预配网关资源。 有关步骤,请参阅预配自承载网关。 在本文中的示例中,网关命名为 my-gateway

从 API 管理获取网关部署设置

若要部署网关,需要网关的“令牌”和“配置终结点”值。 可以在 Azure 门户中找到它们:

  1. 登录到 Azure 门户,并导航到 API Management 实例。
  2. 在左侧菜单中的“部署和基础结构”下,选择“网关”。
  3. 选择预配的网关资源,然后选择“部署”。
  4. 复制“令牌”和“配置终结点”值。

将自承载网关部署到容器应用

可以使用 Azure 门户Azure CLI 或其他工具将自承载网关容器映像部署到容器应用。 本文介绍使用 Azure CLI 的步骤。

创建容器应用环境

首先,使用 az containerapp env create 命令创建容器应用环境:

#!/bin/bash
az containerapp env create --name my-environment --resource-group myResourceGroup \
    --location centralus

此命令创建:

  • 名为 my-environment 的容器应用环境,用于对容器应用进行分组。
  • Log Analytics 工作区

为自承载网关创建容器应用

若要将自承载网关部署到环境中的容器应用,请运行 az containerapp create 命令。

首先为 API 管理网关资源中的“令牌”和“配置终结点”值设置变量。

#!/bin/bash
endpoint="<API Management configuration endpoint>"
token="<API Management gateway token>"

使用 az containerapp create 命令创建容器应用:

#!/bin/bash
az containerapp create --name my-gateway \
    --resource-group myResourceGroup --environment 'my-environment' \
    --image "mcr.microsoft.com/azure-api-management/gateway:2.5.0" \
    --target-port 8080 --ingress external \
    --min-replicas 1 --max-replicas 3 \
    --env-vars "config.service.endpoint"="$endpoint" "config.service.auth"="$token" "net.server.http.forwarded.proto.enabled"="true"

此命令会创建:

  • myResourceGroup 资源组中名为 my-gateway 的容器应用。 在此示例中,容器应用是使用 mcr.microsoft.com/azure-api-management/gateway:2.5.0 映像创建的。 详细了解自承载网关容器映像

  • 支持端口 8080 上的容器应用外部流入量。

  • 容器应用的至少 1 个副本、最多 3 个副本。

  • 使用在环境变量中传递的配置值,从自承载网关到 API 管理实例的连接。 有关详细信息,请参阅自承载网关容器配置设置

    注意

    Azure 容器应用流入量会将 HTTPS 请求作为 HTTP 转发到自承载网关容器应用。 在这里,net.server.http.forwarded.proto.enabled 环境变量设置为 true,以便自承载网关使用 X-Forwarded-Proto 标头来确定请求的原始协议。

确认容器应用正在运行

  1. 登录到 Azure 门户,并导航到容器应用。

  2. 在容器应用的“概述”页上,检查“状态”是否为“正在运行”。

  3. 将测试请求发送到 /status-012345678990abcdef 上的状态终结点。 例如,使用类似于下面内容的 curl 命令。

    curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/status-012345678990abcdef
    

    成功的请求会返回 200 OK 响应。

提示

使用 CLI,还可以运行 az containerapp show 命令来检查容器应用的状态。

确认网关正常

  1. 登录到 Azure 门户,并导航到 API Management 实例。

  2. 在左侧菜单中的“部署和基础结构”下,选择“网关”。

  3. 在“概述”页上,检查网关的“状态”。 如果网关正常,它将报告常规网关检测信号。

    门户中网关状态的屏幕截图。

示例方案

以下示例演示如何使用自承载网关访问在同一环境中的容器应用中托管的 API。 如下图所示,可以从 Internet 访问自承载网关,而 API 只能在容器应用环境中访问。

使用自承载网关的示例方案示意图。

  1. 在与自承载网关相同的环境中部署托管 API 的容器应用
  2. 将 API 添加到 API 管理实例
  3. 通过自承载网关调用 API

在与自承载网关相同的环境中部署托管 API 的容器应用

例如,将示例音乐专辑 API 部署到容器应用。 若要以后使用自承载网关访问 API,请在与自承载网关相同的环境中部署 API。 有关此示例中使用的资源的详细步骤和信息,请参阅快速入门:从本地源代码生成并部署到 Azure 容器应用。 步骤大致如下:

  1. Python 源代码下载到本地计算机。 如果愿意,请使用所选其他语言下载源代码。

  2. 将源代码提取到本地文件夹,并更改为 containerapps-albumapi-python-main/src 文件夹。

  3. 运行以下 az containerapp up 命令,将 API 部署到与自承载网关相同的环境中的容器应用。 请注意命令末尾的 .,其将当前文件夹指定为容器应用的源。

    #!/bin/bash
    az containerapp up --name albums-api \
        --resource-group myResourceGroup --location centralus \
        --environment my-environment --source .
    
  4. 确认容器应用正在运行,并且可以在命令输出中返回的 FQDN 处进行外部访问。 默认情况下,API 可在 /albums 终结点上进行访问。 示例:https://albums-api.happyvalley-abcd1234.centralus.azurecontainerapps.io/albums/albums

为内部流入量配置 API

现在更新托管示例 API 的容器应用,以仅在容器环境中启用流入量。 此设置限制仅从部署的自承载网关访问 API。

  1. 登录到 Azure 门户,并导航到容器应用。
  2. 在左侧菜单中,选择“流入量”。
  3. 将“入口”设置为“已启用”。
  4. 在“入口流量”中,选择“限制为容器应用环境”。
  5. 查看其余设置,然后选择“保存”。

将 API 添加到 API 管理实例

下面是将 API 添加到 API 管理实例并配置 API 后端的示例步骤。 有关详细信息,请参阅将 API 添加到 Azure API 管理

将 API 添加到 API 管理实例

  1. 在门户中,导航到配置自承载网关的 API 管理实例。
  2. 在左侧菜单中,选择“API”>“+ 添加 API”。
  3. 选择“HTTP”,然后选择“完整”。 输入以下设置:
    1. 显示名称:输入描述性名称。 示例:专辑 API
    2. Web 服务 URL:输入托管 API 的容器应用的 内部 FQDN。 示例:http://albums-api.internal.happyvalley-abcd1234.centralus.azurecontainerapps.io
    3. URL 方案:选择 HTTP(S)
    4. API URL 后缀:输入所选的后缀。 示例:albumapi
    5. 网关:选择预配的自承载网关。 示例:my-gateway
  4. 根据你的场景配置其他 API 设置。 选择创建

添加 API 操作

  1. 在左侧菜单中,选择“API”>“专辑 API”。
  2. 选择“+ 添加操作”。
  3. 输入操作设置:
    1. 显示名称:输入操作的描述性名称。 示例:获取专辑
    2. URL:选择“获取”,然后输入终结点的 /albums
    3. 选择“保存”。

通过自承载网关调用 API

使用容器应用中运行的自承载网关的 FQDN 调用 API。 在 Azure 门户中的容器应用的“概述”页上找到 FQDN,或运行以下 az containerapp show 命令。

#!/bin/bash
az containerapp show --name my-gateway --resource-group myResourceGroup \
    --query "properties.configuration.ingress.fqdn" --output tsv

例如,运行以下 curl 命令以在 /albumapi/albums 终结点处调用 API。 如果 API 需要订阅密钥,请将 API 管理实例的有效订阅密钥作为请求中的标头传递:

curl -i https://my-gateway.happyvalley-abcd1234.centralus.azurecontainerapps.io/albumapi/albums -H "Ocp-Apim-Subscription-Key: <subscription-key>"

当测试成功时,后端会使用成功的 HTTP 响应代码和某些数据进行响应。

HTTP/1.1 200 OK
content-length: 751
content-type: application/json
date: Wed, 28 Feb 2024 22:45:09 GMT
[...]

[{"id":1,"title":"You, Me and an App Id","artist":"Daprize","price":10.99,"image_url":"https://aka.ms/albums-daprlogo"},{"id":2,"title":"Seven Revision Army","artist":"The Blue-Green Stripes","price":13.99,"image_url":"https://aka.ms/albums-containerappslogo"},{"id":3,"title":"Scale It Up","artist":"KEDA Club","price":13.99,"image_url":"https://aka.ms/albums-kedalogo"},{"id":4,"title":"Lost in Translation","artist":"MegaDNS","price":12.99,"image_url":"https://aka.ms/albums-envoylogo"},{"id":5,"title":"Lock Down Your Love","artist":"V is for VNET","price":12.99,"image_url":"https://aka.ms/albums-vnetlogo"},{"id":6,"title":"Sweet Container O' Mine","artist":"Guns N Probeses","price":14.99,"image_url":"https://aka.ms/albums-containerappslogo"}]

提示

如果已启用将 API 日志记录到 Application Insights,则可以查询日志以查看请求和响应。