AWS-Lambda无法通过Python SDK调用另一个Lambda

AWS-Lambda无法通过Python SDK调用另一个Lambda,python,amazon-web-services,aws-lambda,aws-sdk,aws-api-gateway,Python,Amazon Web Services,Aws Lambda,Aws Sdk,Aws Api Gateway,我正在尝试使用python SDK从另一个lambda调用lambda函数。两个lambda函数都属于同一个VPC。触发器lambda只包含调用第二个lambda(loader_开发)的python脚本。loader_development lambda的APIGateway是私有的,它配置了一个资源策略,拒绝访问不属于该特定VPC的所有IP地址 触发器lambda中的Python脚本是: from __future__ import print_function import json im

我正在尝试使用python SDK从另一个lambda调用lambda函数。两个lambda函数都属于同一个VPC。触发器lambda只包含调用第二个lambda(loader_开发)的python脚本。loader_development lambda的APIGateway是私有的,它配置了一个资源策略,拒绝访问不属于该特定VPC的所有IP地址

触发器lambda中的Python脚本是:

from __future__ import print_function

import json
import logging
import os
from urllib2 import urlopen,Request,HTTPError
import boto3

logger = logging.getLogger()
logger.setLevel(logging.INFO)
region = os.environ['AWS_REGION']

def lambda_handler(event, context):
    invokeLambda = boto3.client('lambda', region_name = 'us-east-1')  
    request = {'resource':'/bucketstatus/latest','path':'/bucketstatus/latest','httpMethod':'GET'}
    invoke_response = invokeLambda.invoke(FunctionName='loader_development',
                                           InvocationType='RequestResponse',
                                           Payload=json.dumps(request))
    print(invoke_response['Payload'].read())

logger.info('Process Complete')
因此,
/bucketstatus/latest
是一个
GET
请求,该端点驻留在loader\u development lambda的APIGateway(私有)中。loader_development lambda是一个spring引导应用程序,而trigger lambda是一个独立的lambda,它只有一个python脚本来调用loader_development lambda的端点以获得响应

在测试该脚本时,它给出500的状态和一个内部服务器错误。 错误:

2019-10-09 10:09:09.279 ERROR 1 --- [ main] c.a.s.proxy.AwsProxyExceptionHandler : Called exception handler for:
com.amazonaws.serverless.exceptions.InvalidRequestEventException: The incoming event is not a valid request from Amazon API Gateway or an Application Load Balancer
10:09:09 at com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader.readRequest(AwsProxyHttpServletRequestReader.java:41)
10:09:09 at com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader.readRequest(AwsProxyHttpServletRequestReader.java:28)
10:09:09 at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:174)
10:09:09 at com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:209)
10:09:09 at com.trimble.roadrunner.StreamLambdaHandler.handleRequest(StreamLambdaHandler.java:49)
10:09:09 at lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
10:09:09 at lambdainternal.AWSLambda.startRuntime(AWSLambda.java:293)
10:09:09 at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:64)
10:09:09 at java.lang.Class.forName0(Native Method)
10:09:09 at java.lang.Class.forName(Class.java:348)
10:09:09 at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)
2019-10-09 10:09:09.279错误1---[main]c.a.s.proxy.AwsProxyExceptionHandler:调用的异常处理程序用于:
com.amazonaws.serverless.exceptions.InvalidRequestEventException:传入事件不是来自Amazon API网关或应用程序负载平衡器的有效请求
10:09:09在com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader.readRequest(AwsProxyHttpServletRequestReader.java:41)
10:09:09在com.amazonaws.serverless.proxy.internal.servlet.AwsProxyHttpServletRequestReader.readRequest(AwsProxyHttpServletRequestReader.java:28)
10:09:09访问com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxy(LambdaContainerHandler.java:174)
10:09:09在com.amazonaws.serverless.proxy.internal.LambdaContainerHandler.proxyStream(LambdaContainerHandler.java:209)
10:09:09在com.trimble.roadrunner.StreamLambdaHandler.handleRequest(StreamLambdaHandler.java:49)
10:09:09在lambdainternal.EventHandlerLoader$2.call(EventHandlerLoader.java:888)
10:09:09在lambdainternal.AWSLambda.startRuntime(AWSLambda.java:293)
10:09:09在lambdainternal.AWSLambda.(AWSLambda.java:64)
10:09:09在java.lang.Class.forName0(本机方法)上
10:09:09在java.lang.Class.forName(Class.java:348)
10:09:09在lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:114)
奇怪的是,当我尝试调用其他lambda(microservice)时,请求得到处理,状态为200。示例lambda也位于VPC内,并具有专用网关


我真的不知道我错过了什么。任何帮助都将不胜感激

W.R.T.GitHub解决方案,我收到此异常,因为我没有在请求对象上包含
requestContext
属性。因此,我将我的请求对象修改为:

request = {'resource': '/bucketstatus/latest', 'path': '/bucketstatus/latest', 'httpMethod': 'GET',
               'requestContext':{'accountId':'821665253511',
                                 'resourceId': '',
                                  'stage': 'development',
                                  'requestId': context.aws_request_id,
                                  'identity': {
                                     'cognitoIdentityPoolId': None,
                                     'accountId': None,
                                     'cognitoIdentityId': None,
                                     'caller': None,
                                     'apiKey': None,
                                     'sourceIp': '',
                                     'cognitoAuthenticationType': None,
                                     'cognitoAuthenticationProvider': None,
                                     "userArn":context.invoked_function_arn
                                  }
                                },
                "apiId": "No need"
               }

更改后,我得到了正确的响应,状态代码为200。

我觉得有效负载很好,你能打印出失败的lambda(或日志或其他东西)的结果吗?嘿!我已经发布了上面的日志错误。这些来自CloudWatch日志本身。Spring Boot应用程序已正确启动,但失败。如果您的VPC没有与之关联的internet网关,您将无法呼叫publicendpoints@LostJon但在我的例子中,APIGateway是私有的,所以端点不是公共的。然后,对了,我在Github中问了同样的问题,解决方案对我有效。