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

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

在本教程中,你将:

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

先决条件

在开始本教程之前,需要以下资源。

Resource Description
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 cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  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="chinanorth3"
    

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

  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 。 确保令牌包含一个受众声明 (aud),其值为https://dynamicsessions.io

  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