如何通过本地主机触发Python Lambda经API Gateway访问DynamoDB(不使用SAM)
无SAM实现:本地VS环境服务对接Lambda+API Gateway访问DynamoDB
前置依赖准备
- Visual Studio中配置好Python 3.8及以上运行环境
- 本地安装AWS CLI,执行
aws configure配置有权限访问DynamoDB、Lambda的AK/SK,指定目标AWS区域 - 提前在AWS控制台创建DynamoDB表,例:表名
TestTable,主键为字符串类型的id,预先插入1-2条测试数据 - VS终端执行命令安装必要依赖:
pip install boto3 python-lambda-local requests
1. 编写Lambda GET查询函数
新建app.py文件写入以下代码,逻辑仅做参数解析、DynamoDB查询、结果返回,无额外框架依赖:
import boto3 import json # 初始化DynamoDB资源,本地调试时自动读取本地AWS CLI凭证,部署后自动读取Lambda执行角色凭证 dynamodb = boto3.resource('dynamodb', region_name='替换为你实际使用的AWS区域,如ap-northeast-1') table = dynamodb.Table('TestTable') def lambda_handler(event, context): # 从API Gateway透传的GET请求query参数中获取查询id query_params = event.get('queryStringParameters', {}) target_id = query_params.get('id') if not target_id: return { 'statusCode': 400, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'}, 'body': json.dumps({'error': 'missing required param: id'}) } try: db_resp = table.get_item(Key={'id': target_id}) if 'Item' not in db_resp: return { 'statusCode': 404, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'}, 'body': json.dumps({'msg': 'target data not found'}) } return { 'statusCode': 200, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'}, 'body': json.dumps(db_resp['Item'], default=str) } except Exception as e: return { 'statusCode': 500, 'headers': {'Content-Type': 'application/json'}, 'body': json.dumps({'error': str(e)}) }
2. 本地调试函数逻辑(无需部署到AWS)
- 新建测试事件文件
test_event.json,模拟API Gateway的触发请求格式:
{ "queryStringParameters": { "id": "替换为你预先插入DynamoDB的测试id值" } }
- 在VS终端执行本地运行命令:
python-lambda-local -f lambda_handler app.py test_event.json - 终端返回200状态码且能看到DynamoDB查询到的测试数据,即证明函数逻辑正常。
3. 部署Lambda(不使用SAM)
不需要安装或调用任何SAM相关命令,直接按以下步骤操作:
- 在VS终端执行打包命令:
zip -r lambda_deploy.zip app.py - 进入AWS Lambda控制台,新建Python运行时的函数,选择「从zip文件上传」,选中刚才生成的
lambda_deploy.zip - 将Lambda处理程序路径配置为
app.lambda_handler - 给Lambda绑定的执行角色附加
AmazonDynamoDBReadOnlyAccess权限策略,保证函数有权限读DynamoDB数据
4. 配置API Gateway触发+本地服务对接
- 进入AWS API Gateway控制台,新建REST API类型的接口,新增GET方法,集成类型选择「Lambda函数」,选中刚才部署的Lambda函数,开启Lambda代理集成
- 给GET方法配置CORS允许跨域请求,将API部署到测试阶段,复制生成的API调用URL
- 本地Visual Studio运行的主机服务直接向该URL发GET请求即可触发Lambda,调用示例:
import requests # 本地服务中的调用逻辑 API_URL = "替换为你复制的API Gateway调用地址" resp = requests.get(API_URL, params={"id": "要查询的id值"}) print(resp.status_code, resp.json())
常见问题排查
- 本地调试报权限错误:检查本地
aws configure配置的凭证对应身份是否有DynamoDB查询权限 - 部署后调用报权限错误:检查Lambda执行角色是否附加了DynamoDB读权限
- 本地服务调用报跨域错误:确认API Gateway侧已开启CORS配置,且Lambda返回头中包含
Access-Control-Allow-Origin字段
内容的提问来源于stack exchange,提问作者Arun Raj
相关产品推荐
相关产品推荐

