如何使用boto3客户端调用Lambda函数并传递参数
实现方法
直接通过boto3 Lambda客户端调用目标函数即可,完全不需要走API网关链路,根据你是否愿意修改原有被调Lambda的代码,选对应方案即可:
方案1:零修改兼容原有API GET触发的Lambda
你现有的函数是API Gateway GET触发、路径参数格式为/<parameter>,本质上API网关只是给Lambda传了个固定结构的event对象,路径参数存在event的pathParameters字段下。你直接用boto3调用时,构造完全一致的event结构传入即可,原有业务代码一行都不用改。
示例代码:
import boto3 import json lambda_client = boto3.client('lambda') # 替换成你实际要传的参数值 target_param = "your_actual_parameter_value" invoke_resp = lambda_client.invoke( FunctionName='YOUR_TARGET_LAMBDA_NAME_OR_ARN', # 同步调用拿返回结果用RequestResponse,异步触发不需要等返回就用Event InvocationType='RequestResponse', Payload=json.dumps({ "httpMethod": "GET", "pathParameters": { # 这里的key必须和你之前API网关配置的路径参数名完全一致 # 比如原路径配置是/{id}就写"id": target_param "parameter": target_param }, # 原有代码如果没用到查询参数、请求头,这两个字段留空即可 "queryStringParameters": {}, "headers": {} }) ) # 解析被调函数的返回结果 result = json.loads(invoke_resp['Payload'].read())
注意两个前置配置:
- 发起调用的Lambda执行角色,必须绑定目标Lambda的
lambda:InvokeFunction权限,否则会报权限拒绝错误 pathParameters里的参数key必须和原API网关的路径占位符名完全匹配,否则原有代码读不到参数
方案2:改造被调Lambda兼容双触发模式(长期维护更推荐)
如果后续不想一直依赖API网关的event结构,可以稍微调整下被调Lambda的参数读取逻辑,同时兼容API网关触发、boto3直接调用两种场景:
import json def lambda_handler(event, context): # 优先读boto3直接传入的顶层参数,读不到再从API网关的路径参数结构里取 param = event.get("parameter") if not param: param = event.get("pathParameters", {}).get("parameter") # 保留你原有的业务逻辑即可 return { "statusCode": 200, "body": json.dumps({"received_param": param}) }
改造后调用方不需要构造复杂的API网关event,直接传顶层参数即可:
invoke_resp = lambda_client.invoke( FunctionName='YOUR_TARGET_LAMBDA_NAME_OR_ARN', InvocationType='RequestResponse', Payload=json.dumps({ "parameter": "your_actual_parameter_value" }) )
内容的提问来源于stack exchange,提问作者ninsignares
相关产品推荐
相关产品推荐

