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

教程:在 Azure 容器应用的代码解释器会话中运行 JavaScript 代码(预览版)

本教程演示如何使用 HTTP API 在 Azure 容器应用动态会话中执行 JavaScript 代码。

本教程介绍以下内容:

  • 创建代新的码解释器会话
  • 为会话池设置适当的安全上下文
  • 传入容器应用要运行的的 JavaScript 代码

注意

Azure 容器应用动态会话中的 JavaScript 代码解释器功能目前以预览版提供。 有关详细信息,请查看预览限制

先决条件

开始学习本教程之前,必须具有以下资源。

资源 说明
Azure 帐户 需要一个具有活动订阅的 Azure 帐户。 如果没有帐户,可以免费创建一个
Azure CLI 安装 Azure CLI

安装

首先,使用最新的更新准备 Azure CLI,并登录到 Azure。

  1. 将 Azure CLI 更新到最新版本。

    az upgrade
    
  2. 注册 Microsoft.App 资源提供程序。

    az provider register --namespace Microsoft.App
    
  3. 安装最新版 Azure 容器应用 CLI 扩展。

    az extension add \
      --name containerapp \
      --allow-preview true --upgrade
    
  4. 登录 Azure。

    az login
    
  5. 查询 Azure 订阅 ID,并将值设置为变量。

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    
  6. 设置本过程中使用的变量。

    运行以下命令之前,请确保将 <> 括起来的占位符替换为自己的值。

    RESOURCE_GROUP=<RESOURCE_GROUP_NAME>
    SESSION_POOL_NAME=<SESSION_POOL_NAME>
    LOCATION="northcentralus"
    

    可以使用这些变量在以下步骤中创建资源。

  7. 设置要用于创建资源组的订阅

    az account set -s $SUBSCRIPTION_ID
    
  8. 创建资源组。

    az group create \
      --name $RESOURCE_GROUP \
      --location $LOCATION
    

创建代码解释器会话池

使用 az containerapp sessionpool create 命令创建一个 Node.js 会话池,该池负责执行任意 JavaScript 代码。

az containerapp sessionpool create \
  --name $SESSION_POOL_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --max-sessions 5 \
  --network-status EgressEnabled \
  --container-type NodeLTS \
  --cooldown-period 300

为代码执行 API 设置角色分配

若要与会话池的 API 交互,必须使用具有 Azure ContainerApps Session Executor 角色分配的标识。 在本教程中,你将使用 Microsoft Entra ID 用户标识来调用 API。

  1. 查询用户对象 ID。

    USER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)
    
  2. 将角色分配给标识。

    az role assignment create \
      --role "Azure ContainerApps Session Executor" \
      --assignee-object-id $USER_OBJECT_ID \
      --assignee-principal-type User \
      --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.App/sessionPools/$SESSION_POOL_NAME"
    

获取持有者令牌

若要直接访问会话池的 API,请生成一个访问令牌,以包含在请求的 Authorization 标头中。 确保令牌包含具有值 https://dynamicsessions.io 的受众(aud)声明。 有关详细信息,请参阅身份验证和授权规则。

  1. 获取访问令牌。

    JWT_ACCESS_TOKEN=$(az account get-access-token --resource https://dynamicsessions.io --query accessToken -o tsv)
    
  2. 创建一个变量来保存请求头。

    AUTH_HEADER="Authorization: Bearer $JWT_ACCESS_TOKEN"
    

    此标头附带对应用程序终结点发出的请求。

获取会话池管理终结点

使用以下命令以返回应用程序的终结点。

SESSION_POOL_MANAGEMENT_ENDPOINT=$(az containerapp sessionpool show -n $SESSION_POOL_NAME -g $RESOURCE_GROUP --query "properties.poolManagementEndpoint" -o tsv)

此终结点是进行 API 调用以在代码解释器会话中执行代码有效负载的位置。

在会话中执行代码

现在,你有一个持有者令牌来建立安全上下文和会话池终结点,可以向应用程序发送请求来执行代码块。

运行以下命令,以运行 JavaScript 代码在应用程序中记录“hello world”。

curl -v -X 'POST' -H "$AUTH_HEADER" "$SESSION_POOL_MANAGEMENT_ENDPOINT/code/execute?api-version=2024-02-02-preview&identifier=test" -H 'Content-Type: application/json' -d '
{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "console.log(\"hello-world\")"
    }
}'

你应会看到类似于以下示例的输出。

{
  "properties": {
    "status": "Success",
    "stdout": "hello-world\n",
    "stderr": "",
    "executionResult": "",
    "executionTimeInMilliseconds": 5
  }
}

可以在 GitHub 上找到更多代码解释器 API 示例

清理资源

本教程中创建的资源会影响 Azure 帐单。 如果不打算长期使用这些服务,请运行以下命令来删除本教程中创建的所有内容。

az group delete \
  --resource-group $RESOURCE_GROUP

后续步骤