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" }]
  }
}

评论:

  • 请注意,上面的状态列表中省略了 STARTEDRESUMEDSUPERSEDED(这可能是您喜欢的,也可能不是您喜欢的)
  • 请注意,执行状态更改阶段执行状态更改 相比具有不同的状态,后者又不同于 动作执行状态改变.
  • 省略配置的 pipeline 部分以侦听来自您拥有的所有 CodePipelines 的事件,而不是特定的 CodePipelines。
  • 在前面提到的 CodePipeline user guide 中阅读更多内容。