【问题标题】:Unable to invoke a lambda from another lambda using aws serverless offline无法使用 aws serverless 离线从另一个 lambda 调用 lambda
【发布时间】:2019-11-06 17:17:17
【问题描述】:

我想从 serverless-offline 中的另一个 lambda 调用一个 lambda。我想做一个无服务器的离线 Web 应用程序。但是我收到了这个错误:

{ UnknownError: 不支持的媒体类型 在 Object.extractError (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\protocol\json.js:51:27) 在 Request.extractError (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\protocol\rest_json.js:55:8) 在 Request.callListeners (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:106:20) 在 Request.emit (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:78:10) 在 Request.emit (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:683:14) 在 Request.transition (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:22:10) 在 AcceptorStateMachine.runTo (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\state_machine.js:14:12) 在 C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\state_machine.js:26:10 在请求。 (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:38:9) 在请求。 (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:685:12) 在 Request.callListeners (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:116:18) 在 Request.emit (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:78:10) 在 Request.emit (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:683:14) 在 Request.transition (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:22:10) 在 AcceptorStateMachine.runTo (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\state_machine.js:14:12) 在 C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\state_machine.js:26:10 在请求。 (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:38:9) 在请求。 (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\request.js:685:12) 在 Request.callListeners (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:116:18) 在 callNextListener (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\sequential_executor.js:96:12) 在 IncomingMessage.onEnd (C:\Users\gourabkonar\Desktop\sls-demo\node_modules\aws-sdk\lib\event_listeners.js:307:13) 在 IncomingMessage.emit (events.js:203:15) 在 IncomingMessage.EventEmitter.emit (domain.js:448:20) 在 endReadableNT (_stream_readable.js:1129:12) 在 process._tickCallback (internal/process/next_tick.js:63:19) 消息:'不支持的媒体类型', 代码:'未知错误', 时间:2019-11-06T17:02:27.641Z, requestId:未定义, 状态码:415, 可重试:假, 重试延迟:6.643720301281952 }


sls-api-dev-create

   const jobs=[
    { id: 1,title: 'NodeJS Developer'},
    {id: 2, title:'Angular Developer'}
];


var AWS = require('aws-sdk');
AWS.config.region = 'ap-southeast-2';

let lambda = new AWS.Lambda({
    region: 'ap-south-1',
    endpoint: 'http://localhost:3000/jobs'
})
module.exports.handler=async(evt,ctx)=>{

    console.log(evt.body);
    jobs.push(JSON.parse(evt.body));

    lambda.invoke({
        FunctionName: 'sls-api-dev-hello',
        InvocationType: 'Event',
        Payload:null    
    },function(err,data){
        console.log('No error');
        if(!err)
        console.log(data);
        else
        console.log(err);

    })
    //console.log(response);
    return {
        statusCode :200,
        body:JSON.stringify({
            jobs
        })
    }
}

sls-api-dev-hello

'use strict';

module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Welcome to Serverless',
        input: event,
      },
      null,
      2
    ),
  };

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
};

serverless.yml

service: sls-api



provider:
  name: aws
  runtime: nodejs10.x
  region: ap-south-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - lambda: InvokeFunction
        - lambda: InvokeAysnc
      Resource: "*"

plugins:
  - serverless-offline
  - serverless-offline-lambda

functions:
  hello:
    handler: handler.hello
  jobs:
    handler: src/jobs/handler.handler
  listJobs:
    handler: src/jobs/list.handler
    events:
      - http:
          method: GET
          path: /jobs
  createJobs:
    handler: src/jobs/create.handler
    environment:
      SOME_VARIABLE: http://localhost:3000/jobs
    events:
      - http:
          method: POST
          path: /jobs
  getJob:
    handler: src/jobs/findOne.handler
    events:
      - http:
          method: GET
          path: /jobs/{id}
          request:
            parameters:
              id: true

请帮忙,任何帮助都会很棒,因为我是无服务器的新手。在此先感谢。

【问题讨论】:

标签: amazon-web-services aws-lambda serverless aws-serverless serverless-offline


【解决方案1】:

您应该在此处更改的只是 lambda 实例配置中的 endpoint 指向基本 serverless-offline url。 此外,您根本不需要使用 serverless-offline-lambda pluing。

将 Lambda 选项更改为以下内容:

const lambda = new AWS.Lambda({
  region: "ap-south-1",
  endpoint: process.env.IS_OFFLINE ? "http://localhost:3000" : "https://lambda.ap-south-1.amazonaws.com",
});

另外,这是什么意思

process.env.IS_OFFLINE

? 意味着您使用 serverless-offline 插件在本地运行 lambda,该插件实际上设置了这个 env 变量。

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 2016-12-31
    • 1970-01-01
    • 2020-02-06
    • 2019-09-23
    • 2021-11-04
    • 1970-01-01
    • 2020-03-23
    • 2018-06-09
    相关资源
    最近更新 更多