使用沙箱和边缘函数

更新时间:
复制为 MD 格式

RDS Supabase提供沙箱和边缘函数能力。沙箱基于e2b SDK,为您提供安全隔离的代码执行环境;边缘函数基于Deno运行时,支持在Supabase实例中部署和运行服务端TypeScript函数。本文介绍如何启用并使用沙箱和边缘函数。

前提条件

计费说明

  • 沙箱和边缘函数功能目前处于公测阶段,暂不收费。

  • 使用该功能会在Supabase实例所在的VPC创建一个用于沙箱管控服务的内网权威域名以及添加相应的解析记录,域名数量和域名解析请求量按云解析PrivateZone的计费规则按实际使用量收费,具体请参见云解析PrivateZone的计费文档

启用沙箱和边缘函数

  1. 登录RDS控制台,在左侧导航栏单击AI应用开发Supabase

  2. 在上方选择地域后,单击目标实例的ID,进入实例的基本信息页面。

  3. 在左侧导航栏中,单击沙箱和边缘函数

  4. 打开启用沙箱和边缘函数开关。

    开启后,页面将显示可用的沙箱模板列表。

使用沙箱

沙箱基于e2b SDK提供安全隔离的代码执行环境,支持文件操作、命令执行和代码运行。使用沙箱前,您需要完成域名绑定和SDK环境配置。

步骤一:绑定域名

Supabase实例的IP地址绑定域名。在开发测试场景中,您可以将域名绑定到本地/etc/hosts文件中。

  1. 在实例详情页中获取实例的外网连接地址对应的IP地址。

  2. 在本地/etc/hosts文件中添加域名映射记录。本文以<实例ID>.sb.rds.com 为示例域名:

    <实例IP地址> <实例ID>.sb.rds.com

步骤二:下载e2b SDKpatch代码

GitHub下载e2b SDKpatch代码,用于适配RDS Supabase的路由方式。

步骤三:(可选)配置SSL实现HTTPS访问

如需通过HTTPS访问沙箱,请先为Supabase实例配置SSL证书。具体操作,请参见RDS Supabase配置SSL实现HTTPS访问

配置SSL后,设置以下环境变量:

# rootCA.pem为生成Supabase实例SSL证书对应的CA证书
export SSL_CERT_FILE="/xxx/rootCA.pem"
export REQUESTS_CA_BUNDLE="/xxx/rootCA.pem"

步骤四:配置e2b SDK环境变量

设置以下环境变量,用于e2b SDK连接Supabase实例。

# E2B_DOMAIN:步骤一绑定的域名
export E2B_DOMAIN=r<实例ID>.sb.rds.com

# E2B_API_KEY:Supabase实例的Service Key
export E2B_API_KEY=<your_service_key>
说明

获取Service Key:在实例详情页右上角,单击获取API Key,在弹出的对话框中复制ServiceKey的值。

步骤五:获取模板ID并创建沙箱

  1. 在实例详情页的沙箱和边缘函数页面中,查看沙箱模板表格,复制目标模板的模板ID

  2. 在您的项目代码中引入步骤二下载的patch文件,使用模板ID创建沙箱。

以下提供PythonTypeScript两种语言的示例代码。

Python

使用Pythone2b SDK创建沙箱并执行操作。

import time
from e2b_code_interpreter import Sandbox
from patch_e2b import patch_e2b

# 启用HTTPS(如未配置SSL,请改为False)
patch_e2b(True)

# 使用控制台中获取的模板ID创建沙箱
sbx: Sandbox = Sandbox.create(
    template="<模板ID>",
    timeout=600,
    request_timeout=300
)
print("sandbox_id: " + sbx.sandbox_id)

try:
    # 写入文件
    sbx.files.write("/home/user/test.txt", "Hello from sandbox!")

    # 读取文件
    content = sbx.files.read("/home/user/test.txt")
    print(f"File content: {content}")

    # 执行Shell命令
    result = sbx.commands.run("ls -la /home/user")
    print(f"Exit code: {result.exit_code}")
    print(f"Stdout: {result.stdout}")

    # 执行Python代码
    time.sleep(1)
    execution = sbx.run_code("print('hello world')")
    print(f"Results: {execution.results}")
    print(f"Logs: {execution.logs}")
finally:
    sbx.kill()
    print("Sandbox closed.")

TypeScript

使用TypeScripte2b SDK创建沙箱并执行操作。

import { patchE2b } from './patchE2b'
import { Sandbox } from '@e2b/code-interpreter'

// 启用HTTPS(如未配置SSL,请改为false)
await patchE2b(true)

// 使用控制台中获取的模板ID创建沙箱
const sandbox = await Sandbox.create('<模板ID>', {
  timeoutMs: 600_000,
  requestTimeoutMs: 300_000,
})
console.log(`sandbox_id: ${sandbox.sandboxId}`)

try {
  // 写入文件
  await sandbox.files.write('/home/user/test.txt', 'Hello from sandbox!')

  // 读取文件
  const content = await sandbox.files.read('/home/user/test.txt')
  console.log(`File content: ${content}`)

  // 执行Shell命令
  const result = await sandbox.commands.run('ls -la /home/user')
  console.log(`Exit code: ${result.exitCode}`)
  console.log(`Stdout: ${result.stdout}`)

  // 执行Python代码
  await new Promise(r => setTimeout(r, 1000))
  const execution = await sandbox.runCode("print('hello world')")
  console.log(`Results: ${JSON.stringify(execution.results)}`)
  console.log(`Logs: ${JSON.stringify(execution.logs)}`)
} finally {
  await sandbox.kill()
  console.log('Sandbox closed.')
}

使用边缘函数

边缘函数基于Deno运行时,支持在Supabase实例中部署和运行服务端TypeScript函数。通过Agent Runtime控制台,您可以创建、部署、管理边缘函数以及配置Secret。

访问Agent Runtime控制台

在浏览器中访问以下地址进入Agent Runtime控制台:

http://<Supabase实例外网连接地址>/agent-runtime
说明

外网连接地址可在实例详情页的网络信息区域获取。

部署边缘函数

说明

每个Supabase实例最多可创建5个边缘函数。

  1. Agent Runtime控制台的左侧导航栏中,单击Functions

  2. 单击右上角的Deploy a new function

  3. Create new edge function页面中,编写函数代码。

    以下是一个简单的边缘函数示例:

    import "jsr:@supabase/functions-js/edge-runtime.d.ts";
    
    interface reqPayload {
      name: string;
    }
    
    Deno.serve(async (req: Request) => {
      const { name }: reqPayload = await req.json();
      const data = {
        message: `Hello ${name}!`,
      };
      return new Response(
        JSON.stringify(data),
        { headers: { 'Content-Type': 'application/json' } }
      );
    });
  4. 在页面底部的Function name中输入函数名称,然后单击Deploy Function完成部署。

管理边缘函数

Functions列表中,单击目标函数名称进入函数详情页。在该页面中,您可以执行以下操作:

  • 查看和编辑代码:在Code标签页中查看函数代码,修改后单击Deploy updates部署更新。

  • 配置函数设置:在Settings标签页中,修改函数名称或启用/禁用JWT验证(VERIFY JWT开关)。

  • 删除函数:在Settings标签页底部的Danger Zone区域,单击Delete Function删除函数。

    警告

    删除操作不可恢复,请谨慎操作。

管理Secret

Secret用于在边缘函数中安全地存储和使用敏感信息(如API密钥、数据库连接字符串等)。

  1. Agent Runtime控制台的左侧导航栏中,单击Secrets

  2. 单击右上角的Add new secret

  3. 输入Secret的名称和值,完成创建。

说明

系统默认创建以下Secret供边缘函数使用:SUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYSUPABASE_DB_URLSUPABASE_PUBLIC_URL。您可以直接在边缘函数代码中通过Deno.env.get('SECRET_NAME')获取这些值。