在AnalyticDB Supabase中使用边缘函数

更新时间:

云原生数据仓库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

    image

  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. 执行部署。

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

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

测试Edge Function

通过Dashboard测试

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

    image

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

    image

使用curl命令测试

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

image

返回示例如下:

image

更新Edge Function

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

    image

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

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

    image

迁移Edge Function

Supabase Cloud迁移至AnalyticDB Supabase

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

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

    1. 访问Supabase Cloud控制台

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

      image

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

      image

    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按钮。

    image

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。

    image

  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')