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

2024-05-16 10:11:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用pythonsdk从另一个lambda调用lambda函数。两个lambda函数属于同一个VPC。触发器lambda只包含一个调用第二个lambda(加载程序开发)的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_development lambda的APIGateway(它是私有的)。loader_development lambda是一个spring引导应用程序,而trigger lambda是一个独立的lambda,它只有一个python脚本来调用loader_development lambda的端点来获取响应。在

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

^{pr2}$

奇怪的是,当我试图调用其他lambda(微服务)时,请求得到处理,状态为200。示例lambda也在VPC内部,并且有一个专用APIGateway。在

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


Tags: lambda函数fromimport脚本loggingloaderlogger
1条回答
网友
1楼 · 发布于 2024-05-16 10:11:37

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。在

相关问题 更多 >