如何从另一个Lambda直接调用一个Chalice Lambda,而无需再次通过API网关和授权程序?

2024-09-25 12:31:39 发布

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

我有两个lambda在API网关后面使用Chalice。所有端点都由Cognito授权者保护

调用GET /hello时,我希望第一个Lambda从第二个Lambda获取数据:

# Lambda1
@app.route('/hello')
def say_hello():
    name = # fetch data from Lambda2
    return Response({'message': 'hello ' + name})

# Lambda2
@app.route('/name')
def a_name():
    return Response({'name': 'GLaDOS'})

此请求不必再次通过API网关+授权程序,因为它会产生不必要的开销

如何直接打这个电话


Tags: lambdanameapiapphello网关returnresponse
1条回答
网友
1楼 · 发布于 2024-09-25 12:31:39

编辑:仅当您出于任何原因无法拥有Internal API Gateway时,我建议使用以下解决方案


使用下面的代码,我可以成功地直接调用另一个Chalice Lambda(无需再次通过API网关+授权程序):

def invoke_sync(lambda_name: str,
                http_method: str,
                path: str,
                claims: dict,
                path_parameters: dict = None,
                http_request_body: str = None,
                query_string_parameters: dict = None,
                headers: dict = None):

    invoke_payload = {
        'path': path,
        'httpMethod': http_method,
        'headers': headers,
        'multiValueHeaders': {},
        'queryStringParameters': query_string_parameters,
        'multiValueQueryStringParameters': None,
        'pathParameters': path_parameters,
        'stageVariables': None,
        'requestContext': {
            'authorizer': {'claims': claims},
            'path': path,
            'resourcePath': path,
            'httpMethod': http_method,
        },
        'body': http_request_body,
    }

    lambda_response = boto3.client('lambda').invoke(FunctionName=lambda_name,
                                                    InvocationType='RequestResponse',
                                                    Payload=json.dumps(invoke_payload))

    payload = json.loads(lambda_response['Payload'].read())
    status_code = payload['statusCode']

    ...

用法示例:

invoke_sync(
    lambda_name='Users',
    claims=<claims-in-the-id-token>,
    http_method='GET',
    path='/users/{userId}',
    path_parameters={'userId': 123}
)

此呼叫是同步的。要创建上述内容的异步版本,请使用InvocationType='Event'作为documented here

请注意,如果使用其他语言或框架,上面使用的负载将完全相同,因为这是从API网关发送到Lambda函数的格式

相关问题 更多 >