service:lambda-sns-dlq-error-handlingplugins:-serverless-pseudo-parametersprovider:name:awsruntime:nodejs8.10stage:devregion:eu-central-1memorySize:128environment:accountId:'#{AWS::AccountId}'region:'#{AWS::Region}'iamRoleStatements:-Effect:"Allow"Resource:"*"Action:-"sns:*"functions:init:handler:init.handlerevents:-http:path:initmethod:postcors:truecalculate:handler:calculate.handlerevents:-sns:calculate-topic# created immediatelyonError:arn:aws:sns:#{AWS::Region}:#{AWS::AccountId}:dlq-topicerror:handler:error.handlerevents:-sns:dlq-topic# created immediately
让我们分解一下这里发生了什么。查看functions相关部分。这里有三个函数。从上到下分别是init、calculate和error。该init函数将由一个简单的 HTTP 请求触发,我们通过 API 网关调用该请求。这对我们来说很熟悉。
// init.jsconstaws=require('aws-sdk')constsns=newaws.SNS({region:'eu-central-1'})functiongenerateResponse(code,payload){console.log(payload)return{statusCode:code,body:JSON.stringify(payload)}}functiongenerateError(code,err){console.error(err)returngenerateResponse(code,{message:err.message})}asyncfunctionpublishSnsTopic(data){constparams={Message:JSON.stringify(data),TopicArn:`arn:aws:sns:${process.env.region}:${process.env.accountId}:calculate-topic`}returnsns.publish(params).promise()}module.exports.handler=async (event)=>{constdata=JSON.parse(event.body)if (typeofdata.number!=='number'){returngenerateError(400,newError('Invalid number.'))}try{constmetadata=awaitpublishSnsTopic(data)returngenerateResponse(200,{message:'Successfully added the calculation.',data:metadata})}catch (err){returngenerateError(500,newError('Couldn\'t add the calculation due to an internal error.'))}}
// calculate.jsmodule.exports.handler=async (event)=>{const{number}=JSON.parse(event.Records[0].Sns.Message)constfactorial=(x)=>x===0?1:x*factorial(x-1)constresult=factorial(number)console.log(`The factorial of ${number} is ${result}.`)returnresult}