【问题标题】:Edit AWS SNS message sent to Lambda编辑发送到 Lambda 的 AWS SNS 消息
【发布时间】:2021-12-01 20:30:03
【问题描述】:

在我的管道中,我在 S3 存储桶上有一个触发 SNS 主题的事件通知。该 SNS 主题又订阅了一个 lambda 函数。我需要 SNS 主题将硬编码的消息正文发送到 lambda,因为它在该函数中使用。 由于 SNS 主题会在 S3 事件通知触发时自动发布消息,我想知道是否以及如何编辑发送到 lambda 的消息?

明确一点:我希望每次都发送相同的消息。目标是让 lambda 获得一个变量,该变量仅取决于触发 lambda 的主题。

目前我正在通过 UI 构建它,但最终会在 terraform 中对其进行编码以用于生产。

【问题讨论】:

  • 我觉得不太可能,因为S3之间的整合 SNS基本上就是把事件从S3发送到SNS,不能改变消息。因此,如果您在 ObjectCreated 上设置了一个事件,它将发送:“创建了一个对象”,对于 ObjectRemoved 等也是如此。但是您可以在 lambda 中轻松忽略它,SNS 将触发 lambda 但您不需要阅读邮件中的内容。
  • 因此,虽然我们无法更改 S3 发送到 SNS 的消息,但有没有办法可以预先定义每次主题发布时从 SNS 发送到 lambda 的消息?还是仅限于“转发”来自 S3 事件通知的消息?

标签: amazon-web-services amazon-s3 aws-lambda amazon-sns


【解决方案1】:

当 Amazon SNS 触发 AWS Lambda 函数时,它发送的信息包括 SNS TopicArn

您可以使用该 ARN 来确定哪个 SNS 主题触发了 Lambda 函数,因此它应该处理哪个操作。

{
  "Records": [
    {
      "EventSource": "aws:sns",
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:us-east-1:{{{accountId}}}:ExampleTopic",
      "Sns": {
        "Type": "Notification",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "TopicArn": "arn:aws:sns:us-east-1:123456789012:ExampleTopic",
        "Subject": "example subject",
        "Message": "example message",
        "Timestamp": "1970-01-01T00:00:00.000Z",
        "SignatureVersion": "1",
        "Signature": "EXAMPLE",
        "SigningCertUrl": "EXAMPLE",
        "UnsubscribeUrl": "EXAMPLE",
        "MessageAttributes": {
          "Test": {
            "Type": "String",
            "Value": "TestString"
          },
          "TestBinary": {
            "Type": "Binary",
            "Value": "TestBinary"
          }
        }
      }
    }
  ]
}

【讨论】:

  • lambda 函数正在启动胶水作业。粘合作业取决于触发 lambda 的主题。与其在 lambda 中编写从主题到胶水函数的映射,我更愿意在来自 SNS 的消息中传递胶水作业名称。这样,新主题和粘合作业不需要更改 lambda 函数。我的想法是将消息:“示例消息”设置为消息:“”。这可能吗?
【解决方案2】:

除了让 Amazon S3 直接向 Amazon SNS 发送消息之外,您可能能够配置一个 Amazon CloudWatch Events 规则,该规则在对象创建时触发并发送 strong>常量作为发送给 Amazon SNS 的消息的一部分,如下所示:

如果正在上传大文件,您可能还需要在CompleteMultipartUpload 上触发它。\

您也可以让规则直接触发 AWS Lambda 函数(不通过 Amazon SNS),具体取决于您的使用案例。也可以为此指定一个常量。

【讨论】:

  • 这个常量看起来是一个很有前途的选择。为了使其工作,我必须能够根据触发事件的文件定义不同的常量(类似于 s3 事件通知前缀和后缀)。我没有看到获得该粒度的选项。它存在于某个地方吗?
  • 这听起来像是 AWS Lambda 函数中的逻辑用例。您也许可以使用Input Transformer,它可以在JSON 中转换数据,但它似乎不提供任何逻辑(例如if 语句)。
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2021-01-22
  • 2023-03-18
  • 2016-03-16
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多