你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
将 Azure API 管理自承载网关部署到 Azure 容器应用
适用于:Developer | Premium
本文提供了将 Azure API 管理的自承载网关组件部署到 Azure 容器应用的步骤。
将自承载网关部署到容器应用,以访问托管在同一 Azure 容器应用环境中的 API。
先决条件
完成以下快速入门:创建一个 Azure API 管理实例。
对于 Azure CLI:
在 Azure Cloud Shell 中使用 Bash 环境。 有关详细信息,请参阅 Azure Cloud Shell 中的 Bash 快速入门。
如需在本地运行 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 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
标头来确定请求的原始协议。
确认容器应用正在运行
登录到 Azure 门户,并导航到容器应用。
在容器应用的“概述”页上,检查“状态”是否为“正在运行”。
将测试请求发送到
/status-012345678990abcdef
上的状态终结点。 例如,使用类似于下面内容的curl
命令。curl -i https://my-gateway.happyvalley-abcd1234.centralus.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 centralus \ --environment my-environment --source .
确认容器应用正在运行,并且可以在命令输出中返回的 FQDN 处进行外部访问。 默认情况下,API 可在
/albums
终结点上进行访问。 示例:https://albums-api.happyvalley-abcd1234.centralus.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.centralus.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
例如,运行以下 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,则可以查询日志以查看请求和响应。