API Gateway + Lambda:我的打印输出在哪里?

API Gateway + Lambda: where's my print output?

提问人:Joymaker 提问时间:10/18/2023 更新时间:10/18/2023 访问量:32

问:

我正在学习 API 网关。我设置了一个 Lambda 函数作为其中一个路由的实现。我在 Lambda 函数中放置了一些 print 语句,以查看传入的事件对象的确切形式。如果我在 Lambda 屏幕中按下 Test 按钮,它会显示一个简洁的日志,其中包含我的打印语句的输出。但是,如果我按下 API 屏幕中的“测试”按钮,正确设置了测试参数,我会得到一个详细的日志,其中似乎不包括我的打印语句的输出。对于这些调用,如果我在 Cloudwatch 中的相应日志组下查看,我也不会在该日志中看到打印语句的输出。

有什么方法可以获得该输出吗?我需要改用记录器接口吗?我知道我甚至调用相同函数的唯一方法是,当我遇到相同的语法错误时,我得到了相同的语法错误。我的测试代码很简单:

def lambda_handler(event, context):
    print("hello")
    print("hello")
    print(event)
    print("hello")
    print("hello")
    return event

来自 Lambda 的日志:

**Function Logs**
START RequestId: 5a981182-0c07-47ab-9870-a126077a47fb Version: $LATEST
hello
hello
{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
hello
hello
END RequestId: 5a981182-0c07-47ab-9870-a126077a47fb
REPORT RequestId: 5a981182-0c07-47ab-9870-a126077a47fb  Duration: 1.59 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 72 MB  Init Duration: 359.06 ms

API 测试屏幕中的日志:

Execution log for request 9e9fc8df-5865-4511-b98c-170dc200cdbf
Tue Oct 17 21:24:07 UTC 2023 : Starting execution for request: 9e9fc8df-5865-4511-b98c-170dc200cdbf
Tue Oct 17 21:24:07 UTC 2023 : HTTP Method: POST, Resource Path: /blast-jobs
Tue Oct 17 21:24:07 UTC 2023 : Method request path: {}
Tue Oct 17 21:24:07 UTC 2023 : Method request query string: {id=12543}
Tue Oct 17 21:24:07 UTC 2023 : Method request headers: {}
Tue Oct 17 21:24:07 UTC 2023 : Method request body before transformations: 
Tue Oct 17 21:24:07 UTC 2023 : Endpoint request URI: https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:680678151940:function:blast-job-create/invocations
Tue Oct 17 21:24:07 UTC 2023 : Endpoint request headers: {x-amzn-lambda-integration-tag=9e9fc8df-5865-4511-b98c-170dc200cdbf, Authorization=***********************************************************************************************************************************************************************************************************************************************************************************************************5b1b40, X-Amz-Date=20231017T212407Z, x-amzn-apigateway-api-id=z7p03y8fsl, X-Amz-Source-Arn=arn:aws:execute-api:us-west-2:680678151940:z7p03y8fsl/test-invoke-stage/POST/blast-jobs, Accept=application/json, User-Agent=AmazonAPIGateway_z7p03y8fsl, X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHwaCXVzLXdlc3QtMiJGMEQCIFAlRNi2qWdb/t4Ns7aPhBEL4xS8S+RNosv3YDwwPZ62AiBtBEDMynu2sHifcWuRMp1ENJkn0Lw6A4NpHc+kiCPjiCq5BQiV//////////8BEAUaDDEwOTM1MTMwOTQwNyIM0aToxb8NiSJg8PjnKo0FV/S77p/giiwY1oGpDmFGbblLZN1SiE5M4XQr7DmilAwgielGxojWaFxi84R7A3W+0wcuB4kDcLomVgp2I+K4T3BdTqytzi+fr41UvYkVdfrzEjymAWrR+JtzgFjSaD+3W7cX3Mfl+0W/uj0YVQ9P+TUTOsu5Wk [TRUNCATED]
Tue Oct 17 21:24:07 UTC 2023 : Endpoint request body after transformations: 
Tue Oct 17 21:24:07 UTC 2023 : Sending request to https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:680678151940:function:blast-job-create/invocations
Tue Oct 17 21:24:08 UTC 2023 : Received response. Status: 200, Integration latency: 513 ms
Tue Oct 17 21:24:08 UTC 2023 : Endpoint response headers: {Date=Tue, 17 Oct 2023 21:24:08 GMT, Content-Type=application/json, Content-Length=2, Connection=keep-alive, x-amzn-RequestId=f7561b7d-f61e-4b8d-b55b-9cf1b77f819a, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-652efb77-e9cf5f6c51fdabede9c58813;sampled=0;lineage=1dc83a0a:0}
Tue Oct 17 21:24:08 UTC 2023 : Endpoint response body before transformations: {}
Tue Oct 17 21:24:08 UTC 2023 : Method response body after transformations: {}
Tue Oct 17 21:24:08 UTC 2023 : Method response headers: {X-Amzn-Trace-Id=Root=1-652efb77-e9cf5f6c51fdabede9c58813;Sampled=0;lineage=1dc83a0a:0, Content-Type=application/json}
Tue Oct 17 21:24:08 UTC 2023 : Successfully completed execution
Tue Oct 17 21:24:08 UTC 2023 : Method completed with status: 200
aws-lambda aws-api-gateway amazon-cloudwatchlogs

评论


答:

1赞 Quassnoi 10/18/2023 #1

API Gateway 集成(接收请求并返回响应的事物)是 API Gateway 的黑匣子。除了通过HTTP流输出的内容外,它无法看到那里发生的任何事情。

另一方面,Lambda 侦听运行时容器 stdout 并将其转换为 CloudWatch 事件,每行一个。除非您明确拒绝了 Lambda 运行角色的 CloudWatch 权限,否则您的所有打印语句都应位于 CloudWatch 中。

对于这些调用,如果我在 Cloudwatch 中的相应日志组下查看,我也不会在该日志中看到打印语句的输出。

“适当的日志组”是 Lambda 函数日志组还是 API Gateway 日志组?您的打印报表应该在前者中,而不是后者。如果它们不存在,您应该检查 Lambda 函数的权限。

0赞 Joymaker 10/18/2023 #2

我不确定出了什么问题,但对另一个问题的回答给了我真正需要的东西。查看正确、最新日志的简单方法。这是我的那个脚本版本:

LOG_GROUP=/aws/lambda/$1
LOG_STREAM=`aws logs describe-log-streams --log-group-name $LOG_GROUP --max-items 1 --order-by LastEventTime --descending --query logStreams[].logStreamName --output text | head -n 1`

aws logs get-log-events --log-group-name $LOG_GROUP --log-stream-name $LOG_STREAM --query events[].message --output text