AWS-Lambda无法通过Python SDK调用另一个Lambda
我正在尝试使用python SDK从另一个lambda调用lambda函数。两个lambda函数都属于同一个VPC。触发器lambda只包含调用第二个lambda(loader_开发)的python脚本。loader_development lambda的APIGateway是私有的,它配置了一个资源策略,拒绝访问不属于该特定VPC的所有IP地址 触发器lambda中的Python脚本是: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
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中问了同样的问题,解决方案对我有效。