在本地无服务器脱机环境中通过SNS消息调用Lambda函数

时间:2018-05-05 11:32:08

标签: amazon-web-services aws-lambda amazon-sns serverless-framework serverless

我正在使用无服务器框架&无服务器离线插件,用于在本地开发无服务器的Web应用程序,并尝试测试以下过程。

  1. 用户按下一个按钮,该按钮将调用API
  2. API将调用Lambda函数,它将向SNS主题发布消息
  3. 将调用订阅SNS主题的几个lambda函数
  4. serverless.yml

    plugins:
      - serverless-offline
      - serverless-offline-sns
    
    functions:
      publisher:
        handler: publisher.main
        events:
          - http:
              path: publish
              method: post
              cors: true
              authorizer: aws_iam
    
      subscriber:
        handler: subscriber.main
        events:
          - sns: test-topic
    

    我在AWS上测试了它并且它有效,但我不知道如何在本地测试它。

    serverless-offline-sns目前不支持lambda订阅。

      

    serverless-offline-sns支持http,https和sqs订阅。目前不支持email,email-json,sms,application和lambda协议。   https://www.npmjs.com/package/serverless-offline-sns

    我认为这是无服务器的一个非常常见的用例。事件驱动的架构。你如何在当地环境中测试这个?

1 个答案:

答案 0 :(得分:0)

我最近能够使用以下代码/配置对此离线进行仿真

serverless.yml

functions:  
  ########## SNS SUBSCRIPTIONS ##########
  newUser:
    memorySize: 128
    timeout: 120
    handler: src/sns-subscribers/newUser.handler
    name: sns-newUser-dev
    events:
      - sns:
          arn: arn:aws:sns:ap-southeast-2:13XXXXXXXXXX:new-user-dev

plugins:
  - serverless-offline-sns
  - serverless-offline

custom:
  serverless-offline-sns:
    port: 4002 # a free port for the sns server to run on
    debug: true
    # host: 0.0.0.0 # Optional, defaults to 127.0.0.1 if not provided to serverless-offline
    # sns-endpoint: http://127.0.0.1:4002 # Optional. Only if you want to use a custom endpoint
    accountId: 13XXXXXXXXXX # Optional

这是触发我的离线lambda的代码

trigger.js

const AWS = require('aws-sdk');

const sns = new AWS.SNS({
  endpoint: 'http://127.0.0.1:4002',
  region: 'ap-southeast-2',
});

sns.publish(
  {
    Message: 'new user!',
    MessageStructure: 'json',
    TopicArn: `arn:aws:sns:ap-southeast-2:13XXXXXXXXXX:new-user-dev`,
  },
  () => console.log('new user published'),
);

正常运行触发器

node trigger.js

注意: 在您的示例中,尚未支持AFAIK声明sns订阅的方式。

events:
  - sns: test-topic # try using ARN and sending this to the next line

您可以选中此Move to Azure Resource Manager REST APIs for Azure SQL Database以获取更多信息和更新。