AWS SNS - 如何通过发布者Lambda的输出触发订阅者Lambda

6
我有一个lambda函数,用于发送邮件,并在成功发送邮件时返回MessageID作为输出,如果失败则返回错误消息。现在我想创建一个架构,在这个返回的电子邮件状态将保存在SNS主题中。将会有另一个Lambda函数作为订阅者,它将被触发SNS主题的电子邮件状态。例如:如果发布者Lambda返回MessageID,那么订阅者Lambda将返回"yes",对于错误消息将返回"no"。是否可以实现?如果不行,我能做到什么最接近? 我到目前为止所做的事情
  1. 创建了一个SNS主题
  2. 为该主题创建了一个订阅者Lambda函数。在Lambda中添加以下SNS主题的触发器。
  3. 在我现有的Lambda中添加了SNS客户端,我希望将其用作发布者。如果发送邮件成功,则此Lambda返回MessageID。
  4. 向指定的SNS主题发布了一条简单的消息。
以下是订阅者函数的代码,遵循文档:
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        # 'statusCode': 200,
        # 'body': json.dumps('Hello from Lambda!')
         message = json.loads(event['Records'][0]['Sns']['Message']) 
         print("JSON: " + json.dumps(message)) 
         return message
    }

发布消息到SNS主题的代码:

sns_client = boto3.client('sns', aws_access_key_id=AWS_ACCESS_KEY, aws_secret_access_key=AWS_SECRET_KEY, region_name=AWS_REGION)

sns_response = sns_client.publish(
        TopicArn='my-ARN',    
        Message='Hello World',    
    )

架构看起来是正确的。你面临什么问题?有错误信息可以分享吗? - Sébastien Stormacq
@SébastienStormacq 当我运行我的发布者代码时,它显示sns_response。但是我在我的sns中没有看到任何消息,也没有在我的cloudwatch日志中看到任何记录。卡在这里了。 - Proteeti Prova
你能否更新问题,以使清楚你正在寻求什么?此外,你能分享创建该基础架构所使用的CloudFormation模板或CDK代码吗?这将有助于复制。 - Sébastien Stormacq
1个回答

8

我尝试复现您的问题,但没有成功。我使用了Javascript和Typescript,但这不应该是你的问题。

以下是一个用于创建基础设施的CDK代码:

import cdk = require('@aws-cdk/core');

import sns = require('@aws-cdk/aws-sns');
import subs = require('@aws-cdk/aws-sns-subscriptions');

import lambda = require('@aws-cdk/aws-lambda');

export class CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    let fn = new lambda.Function(this, 'SODemoFunction', {
      runtime: lambda.Runtime.NODEJS_10_X,
      code: lambda.Code.asset('./src'),
      handler: 'index.handler'
    });

    const topic = new sns.Topic(this, 'SODemoTopic', {
      displayName: 'StackOverflow Demo'
    });
    topic.addSubscription(new subs.LambdaSubscription(fn));

  }
}

这里是Lambda函数的JavaScript代码。

exports.handler =  async function(event, context) {
    console.log("EVENT: \n" + JSON.stringify(event, null, 2));
    return event['Records'][0]['Sns']['Message']; 
}

我是如何发送信息的:

$ aws sns publish --topic-arn arn:aws:sns:eu-west-1:012345678912:CdkStack-SODemoTopicD9C6180 --message "hello world"
{
    "MessageId": "b73b0141-e7d1-50f0-93ae-54f44cf8bb78"
}

以下是我在CloudWatch日志中看到的内容:

2019-07-27T01:29:13.981Z cc56486b-0a8f-4e7a-a880-1e09d7631b98 INFO EVENT:
{
    "Records": [
        {
            "EventSource": "aws:sns",
            "EventVersion": "1.0",
            "EventSubscriptionArn": "arn:aws:sns:eu-west-1:012345678912:CdkStack-SODemoTopicD9C61805:22d228db-9c3c-488d-84a3-cbdbf5e9d112",
            "Sns": {
                "Type": "Notification",
                "MessageId": "b73b0141-e7d1-50f0-93ae-54f44cf8bb78",
                "TopicArn": "arn:aws:sns:eu-west-1:012345678912:CdkStack-SODemoTopicD9C61805",
                "Subject": null,
                "Message": "hello world",
                "Timestamp": "2019-07-27T01:29:13.862Z",
                "SignatureVersion": "1",
                "Signature": "Xqy8DYPWu+ZFw0hU23C78CTuFB3DblDSrY+vY44sDFMLmuZjM/kaQNvTmHGlLEFcdG3MBQQYWtMc/VQjVXONeIuJr4S336IENPTWylwSNSKHi5kAD93EmDiLl2y3jW2CdsDN9/QwQ5aJQrIkIp91VnWmCx03kUqgzhMdvQ0bsz64EUN6vMpKDZ4oJ6Ug0zTPUwyvcEneMzYkaFISakZZr1SHZYfHp7bfqZVyc2fjOIHhFIyePbMOsGYpQC8CGgD8d2Yekv0f1wYQKn5At4aHWQ29ObyjdsnbYCwlAuej47n1qVwh9li7XKFsRqyqE562Ul7OdLwA1t8tZdYbYh6zjA==",
                "SigningCertUrl": "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-6aad65c2f9911b05cd53efda11f913f9.pem",
                "UnsubscribeUrl": "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:012345678912:CdkStack-SODemoTopicD9C61805:22d228db-9c3c-488d-84a3-cbdbf5e9d112",
                "MessageAttributes": {}
            }
        }
    ]
}

你能否尝试一下?CDK文档在此https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接