使用 AWSCLI 的 AWS Lambda 日志:如何使用 AWSCLI 访问 Lambda 日志?

问题描述 投票:0回答:5

我尝试在 ubuntu ec2 实例上使用 awscli 来使用 AWS Lambda,但我无权访问 aws 控制台。请注意,我没有使用 serverless 或 zapper,我直接将 main.py 文件与依赖文件一起压缩,如here

所述

我像这样运行函数

aws lambda invoke --function-name python-test --invocation-type RequestResponse outfile.txt

输出文件中给出的错误非常模糊,对调试没有帮助,反而让我更加困惑。使用管理员系统,当我在控制台上运行测试时,我能够识别错误,但是如何使用 awscli 检查这些日志?

所以我尝试跑步

aws cloudwatch list-metrics > cloudwatch_logs.log
并在 cloudwatch_logs.log 文件中搜索函数名称“python-test”,我可以找到该函数的
Namespace
MetricName
Dimensions
,但是如何访问日志?

任何有关类似示例链接的帮助都将不胜感激!

amazon-web-services logging aws-lambda aws-cli
5个回答
72
投票

首先获取日志组名称:

aws logs describe-log-groups --query logGroups[*].logGroupName
[
    "/aws/lambda/MyFunction"
]

然后,列出该日志组的日志流

aws logs describe-log-streams --log-group-name '/aws/lambda/MyFunction' --query logStreams[*].logStreamName

[
    "2018/02/07/[$LATEST]140c61ffd59442b7b8405dc91d708fdc"
]

最后,获取该流的日志事件

aws logs get-log-events --log-group-name '/aws/lambda/MyFunction' --log-stream-name '2018/02/07/[$LATEST]140c61ffd59442b7b8405dc91d708fdc'

{
    "nextForwardToken": "f/33851760153448034063427449515194237355552440866456338433", 
    "events": [
        {
            "ingestionTime": 1517965421523, 
            "timestamp": 1517965421526, 
            "message": "START RequestId: bca9c478-0ba2-11e8-81db-4bccfc644168 Version: $LATEST\n"
        }, 
        {
            "ingestionTime": 1517965424581, 
            "timestamp": 1517965424567, 
            "message": "END RequestId: bca9c478-0ba2-11e8-81db-4bccfc644168\n"
        }, 
        {
            "ingestionTime": 1517965424581, 
            "timestamp": 1517965424567, 
            "message": "REPORT RequestId: bca9c478-0ba2-11e8-81db-4bccfc644168\tDuration: 3055.39 ms\tBilled Duration: 3100 ms \tMemory Size: 128 MB\tMax Memory Used: 35 MB\t\n"
        }
    ], 
    "nextBackwardToken": "b/33851760085631457914695824538087252860391482425578356736"
}

10
投票

jq味道:

列出 AWS lambda 组名称(如果列表太大,您可能需要使用 grep 进行过滤):

aws logs describe-log-groups | jq -r ".logGroups[].logGroupName"

然后从最新的流中读取

message
属性:

LOG_GROUP_NAME="/aws/lambda/awesomeFunction"
LOG_STREAM_NAME=$(aws logs describe-log-streams --log-group-name "${LOG_GROUP_NAME}" | jq -r '.logStreams | sort_by(.creationTime) | .[-1].logStreamName')
aws logs get-log-events --log-group-name "${LOG_GROUP_NAME}" --log-stream-name "${LOG_STREAM_NAME}" | jq -r '.events[] | select(has("message")) | .message'

您可能想将其放入

logs.sh
文件中。

如果您想要更多或其他流,您可能需要调整

.logStreams[0]
部分


4
投票

这个班轮调用 lambda 函数并在终端中打印日志:

aws lambda invoke --function-name my-lambda-function --cli-binary-format raw-in-base64-out --payload '{"foo":"bar"}' output.json --log-type Tail --query 'LogResult' --output text | base64 -d
  

2
投票

使用 AWS CLI 可能有点烦人,因为流名称会在您修改函数时发生变化。我发现使用 awslogs (https://github.com/jorgebastida/awslogs) 是一个更好的工作流程。

列出群组:

awslogs groups

过滤结果。

awslogs groups|grep myfunction

然后从组中获取日志。

awslogs get /aws/lambda/ShortenStack-mutationShortenLambdaBC1758AD-6KW0KAD3TYVE

默认为最后5分钟,但您可以添加-s参数来选择时间,例如

-s 10m
为最后10分钟。

如果您在终端,则输出是彩色的;如果您通过其他命令(例如,通过管道传输),则输出是普通的。 grep 来查找一些东西。


0
投票

这是我编写的一个脚本,它使用 jq

 自动执行 
John Rotenstein 的答案

#!/bin/bash

# Usage: ./lambdalogs.sh my-function-name or ./lambdalogs.sh part-of-my-function-name

lambda_regex=$1

log_group=$(aws logs describe-log-groups --query logGroups[*].logGroupName | jq -r --arg pattern "aws/lambda/.*$lambda_regex.*" '.[] | select(. | test($pattern))' | head -n 1)
echo "Using log group $log_group"

log_stream=$(aws logs describe-log-streams --log-group-name $log_group --query 'logStreams[*].logStreamName' --order-by LastEventTime --descend | jq -r '.[0]')
echo "Latest log stream is $log_stream"

aws logs get-log-events --log-group-name $log_group --log-stream-name $log_stream | jq -r '.events | .[] | .timestamp |= (. / 1000 | strftime("%Y-%m-%d %H:%M:%S")) | .timestamp, .message'

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.