如何构建含文件内容的AWS Lambda调用Payload?
在AWS Lambda中直接调用处理PDF的目标Lambda
核心逻辑
目标Lambda会对event['body']进行Base64解码后存储内容,所以你需要完成三步:从S3读取PDF二进制内容 → 将其转为Base64字符串 → 构造符合目标Lambda要求的Event Payload并调用。
完整代码示例
import boto3 import base64 import os # 初始化AWS客户端 s3_client = boto3.client('s3') lambda_client = boto3.client('lambda') def lambda_handler(event, context): # 从环境变量读取配置(避免硬编码) bucket_name = os.environ.get('PDF_STORAGE_BUCKET') pdf_key = os.environ.get('TARGET_PDF_KEY') target_lambda_id = os.environ.get('TARGET_LAMBDA_ARN') # 1. 从S3拉取PDF二进制文件 try: s3_response = s3_client.get_object(Bucket=bucket_name, Key=pdf_key) pdf_binary = s3_response['Body'].read() except Exception as e: return { 'statusCode': 500, 'body': f'读取S3文件失败: {str(e)}' } # 2. 将二进制PDF转为Base64字符串(匹配目标Lambda的解码逻辑) pdf_base64 = base64.b64encode(pdf_binary).decode('utf-8') # 3. 构造目标Lambda的输入Event # 若目标Lambda是API Gateway触发的,需对齐APIGatewayProxyEvent结构 invoke_payload = { 'body': pdf_base64, 'httpMethod': 'POST', 'headers': { 'Content-Type': 'application/pdf' } # 可根据目标Lambda的实际需求补充其他字段,比如path、requestContext等 } # 4. 调用目标Lambda try: lambda_response = lambda_client.invoke( FunctionName=target_lambda_id, InvocationType='RequestResponse', # 同步调用,按需改为Event实现异步 Payload=str(invoke_payload).encode('utf-8') ) # 解析目标Lambda的返回结果 response_content = lambda_response['Payload'].read().decode('utf-8') return { 'statusCode': 200, 'body': f'调用成功,目标Lambda返回: {response_content}' } except Exception as e: return { 'statusCode': 500, 'body': f'调用目标Lambda失败: {str(e)}' }
关键注意事项
- 权限配置:当前Lambda的执行角色必须具备:
s3:GetObject权限(针对存储PDF的S3桶)lambda:InvokeFunction权限(针对目标Lambda的ARN)
- 环境变量设置:在Lambda控制台配置
PDF_STORAGE_BUCKET、TARGET_PDF_KEY、TARGET_LAMBDA_ARN三个环境变量,避免代码硬编码敏感信息。 - Event结构匹配:如果目标Lambda原本由API Gateway触发,要确保构造的
invoke_payload包含它依赖的字段(比如httpMethod、特定请求头),否则可能导致目标Lambda处理逻辑出错。 - 调用模式选择:若不需要等待执行结果,可将
InvocationType改为Event实现异步调用。
内容的提问来源于stack exchange,提问作者eduardosufan
相关产品推荐
相关产品推荐

