提问人:Joymaker 提问时间:10/18/2023 更新时间:10/18/2023 访问量:32
API Gateway + Lambda:我的打印输出在哪里?
API Gateway + Lambda: where's my print output?
问:
我正在学习 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
答:
API Gateway 集成(接收请求并返回响应的事物)是 API Gateway 的黑匣子。除了通过HTTP流输出的内容外,它无法看到那里发生的任何事情。
另一方面,Lambda 侦听运行时容器 stdout 并将其转换为 CloudWatch 事件,每行一个。除非您明确拒绝了 Lambda 运行角色的 CloudWatch 权限,否则您的所有打印语句都应位于 CloudWatch 中。
对于这些调用,如果我在 Cloudwatch 中的相应日志组下查看,我也不会在该日志中看到打印语句的输出。
“适当的日志组”是 Lambda 函数日志组还是 API Gateway 日志组?您的打印报表应该在前者中,而不是后者。如果它们不存在,您应该检查 Lambda 函数的权限。
我不确定出了什么问题,但对另一个问题的回答给了我真正需要的东西。查看正确、最新日志的简单方法。这是我的那个脚本版本:
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
评论