如何使用LocalStack模拟RDS aws_lambda.invoke_lambda调用
aws_lambda扩展的公开获取性说明
aws_lambda是AWS RDS、Aurora服务专属的闭源内置扩展,既没有开源,也不提供独立公开的可安装包,无法在自建的本地PostgreSQL实例上直接安装使用。
这个扩展是AWS针对自家托管数据库环境深度定制的,底层和AWS IAM、Lambda服务的内网调用逻辑做了绑定,没有对外放出适配通用PostgreSQL环境的版本。此前有开发者尝试从RDS实例中提取安装文件移植到自建库,都会因为缺失AWS专属的底层运行依赖无法正常加载。
基于LocalStack模拟PostgreSQL调用Lambda的可行替代方案
- 使用LocalStack内置的RDS模拟实例替代本地自建PostgreSQL
LocalStack的RDS模块已经内置了aws_lambda扩展的适配逻辑,你只需要在LocalStack中创建PostgreSQL实例后,连接实例执行CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;即可正常使用,扩展发出的Lambda调用请求会自动路由到LocalStack内部部署的Lambda函数,和真实AWS环境的使用逻辑完全一致,业务代码不需要额外改造。 - 基于开源扩展手写兼容aws_lambda调用逻辑的自定义函数
如果你必须使用本地已经部署好的PostgreSQL实例,可以先安装公开开源的pgsql-http、plpgsql扩展,自己封装和原生aws_lambda.invoke签名完全一致的函数,内部将调用请求转发到LocalStack的Lambda API端点即可,参考实现如下:
封装完成后,函数的调用方式和RDS原生的aws_lambda完全一致,原有业务SQL基本不需要调整。CREATE OR REPLACE FUNCTION aws_lambda.invoke( function_name text, payload jsonb, invocation_type text DEFAULT 'RequestResponse' ) RETURNS jsonb AS $$ DECLARE api_resp http_response; invoke_url text := 'http://localhost:4566/2015-03-31/functions/' || function_name || '/invocations'; BEGIN SELECT status, content INTO api_resp FROM http_post( invoke_url, payload::text, 'application/json' ); IF api_resp.status != 200 THEN RAISE EXCEPTION 'Invoke lambda failed, status: %', api_resp.status; END IF; RETURN api_resp.content::jsonb; END; $$ LANGUAGE plpgsql; - 通过队列表+外部轮询脚本中转调用
如果不想给本地PostgreSQL安装额外扩展,可以在需要触发Lambda的表上创建行级触发器,将触发事件写入专门的本地队列表,再写一个轻量本地脚本轮询队列表,拿到待处理事件后调用LocalStack的Lambda接口,再将执行结果回写到数据库即可,这个方案对数据库环境的侵入性最低。
内容的提问来源于stack exchange,提问作者Anugerah Erlaut
相关产品推荐
相关产品推荐

