【问题标题】:Lambda does not trigger SNS event. Chaining AWS lambdas with SNSLambda 不会触发 SNS 事件。使用 SNS 链接 AWS lambda
【发布时间】:2017-12-01 17:21:51
【问题描述】:

我正在使用 AWS 通过让第二个 lambda 订阅第一个 lambda 的 SNS 提要来将 lambda 链接在一起。第二个 lambda 没有收到来自第一个 lambda 的任何信息,而且我在 CloudWatch(或我订阅的我的个人电子邮件)中也没有收到 SNS 事件已触发的通知。所以,我想知道这个问题:如何确保我的 SNS 接收到来自我的 lambda 触发的事件?

当我使用 SNS Web UI 时,我会收到类似的日志,而我的 lambda 日志显示它们已被触摸,但只有在我手动发送消息时。

{
"notification": {
    "messageMD5Sum": "e9a72884afc5d9568f2748e34a4e50a4",
    "messageId": "04f4a199-cd25-5a45-a877-f054df9b2adf",
    "topicArn": "arn:aws:sns:us-east-1:xxxxxxxxxxxx:first-lambda",
    "timestamp": "2017-06-28 02:12:14.098"
},
"delivery": {
    "deliveryId": "173dca7a-7b31-55a2-8ee9-9bb7698f35f6",
    "destination": "arn:aws:lambda:us-east-1:xxxxxxxxxx:function:second-labmda",
    "providerResponse": "{\"lambdaRequestId\":\"33972992-5ba7-11e7-b363-09e0f6dc8594\"}",
    "dwellTimeMs": 134,
    "attempts": 1,
    "statusCode": 202
},
"status": "SUCCESS"

}

我已在其角色中授予了我的 lambda 发布权限,但这仅显示在 IAM 中,当我在 GUI 上查看 lambda 本身内部的策略时,我只看到 lambda 本身的 lambda 触发权限。我也确定我的 SNS 有权写入 lambda,因为当您设置 lambda 时(就像我昨天不止一次那样),它要求您授予 SNS 主题的权限。但是,即使在测试 SNS 主题时,也从未达到 lambda,但如果我使用我的电子邮件帐户订阅,我确实会收到一封电子邮件。

tl;博士 第一个 lambda 应该触发第二个 lambda 订阅的 SNS 事件。 SNS 事件没有从我的第一个 lambda 接收任何数据,除了在半夜从未进入我的第二个 lambda 的两个日志。 如何确保我的 SNS 接收到来自我的 lambda 触发的事件?

【问题讨论】:

  • 能否将第一个 Lambda 使用的代码分享给 publish 某个 SNS 主题?
  • 您是否必须在 lambda 内部显式向 SNS 发送消息?当我创建我的 lambda 时,会在 SNS 中为我​​的 lambda 自动创建一个主题,我认为通过订阅它,我会在每次触发时自动从中获取返回值。
  • 是的。您需要 publish 到您的 FirstLambda 中现有的 SNS 主题。

标签: amazon-web-services aws-lambda


【解决方案1】:

通过向我的 lambda 添加服务来发送消息解决了这个问题。

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.sns.AmazonSNSClient;
import com.amazonaws.services.sns.model.PublishRequest;

public class SNSPublishService {

private static final String ACCESS_KEY = "credential1";
private static final String SECRET_KEY = "credential2";
private static final String ARN = "arn:aws:sns:<region>:<id>:<topicname>";

public static void publish(String body) throws InterruptedException {
    AmazonSNSClient service = new AmazonSNSClient(new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
    PublishRequest publishRequest = new PublishRequest()
            .withTargetArn(ARN)
            .withMessage(body);

    service.publish(publishRequest);
}}

【讨论】:

  • 酷!两个问题:1)你在哪里找到代码?我找到的最好的是gist.github.com/bkizzy/2705156。 2)无论如何使用角色来避免编码凭据。 (或者也许我会把它们放在环境变量中)。哦,我是C#,上面是Java?
  • 抱歉回复晚了。是的,这是 Java。
猜你喜欢
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2015-11-16
  • 2016-12-25
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多