【发布时间】:2022-01-13 16:51:59
【问题描述】:
我正在使用无服务器来部署 aws lambda。目前我的设置是 api 网关触发一个 lambda,然后我异步调用另一个 lambda。
serverless.yml
service: scraper
useDotenv: true #added this because deprecation notice
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs14.x
lambdaHashingVersion: 20201021
stage: prod
region: us-east-2
functions:
scraperRunner:
handler: handler.scraperRunner
provisionedConcurrency: 0
timeout: 90
events:
- http:
path: process/run
method: post
async: true
runTargetSite:
handler: handler.runTargetSite
plugins:
- serverless-offline
然后我有一个 handler.js 文件,我在其中定义了两个处理函数:
'use strict';
const startScraper = require('./crawler/runner');
const AWS = require('aws-sdk');
AWS.config.region = 'us-east-2';
const lambda = new AWS.Lambda();
function processResponse(msg, statusCode, event) {
return {
statusCode: statusCode,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
"Access-Control-Allow-Methods": "OPTIONS,POST,GET"
},
body: JSON.stringify({
message: msg,
input: event
})
}
}
module.exports.scraperRunner = async (event) => {
if (event) {
const data = event;
if (data.hasOwnProperty('target_id')) {
const prov = [<array of objects>]
for (const p of prov) {
data['target'] = p.name
const params = {
FunctionName: 'provider-scraper-prod-runTargetSite',
InvocationType: 'Event',
// LogType: 'Tail',
Payload: JSON.stringify(data)
};
await lambda.invoke(params).promise()
}
return processResponse(
'Event successfully received',
200, event)
}
}
return processResponse(
'Invalid body payload',
402, event)
};
module.exports.runTargetSite = async function(event, context) {
await startScraper(event)
return processResponse(
'Event successfully received for runTargetSite',
200, event)
}
我还添加了必要的角色(我认为):
- AWSLambdaExecute
- AWSLambdaBasicExecutionRole
- AWSLambdaRole
- 调用函数
- InvokeAsync
使用命令行,我可以调用第一个 lambda,然后调用第二个:
serverless invoke local --function scraperRunner --data '{"target": "_tpp_"}'
但是,当向 API Gateway 端点提交发布请求时,第一个 lambda (scraperRunner) 会触发,但不会调用第二个。
【问题讨论】:
-
调用实际的 Lambda 而不是本地的会发生什么?
-
第一个 lambda 通过 post 到 api 网关端点执行。第二个没有执行。
-
lambdas 是否在同一个区域?
标签: node.js aws-lambda aws-sdk-js