AWS Lambda 是否复制每条消息?
Does AWS Lambda duplicate every message?
我在 AWS 中构建了一个 CodePipeline 运行ning,一切运行良好,只是没有直接来自 CodePipeline 的良好通知机制。仔细研究,似乎公认的解决方案是配置 CloudWatch 以调用 Lambda 或 SNS 来发送您的消息。
好的,所以我构建了一个 Java 小程序来根据 CloudWatch CodePipeline 事件向 Slack 发送消息。它运行良好,只是 每条消息 都重复了六次或更多次。这似乎与我读过的关于重复的 Lambda 执行的所有其他帖子不同,在这些帖子中你偶尔会在这里或那里重复。
我知道标准答案是 Lambda 想要确保交付,因此可以重试事件,这很好 - 如果每 20 条或 100 条消息我收到一个重复消息,我就没事了。但是我不能为每个简单的 CP 运行 用 50 多条消息淹没 Slack 频道。更不用说我假设我会为这些 Lambda 执行中的每一次执行付费,而实际上我应该只得到 4 每个 运行.
我不想设置数据库来跟踪唯一 ID - 这又增加了复杂性和成本(执行仍然发生)。感觉有些东西配置错误。例如。 CloudWatch 是否会出于某种原因获取相同的消息并将其转发给 Lambda?还是 Lambda 认为即使成功退出也需要重试执行的原因?
我猜这取决于您如何配置 CloudWatch 事件侦听器。如果不小心,您将在 CodePipeline 阶段转换或 Action 上触发操作,而不是 CodePipeline 状态更改。从 CodePipeline 用户指南的 Detect and React to Changes in Pipeline State with Amazon CloudWatch Events 章节复制:
您可以配置在状态更改时发送通知:
- Specified pipelines or all your pipelines. You control this by using
"detail-type": "CodePipeline Pipeline Execution State Change".
- Specified stages or all your stages, within a specified pipeline or all your pipelines. You control this by using "detail-type": "CodePipeline Stage Execution State Change".
- Specified actions or all actions, within a specified stage or all stages, within a specified pipeline or all your pipelines. You control this by using "detail-type": "CodePipeline Action Execution State Change".
例如,如果您只对 CodePipeline 何时完成感兴趣,您可以将 CloudWatch Events 配置为:
{
"source": [
"aws.codepipeline"
],
"detail-type": [
"CodePipeline Pipeline Execution State Change",
],
"detail": {
"state": [
"SUCCEEDED",
"FAILED",
"CANCELED"
],
"pipeline": [{ "Ref": "myPipeline" }]
}
}
评论:
- 请注意,上面的状态列表中省略了
STARTED
、RESUMED
和 SUPERSEDED
(这可能是您喜欢的,也可能不是您喜欢的)
- 请注意,执行状态更改 与 阶段执行状态更改 相比具有不同的状态,后者又不同于 动作执行状态改变.
- 省略配置的
pipeline
部分以侦听来自您拥有的所有 CodePipelines 的事件,而不是特定的 CodePipelines。
- 在前面提到的 CodePipeline user guide 中阅读更多内容。
我在 AWS 中构建了一个 CodePipeline 运行ning,一切运行良好,只是没有直接来自 CodePipeline 的良好通知机制。仔细研究,似乎公认的解决方案是配置 CloudWatch 以调用 Lambda 或 SNS 来发送您的消息。
好的,所以我构建了一个 Java 小程序来根据 CloudWatch CodePipeline 事件向 Slack 发送消息。它运行良好,只是 每条消息 都重复了六次或更多次。这似乎与我读过的关于重复的 Lambda 执行的所有其他帖子不同,在这些帖子中你偶尔会在这里或那里重复。
我知道标准答案是 Lambda 想要确保交付,因此可以重试事件,这很好 - 如果每 20 条或 100 条消息我收到一个重复消息,我就没事了。但是我不能为每个简单的 CP 运行 用 50 多条消息淹没 Slack 频道。更不用说我假设我会为这些 Lambda 执行中的每一次执行付费,而实际上我应该只得到 4 每个 运行.
我不想设置数据库来跟踪唯一 ID - 这又增加了复杂性和成本(执行仍然发生)。感觉有些东西配置错误。例如。 CloudWatch 是否会出于某种原因获取相同的消息并将其转发给 Lambda?还是 Lambda 认为即使成功退出也需要重试执行的原因?
我猜这取决于您如何配置 CloudWatch 事件侦听器。如果不小心,您将在 CodePipeline 阶段转换或 Action 上触发操作,而不是 CodePipeline 状态更改。从 CodePipeline 用户指南的 Detect and React to Changes in Pipeline State with Amazon CloudWatch Events 章节复制:
您可以配置在状态更改时发送通知:
- Specified pipelines or all your pipelines. You control this by using "detail-type": "CodePipeline Pipeline Execution State Change".
- Specified stages or all your stages, within a specified pipeline or all your pipelines. You control this by using "detail-type": "CodePipeline Stage Execution State Change".
- Specified actions or all actions, within a specified stage or all stages, within a specified pipeline or all your pipelines. You control this by using "detail-type": "CodePipeline Action Execution State Change".
例如,如果您只对 CodePipeline 何时完成感兴趣,您可以将 CloudWatch Events 配置为:
{
"source": [
"aws.codepipeline"
],
"detail-type": [
"CodePipeline Pipeline Execution State Change",
],
"detail": {
"state": [
"SUCCEEDED",
"FAILED",
"CANCELED"
],
"pipeline": [{ "Ref": "myPipeline" }]
}
}
评论:
- 请注意,上面的状态列表中省略了
STARTED
、RESUMED
和SUPERSEDED
(这可能是您喜欢的,也可能不是您喜欢的) - 请注意,执行状态更改 与 阶段执行状态更改 相比具有不同的状态,后者又不同于 动作执行状态改变.
- 省略配置的
pipeline
部分以侦听来自您拥有的所有 CodePipelines 的事件,而不是特定的 CodePipelines。 - 在前面提到的 CodePipeline user guide 中阅读更多内容。