在AnalyticDB Supabase中使用边缘函数

更新时间:
复制 MD 格式

云原生数据仓库AnalyticDB PostgreSQLSupabase(简称AnalyticDB Supabase) Edge Functions是一项全托管边缘计算服务,允许您将TypeScript Deno函数部署到AnalyticDB Supabase项目中。与开源自托管的Supabase相比,AnalyticDB Supabase提供了完整的Edge Functions管理能力,确保您的代码和数据完全自主可控,同时提供与Supabase Cloud一致的开发体验。本文为您介绍AnalyticDB Supabase Edge Function的部署与管理操作,以及Secrets的配置与集中管理能力,帮助您快速构建安全可控的边缘计算应用。

功能简介

AnalyticDB Supabase Edge Functions提供了一套基于Deno的边缘计算方案,为全栈应用开发者带来现代化的无服务器体验。

开源社区提供的Supabase,其函数管理后台未开放源码,自建用户无法通过图形界面或命令行工具完成生产环境部署。AnalyticDB Supabase通过打造自有的Edge Functions管控平台解决了这一问题,并且所有代码和配置数据都驻留在您的私有环境中,实现功能真正可用和自主可控。

此外,AnalyticDB Supabase还提供原生的Edge Function Secrets配置与集中管理能力,可将敏感信息(如阿里云百炼平台API Key)安全地存放在密钥库中,通过Deno.env.get读取,避免硬编码或客户端暴露。

优势

  • TypeScript原生开发:无需编译打包,TypeScript源码直接部署,开发流程更简洁。

  • 生态互通:函数内可直接访问Supabase数据库、用户鉴权、对象存储等服务,无需额外配置。

  • 隔离与高性能:借助沙箱机制和Deno安全模型,确保每个请求独立运行,同时实现毫秒级响应和几乎无感的冷启动。

使用流程

部署Edge Function

使用Dashboard部署

  1. 登录Supabase Dashboard

  2. Dashboard侧边栏单击Edge Function>Functions

  3. 单击页面右上角的Deploy a new function,在下拉选项中选择Via Editor

  4. 在代码编辑器中编写代码。

    重要

    如需在Function中导入第三方依赖或调用公网API,需要为云原生数据仓库AnalyticDB PostgreSQLSupabase项目开通公网访问

    本文示例如下,包含 index.ts(入口文件)和 foo.ts。

    • index.ts文件如下:

      import { foo } from './foo.ts';
      console.info('server started');
      Deno.serve(async (req)=>{
        const { name } = await req.json();
        const data = {
          message: `Hello ${foo()} ${name}!`
        };
        return new Response(JSON.stringify(data), {
          headers: {
            'Content-Type': 'application/json',
            'Connection': 'keep-alive'
          }
        });
      });
    • foo.ts文件如下:

      export function foo() {
        return 'bar';
      }
  5. 在右下角编辑Edge Function的名称,然后单击Deploy部署。

使用functions-cli工具部署

  1. 获取并配置目标项目的SUPABASE_API_URLSUPABASE_API_KEY

    SUPABASE_API_KEYservice role key,配置信息获取请参见获取API Keys。可通过以下方式完成配置。

    • 环境变量:export SUPABASE_API_KEY=xxx

    • .env文件:SUPABASE_API_KEY=xxx

    • 命令行参数:-key xxx

    通过环境变量配置示例如下:

    export SUPABASE_API_URL=https://sbp-xxx.supabase.opentrust.net
    export SUPABASE_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2Vxxxx
  2. 准备函数文件。

    本文函数目录结构如下,包含 index.ts(入口文件)和 foo.ts

    supabase
    └── functions
        └── hello
            ├── foo.ts
            └── index.ts
    • index.ts文件如下:

      import { foo } from './foo.ts';
      console.info('server started');
      Deno.serve(async (req)=>{
        const { name } = await req.json();
        const data = {
          message: `Hello ${foo()} ${name}!`
        };
        return new Response(JSON.stringify(data), {
          headers: {
            'Content-Type': 'application/json',
            'Connection': 'keep-alive'
          }
        });
      });
    • foo.ts文件如下:

      export function foo() {
        return 'bar';
      }
  3. 下载functions-cli工具。后续执行相关命令时,请将functions-cli替换为下载的cli工具名称。

  4. 执行部署。

    说明
    • 部署命令会在当前执行命令的目录下查找supabase/functions/路径,并寻找名为hello的函数目录。

    • 如果执行报错“At least one file is required”,请登录控制台,在目标Supabase项目所在行的操作列,选择更多 > 升级版本后重试。如果您的项目当前版本为v1.0.0,升级后会更新数据库连接串。

    ./functions-cli deploy hello

    如需要在部署 Edge Function 时关闭 JWT 校验,可添加--no-verify-jwt参数,示例:

    ./functions-cli deploy hello --no-verify-jwt

测试Edge Function

通过Dashboard测试

  1. 单击Functions页面右上角的Test按钮。

  2. 在面板中单击右下角的Send Request

    请求发送成功后,响应状态码为 200,响应 Body 返回 {"message": "Hello bar Functions!"}

使用curl命令测试

复制Details页签下的curl命令,并将其中的[YOUR ANON KEY]替换为anon keyservice role key

页面 Invoke function 区域提供 cURL、JavaScript、Swift、Flutter、Python 多语言调用示例,选择 cURL 选项卡即可查看待复制的命令。

返回示例如下:

curl -L -X POST 'https://sbp-5xxx.supabase.opentrust.net/functions/v1/bright-service' \
  -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoiYW5xxxxxxljA' \
  -H 'Content-Type: application/json' \
  --data '{"name":"Functions"}'
{"message":"Hello bar Functions!"}

更新Edge Function

  1. Dashboard侧边栏单击Edge Function>Functions,然后单击目标Function。

  2. 单击Code页签,编辑目标文件。

  3. 单击右下角的Deploy updates按钮更新Edge Function。

迁移Edge Function

Supabase Cloud迁移至AnalyticDB Supabase

步骤一:获取并配置项目信息

  1. 获取源端个人访问令牌。

    1. 访问Supabase Cloud控制台

    2. Access Tokens页面,单击Generate new token

    3. 输入令牌名称,单击Generate token

      例如填写 migration token,将 Expires in 设置为 30 days,然后单击 Generate token

    4. 复制并妥善保存该令牌。

  2. 获取源端Project Ref。

    1. 访问 Supabase 控制台

    2. 单击源端项目,查看URL(例如https://supabase.com/dashboard/project/qeqfhfoebrtkbmwd****),URL末尾即为Project Ref(例如qeqfhfoebrtkbmwd****)。

  3. 获取目标端项目的SUPABASE_API_URLSUPABASE_API_KEYSUPABASE_API_KEYservice role key,获取方法请参见获取API Keys

  4. (可选)配置项目信息。可通过以下方式完成配置。

    • 环境变量:export SUPABASE_API_KEY=xxx

    • .env文件:SUPABASE_API_KEY=xxx

    • 命令行参数:-key xxx

    通过环境变量配置示例如下:

    export SUPABASE_SOURCE_REF=abcdefghijkl****
    export SUPABASE_SOURCE_TOKEN=sbp_1760f47cc82fe3466dce9aa*********
    export SUPABASE_API_URL=https://sbp-xxx.supabase.opentrust.net
    export SUPABASE_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2V****

步骤二:安装Deno

具体操作,请参见installation

步骤三:使用functions-cli迁移

  1. 下载functions-cli工具。后续执行相关命令时,请将functions-cli替换为下载的cli工具名称。

  2. 执行迁移命令。

    迁移单个函数

    通过函数slug迁移特定函数:

    # 基本用法
    ./functions-cli migrate \
      -s hello \
      --source-ref abcdefghijkl**** \
      --source-token sbp_1a2b3c4d5e6f7g8h**** \
      --target-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2V**** \
      --target-url https://sbp-****.supabase.opentrust.net

    迁移所有函数

    ./functions-cli migrate \
      --all \
      --source-ref abcdefghijkl**** \
      --source-token sbp_1a2b3c4d5e6f7g8h**** \
      --target-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2V**** \
      --target-url https://sbp-****.supabase.opentrust.net

AnalyticDB Supabase项目间同步

步骤一:获取并配置项目信息

  1. 获取源端、目标端项目的SUPABASE_API_URLSUPABASE_API_KEYSUPABASE_API_KEYservice role key,获取方法请参见获取API Keys

  2. (可选)配置项目信息。可通过以下方式完成配置。

    • 环境变量:export SUPABASE_API_KEY=xxx

    • .env文件:SUPABASE_API_KEY=xxx

    • 命令行参数:-key xxx

    通过环境变量配置示例如下:

    export SOURCE_API_URL=https://sbp-source***.supabase.opentrust.net
    export SOURCE_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2V****
    export SUPABASE_API_URL=https://sbp-target***.supabase.opentrust.net
    export SUPABASE_API_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjoic2V****

步骤二:安装Deno

具体操作,请参见installation

步骤三:使用functions-cli同步

  1. 下载functions-cli工具。后续执行相关命令时,请将functions-cli替换为下载的cli工具名称。

  2. 执行同步命令。

    同步单个函数

    通过函数slug同步特定函数:

    ./functions-cli sync \
      -s hello \
      --source-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1Ni**** \
      --source-url https://sbp-source***.supabase.opentrust.net \
      --target-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1Ni**** \
      --target-url https://sbp-target***.supabase.opentrust.net

    同步所有函数

    ./functions-cli sync \
      --all \
      --source-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.source_key_**** \
      --source-url https://sbp-source****.supabase.opentrust.net \
      --target-key eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.target_key_**** \
      --target-url https://sbp-target****.supabase.opentrust.net

删除Edge Function

  1. Dashboard侧边栏单击Edge Function>Functions,单击目标Function。

  2. 单击Details页签。

  3. 单击Delete function区域的Delete edge function按钮,然后在对话框中单击Delete按钮。

Secrets管理

AnalyticDB Supabase中,阿里云提供原生的Edge Function Secrets配置与集中管理能力,可将敏感信息安全地存放在函数运行环境的密钥库中,通过Deno.env.get读取,避免硬编码或客户端暴露。

默认Secrets

Edge Functions默认可访问以下密钥:

名称

说明

SUPABASE_URL

AnalyticDB Supabase项目的API网关地址。

SUPABASE_LOCAL_URL

AnalyticDB Supabase项目的API本地网关地址(不经过公网,延迟更低)。

SUPABASE_ANON_KEY

AnalyticDB Supabase API的匿名密钥。启用行安全策略时,该密钥可以安全地在浏览器中使用。

SUPABASE_SERVICE_ROLE_KEY

AnalyticDB Supabase API的服务角色密钥。该密钥可以在Edge Functions中安全使用,但切勿在浏览器中使用,此密钥将绕过行安全策略的限制。

创建自定义Secrets

通过Dashboard创建

  1. Dashboard侧边栏单击Edge Function>Secrets

  2. 输入KeyValue。

    单击 Save 保存密钥配置。

  3. 单击save完成添加。

通过functions-cli工具创建

  1. 下载functions-cli工具。后续执行相关命令时,请将functions-cli替换为下载的cli工具名称。

  2. 执行创建命令。

    # 添加1个
    functions-cli secrets set DASHSCOPE_API_KEY=sk_test123456
    # 添加多个
    functions-cli secrets set DASHSCOPE_API_KEY=sk_test123456 OPENAI_API_KEY=test123456 
    # 从 .env 文件添加
    functions-cli secrets set --env-file supabase/functions/.env

Edge Function中获取Secrets

您可以使用Deno的内置处理器访问环境变量,访问时只需传递环境变量名称即可。使用场景请参见集成AI服务

Deno.env.get('NAME_OF_SECRET')