我有一个AWS Lambda函数:
- 检查数据库并创建通知
- 将这些通知发送到Firebase
由于数据库交互,该功能需要在VPC上。我遵循本指南为函数提供了一种连接到Firebase的方法。如何为连接到亚马逊专有网络的Lambda功能提供互联网访问权限?。它奏效了。
Lambda函数还与AWS S3 Bucket交互,因为该函数是使用带有slim_handler = True
的Zappa部署的,这使得Zappa向Lambda上传一个小处理程序,并在运行时从S3加载实际项目。
有些通知已发送,有些则未发送。当我检查日志时,对于成功交付的通知,我看到以下内容:
Starting new HTTPS connection (1): fcm.googleapis.com:443
...
https://fcm.googleapis.com:443 "POST /fcm/send HTTP/1.1" 200 None
对于其他未送达的通知,它会记录:
Starting new HTTP connection (1): 169.254.169.254:80
...
Task timed out after 180.01 seconds
Instancing..
AWS Lambda函数有一个重试策略,由于超时,该函数运行3次,通知在数据库上重复三次(但不发送到Firebase(。
为什么HTTP连接从169.254.169.254:80开始,而不是在正确的端点fcm.googleapis.com:443上?
我不确定这是否相关,但Zappa会自动设置一个运行4分钟的事件,以保持Lambda功能的热度。
为什么连接到Firebase有时有效,有时无效?
听起来Lambda函数配置运行的某些子网没有到NAT实例或NAT网关的路由。如果您为Lambda函数配置的任何子网都是公用子网,那么您将看到此问题。