在哪里找到Lambda@Edge的日志?

11
作为我之前遇到的问题的解决步骤之一,我需要查看一些Lambda@Edge的日志,但是我无法在任何地方找到它们。
根据Lambda@Edge的文档
当您在排除错误时查看CloudWatch日志文件或指标时,请注意它们会显示或存储在离函数执行位置最近的区域。因此,例如,如果您有一个面向英国用户的网站或Web应用程序,并且您的分发与Lambda函数相关联,则必须更改区域以查看伦敦AWS区域的CloudWatch指标或日志文件。我要寻找日志的Lambda函数位于us-east-1(由CloudFront指定,因为它用作分发事件处理程序),而我在加拿大,所以我认为最接近的地区应该是ca-central-1。但由于我没有在ca-central-1中开发,所以我在那个地区没有任何日志组。无论如何,我都没有看到我的Lambda@Edge的日志。为了完整起见,我检查了所有区域,但我找不到与lambda函数相关的任何日志痕迹。明确一下,我正在寻找带有Lambda函数名称的日志组。
我确信应该有日志,因为我的代码中有console.log(),而且我可以下载请求的内容(lambda函数负责选择包含内容的S3存储桶),这意味着lambda函数已经成功执行。如果没有成功执行,则我不应该能够获取S3内容。
我在哪里可以找到我的Lambda@Edge函数的日志?
3个回答

26

如果有其他人遇到同样的问题,可以使用文档页面中提到的脚本来查找日志组:

FUNCTION_NAME=function_name_without_qualifiers
for region in $(aws --output text  ec2 describe-regions | cut -f 4) 
do
    for loggroup in $(aws --output text  logs describe-log-groups --log-group-name "/aws/lambda/us-east-1.$FUNCTION_NAME" --region $region --query 'logGroups[].logGroupName')
    do
        echo $region $loggroup
    done
done

创建一个文件,将上述脚本粘贴到文件中,用你的函数名称替换function_name_without_qualifiers,使其可执行并运行。它将为你找到Lambda@Edge的区域和日志组。从这里学到的教训是,日志组不像普通的日志组那样命名,而是遵循以下结构:

/aws/lambda/${region}.${function_name}

2
CloudFront有两层边缘 - 外部的“全球”边缘和内部的“区域”边缘。缓存未命中从全局到区域到源进行处理,而Lambda@Edge函数通常在最靠近查看者的区域边缘中运行和记录日志。测试表明,由于它们靠近加拿大,您应该发现这些通常会转到us-east-1或us-east-2,即使函数实际上是在us-east-1中声明的。它会被复制到所有其他地方。 - Michael - sqlbot
6
注意,describe-regions 命令输出数据的格式已更改,现在需要使用 cut -f 4 命令。 - geoff.weatherall
1
基于以下答案的小脚本:https://github.com/walkermatt/dotbin/blob/50df03e61a81861c863dbbc0b3bf73fdb0ce1a6e/find-lambda-edge-logs - walkermatt
嗨@walkermatt,运行脚本时我遇到以下错误。'不符合支持的格式。调用DescribeLogGroups操作时发生错误(InvalidParameterException):检测到1个验证错误:值'C:/Users/x0120370/AppData/Local/Programs/Git/aws/lambda/sigv4-request-to-s3'在'logGroupNamePrefix'处未能满足约束条件:成员必须满足正则表达式模式:[.-_/#A-Za-z0-9]+。 - Kiran Patil
@KiranPatil 看起来你正在使用WSL,鉴于文件路径,我只在Linux/Bash上进行了测试。我期望脚本应该这样调用:./find-lambda-edge-logs sigv4-request-to-s3 - walkermatt
我在我的区域中发现了日志,这些日志记录了我登录AWS账户的位置。 - Kiran Patil

3

看起来log describe-log-groups的格式也发生了变化。当我尝试运行脚本时,它没有返回任何内容。但是,使用"/aws/lambda/$FUNCTION_NAME"而不是"/aws/lambda/us-east-1.$FUNCTION_NAME",脚本会返回以下结构的组列表:

${region} /aws/lambda/${function_name}

0
最后但并非不重要的是检查Lambda的角色权限。
在我的情况下,这就是问题所在,因为默认情况下它只允许将日志写入一个区域(us-east-1)。
以下是我的策略现在的样子:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:*:{account-id}:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:{account-id}:log-group:/aws/lambda/{function-name}:*"
            ]
        }
    ]
}

{account-id} - 您的 AWS 帐户 ID


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接