Python 3.6 Lambda调用AWS Pinpoint的send_users_messages接口超时求助
问题排查及修复方案
根因分析
- 网络连通性问题(最高概率):如果你的Lambda函数部署在VPC中,默认无法访问公网的AWS Pinpoint服务端点,会导致请求一直挂起直到超时,这是AWS SDK调用服务超时的最常见原因。
- Lambda超时时间配置过短:AWS Lambda默认的执行超时时间为3秒,Pinpoint接口调用的网络耗时+业务处理耗时可能超过该阈值,导致还没拿到返回结果就被平台强制终止。
- 异常捕获逻辑不完善:你的代码直接捕获所有异常后返回False,没有打印异常栈信息,无法确认是否是参数错误、权限错误等衍生问题。
- 代码存在无效逻辑:boto3调用Pinpoint返回的response是Python字典类型,不是HTTP流式响应对象,调用
response.read()会直接抛出AttributeError,不过该问题出现在接口调用成功之后,不是本次超时的直接原因。
修复方案
- 解决网络连通问题
- 如果Lambda无需访问VPC内资源:直接将Lambda的部署模式改为「不使用VPC」,默认就能访问公网AWS服务。
- 如果Lambda必须部署在VPC内:二选一即可
- 给Lambda所在的私有子网配置NAT网关,通过NAT网关访问公网Pinpoint端点
- 在VPC内创建Pinpoint的Interface VPC端点,让Lambda可以通过内网访问Pinpoint服务
- 调整Lambda超时配置
将Lambda的执行超时时间调整为10~30秒,预留足够的接口调用耗时。 - 完善boto3客户端配置,显式设置超时
初始化Pinpoint客户端的时候增加超时参数,避免请求无限挂起:
import boto3 from botocore.config import Config client_config = Config( connect_timeout=5, read_timeout=10 ) client = boto3.client('pinpoint', config=client_config)
- 修改异常捕获逻辑,打印错误信息
将异常捕获逻辑修改为打印完整错误信息,方便定位问题:
import traceback try: print("---------2----------------") response = client.send_users_messages( ApplicationId='my_aws_pinpoint_services_project.id', SendUsersMessageRequest=payload ) print("---------3----------------") print(json.dumps(response)) return response except Exception as e: print(f"调用Pinpoint出错: {str(e)}") print(traceback.format_exc()) return False
- 校验权限和参数正确性
确认Lambda的执行角色IAM策略包含mobiletargeting:SendUsersMessages权限,同时确认ApplicationId填写的是Pinpoint项目正确的ID,测试用的推送模板coll-1-en已正确发布,GCM通道配置正常。
内容的提问来源于stack exchange,提问作者Javier Gallego
相关产品推荐
相关产品推荐

