接下来我们就定义 demo 所需要的一切 (关键注释已经写在代码中)
service: name: lambda-sqs-lambda # 定义服务的名称 provider: name: aws # 云服务商为 aws runtime: nodejs12.x # 运行时 node 的版本 region: ap-northeast-1 # 发布到 northeast region,其实就是东京 region stage: dev # 发布环境为 dev iamRoleStatements: # 创建 IAM role,允许 lambda function 向队列发送消息 - Effect: Allow Action: - sqs:SendMessage Resource: - Fn::GetAtt: [ receiverQueue, Arn ] functions: # 定义两个 lambda functions order: handler: app/order.checkout # 第一个 lambda function 程序入口是 app 目录下的 order.js 里面的 checkout 方法 events: # trigger 触发器是 API Gateway 的方式,当接收到 /order 的 POST 请求时触发该 lambda function - http: method: post path: order invoice: handler: app/invoice.generate # 第二个 lambda function 程序入口是 app 目录下的 invoice.js 里面的 generate 方法 timeout: 30 events: # trigger 触发器是 SQS 服务,消息队列有消息时触发该 lambda function 消费消息 - sqs: arn: Fn::GetAtt: - receiverQueue - Arn resources: Resources: receiverQueue: # 定义 SQS 服务,也是 Lambda 需要依赖的服务 Type: AWS::SQS::Queue Properties: QueueName: ${self:custom.conf.queueName} # package: # exclude: # - node_modules/** custom: conf: ${file(conf/config.json)} # 引入外部定义的配置变量config.json 内容仅仅定义了 queue 的名称,只是为了说明配置的灵活性
{ "queueName": "receiverQueue" }因为我们要模拟订单的生成,这里用 UUID 来模拟订单号,
因为我们要调用 AWS 服务API,所以要使用 aws-sdk,
所以要安装这两个 package (这两个理由够充分吗?)
{ "name": "lambda-sqs-lambda", "version": "1.0.0", "description": "demo for lambda", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "license": "MIT", "dependencies": { "uuid": "^8.1.0" }, "devDependencies": { "aws-sdk": "^2.6.15" } }接下来,我们就可以编写两个 Lambda function 的代码逻辑了
Order Lambda Function