如果发生超时,Lambda 会自动调用相同的事件

Lambda Called Automatically With Same Event If Timeout Occurs

当通过另一个 API.

在 DynamoDB 中插入 url 时,我正在使用 AWS lambda(Java 运行时)处理一些文件

当lamda因超时而死亡时。 lambda 被同一个事件触发,同一个进程再次开始。进程再次超时死亡,进程再次启动

如何在超时时停止触发?

日志如下:

10:53:25 START RequestId: 494ec72d-45bb-409f-bdd4-7653033eefda Version: $LATEST

10:53:25
Received event: com.amazonaws.services.lambda.runtime.events.DynamodbEvent@1e4a7dd4

10:53:25
Got an INSERT EVENT

10:53:25
KEY IS 3c39f7ea-76cf-484f-8a11-39bc2d7c1fd8/aws_dummy.pdf


10:55:25
END RequestId: 494ec72d-45bb-409f-bdd4-7653033eefda

10:55:25
REPORT RequestId: 494ec72d-45bb-409f-bdd4-7653033eefda  Duration: 120035.00 ms  Billed Duration: 120000 ms  Memory Size: 512 MB Max Memory Used: 362 MB Init Duration: 2179.60 ms

10:55:25
2019-09-21T10:55:25.761Z 494ec72d-45bb-409f-bdd4-7653033eefda Task timed out after 120.03 seconds

10:55:28
START RequestId: 494ec72d-45bb-409f-bdd4-7653033eefda Version: $LATEST

10:55:28
Received event: com.amazonaws.services.lambda.runtime.events.DynamodbEvent@1e4a7dd4


10:55:28
Got an INSERT EVENT

10:55:28
KEY IS 3c39f7ea-76cf-484f-8a11-39bc2d7c1fd8/aws_dummy.pdf
public Integer handleRequest(DynamodbEvent event, Context context) {
        for (DynamodbStreamRecord record : event.getRecords()) {
            if (record.getEventName().equals("INSERT")) {
                // DO SOME WORK
                   }
      } 
     return (SOME_INTEGER)
}

我觉得 DynamoDBStream -> Lambda(新 Lambda)-> SNS -> SQS -> 现在你的 lambda。并有捕获失败的死信队列。

我的求婚想法有几个原因 1. SNS -> SQS 模式是发送事件和稍后扩展通信功能的最佳实践 2. 有DLQ来处理你的失败,你可以控制如何处理失败的。

谢谢,

如果我正确理解了您的要求,那么您希望您的应用始终在 lambda 上启动并避免冷启动。

我建议,如果您要求让您的应用程序保持 24 小时运行,请使用 EC2 或 ELb,因为您的 aws lambda 成本相同并且您不需要任何修改。

现在来到你的问题鞠躬做到这一点。

配置 CloudWatch。

  • 从那里,转到“事件”并单击“创建规则”。将事件类型设置为“计划”,我们将每 1 分钟 运行 此事件。

  • Select 您要从目标列表中定位的 Lambda 函数并保存。然后你需要创建一个名称和描述。

现在根据您的需要每 1 或 5 或 10 或 15 分钟对 Lambda 函数执行一次 ping 操作。