可用性
重要
该功能在API管理的高级和开发者层级中可用。
本文提供将 Azure API 管理 自承载网关 组件部署到 Azure 容器应用的步骤。
将自承载网关部署到容器应用,以访问托管在同一 Azure 容器应用环境中的 API。
先决条件
完成以下快速入门:创建一个 Azure API 管理实例。
对于 Azure CLI:
可以使用本地 Azure CLI。
如果需要,请安装 Azure CLI 来运行 CLI 参考命令。
本地 Azure CLI,请了解如何安装 Azure CLI。 如果在 Windows 或 macOS 上运行,请考虑在 Docker 容器中运行 Azure CLI。 有关详细信息,请参阅如何在 Docker 容器中运行 Azure CLI。
使用 az login 命令登录到 Azure CLI。 若要完成身份验证过程,请遵循终端中显示的步骤。 有关其他登录选项,请参阅使用 Azure CLI 登录。
出现提示时,请在首次使用时安装 Azure CLI 扩展。 有关扩展的详细信息,请参阅 将扩展与 Azure CLI 配合使用。
运行az version命令,以查看已安装的版本和依赖库。 若要升级到最新版本,请运行az upgrade。
注释
本文中的 Azure CLI 命令示例需要
containerapp
Azure CLI 扩展。 如果尚未使用az containerapp
命令,则运行第一个az containerapp
命令时,扩展会动态安装。 详细了解 Azure CLI 扩展。
在 API 管理实例中预配网关
在部署自承载网关之前,请在 Azure API 管理实例中预配网关资源。 有关步骤,请参阅 预配自承载网关。 在本文的示例中,网关被命名为my-gateway
。
从 API 管理获取网关部署设置
若要部署网关,需要网关的 令牌 和 配置终结点 值。 可以在 Azure 门户中找到它们:
- 登录到 Azure 门户,并导航到 API Management 实例。
- 在左侧菜单中的 “部署和基础结构”下,选择 “网关”。
- 选择预配的网关资源,然后选择“ 部署”。
- 复制 令牌 和 配置终结点 值。
将自托管网关部署到容器应用
可以使用 Azure 门户、Azure CLI 或其他工具将自承载网关容器映像部署到容器应用。 本文介绍使用 Azure CLI 的步骤。
创建容器应用环境
首先,使用 az containerapp env create 命令创建容器应用环境:
#!/bin/bash
az containerapp env create --name my-environment --resource-group myResourceGroup \
--location chinanorth3
此命令创建:
- 用于对容器应用进行分组的
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"
此命令创建:
一个名为
my-gateway
的容器应用在myResourceGroup
资源组中。 在此示例中,使用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
标头来确定请求的原始协议。
确认容器应用正在运行
登录到 Azure 门户并导航到容器应用。
在容器应用的“概述”页上,检查状态是否正在运行。
将测试请求发送到
/status-012345678990abcdef
上的状态终结点。 例如,使用curl
类似于下面的命令。curl -i https://my-gateway.happyvalley-abcd1234.chinanorth3.azurecontainerapps.io/status-012345678990abcdef
成功的请求返回
200 OK
响应。
小窍门
使用 CLI,还可以运行 az containerapp show 命令来检查容器应用的状态。
确认网关正常
登录到 Azure 门户,并导航到 API Management 实例。
在左侧菜单中的 “部署和基础结构”下,选择 “网关”。
在 “概述 ”页上,检查网关 的状态 。 如果网关正常,它将报告常规网关心跳信号。
示例方案
以下示例演示如何使用自承载网关访问在同一环境中的容器应用中托管的 API。 如下图所示,可以从 Internet 访问自承载网关,而 API 只能在容器应用环境中访问。
- 在与自承载网关相同的环境中部署托管 API 的容器应用
- 将 API 添加到 API 管理实例
- 通过自托管网关调用 API
在与自承载网关相同的环境中部署托管 API 的容器应用
例如,将示例音乐专辑 API 部署到容器应用。 若要以后使用自承载网关访问 API,请在与自承载网关相同的环境中部署 API。 有关此示例中使用的资源的详细步骤和信息,请参阅 快速入门:从本地源代码生成和部署到 Azure 容器应用。 缩写的步骤如下:
将 Python 源代码 下载到本地计算机。 如果愿意,请使用所选其他语言下载源代码。
将源代码提取到本地文件夹,并更改为 containerapps-albumapi-python-main/src 文件夹。
运行以下 az containerapp up 命令,将 API 部署到与自承载网关相同的环境中的容器应用。
.
请注意命令末尾,该命令将当前文件夹指定为容器应用的源。#!/bin/bash az containerapp up --name albums-api \ --resource-group myResourceGroup --location chinanorth3 \ --environment my-environment --source .
确认容器应用正在运行,并且可以通过命令输出中返回的 FQDN 从外部进行访问。 默认情况下,API 可在
/albums
终结点访问。 示例:https://albums-api.happyvalley-abcd1234.chinanorth3.azurecontainerapps.io/albums/albums
。
为内部入口配置 API
现在更新托管示例 API 的容器应用,以仅在容器环境中启用入口。 此设置仅限制从部署的自承载网关访问 API。
- 登录到 Azure 门户并导航到容器应用。
- 在左侧菜单中,选择 入口。
- 将“入口”设置为“已启用”。
- 在 入口流量中,选择“ 仅限容器应用环境”。
- 查看其余设置,然后选择“ 保存”。
将 API 添加到 API 管理实例
下面是将 API 添加到 API 管理实例并配置 API 后端的示例步骤。 有关详细信息,请参阅 将 API 添加到 Azure API 管理。
将 API 添加到 API 管理实例
- 在门户中,进入您配置了自承载网关的 API 管理实例。
- 在左侧菜单中,选择“API”“+ 添加 API”。
- 选择HTTP,然后选择完整。 输入以下设置:
- 显示名称:输入描述性名称。 示例: 相册 API。
-
Web 服务 URL:输入托管 API 的容器应用 的内部 FQDN。 示例:
http://albums-api.internal.happyvalley-abcd1234.chinanorth3.azurecontainerapps.io
。 - URL 方案:选择 “HTTP(S)”。
- API URL 后缀:输入所选的后缀。 示例: albumapi。
- 网关:选择预配的自行托管网关。 示例: my-gateway。
- 根据方案配置其他 API 设置。 选择 创建。
添加 API 操作
- 在左侧菜单中,选择 API>相册 API。
- 选择 “+ 添加操作”。
- 输入操作设置:
- 显示名称:输入操作的描述性名称。 示例: 获取专辑。
-
URL:选择 获取,为终结点输入
/albums
。 - 选择“保存”。
通过自托管网关调用 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
例如,在终结点 /albumapi/albums
上调用 API,运行以下命令 curl
。 如果 API 需要订阅密钥,请将 API 管理实例的有效订阅密钥作为请求中的标头传递:
curl -i https://my-gateway.happyvalley-abcd1234.chinanorth3.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,可以查询日志以查看请求和响应。