33

正如文档中所解释的,我为Viewer Response.

lambda函数代码:

'use strict';

exports.handler = (event, context, callback) => {
    console.log('----EXECUTED------');

    const response = event.Records[0].cf.response;      
    console.log(event.Records[0].cf_response);

    callback(null, response);
};

Viewer Response我已经为事件适当地设置了触发器。

现在当我通过cloudfront发出请求时,它必须登录cloudwatch,但它没有。
如果我做一个简单的Test Lambda Function(使用按钮),它会被正确记录。

这里可能是什么问题?

4

4 回答 4

62

当您部署 Lambda@Edge 函数时,它会使用Lambda Edge 函数的版本副本 部署到全球所有边缘缓存区域。区域边缘缓存是主要 AWS 区域和边缘站点的子集。

当用户请求最近的弹出/边缘时,与边缘缓存区域关联的 lambda将被调用。与这些区域关联的所有 Lambda 日志都将在其边缘缓存区域 CloudWatch日志中。

例如:

如果用户正在点击us-east-1区域,则其关联的日志将位于us-east-1.

要准确了解您的函数在何处(在哪个区域)记录日志,您可以运行此 AWS CLI 脚本:

FUNCTION_NAME=function_name_without_qualifiers
for region in $(aws --output text  ec2 describe-regions | cut -f 3) 
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 的名称。关联

希望能帮助到你。

于 2017-09-30T18:49:34.610 回答
21

对于那些也搜索过日志但使用@Kannaiyan 提供的脚本找不到它们的人。

TL;博士

将此 IAM 角色用于您的 Lambda 函数

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "logs:CreateLogGroup",
        "Resource": "arn:aws:logs:*:*:*"
    },
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:PutLogEvents"
        ],
        "Resource": [
            "arn:aws:logs:*:*:log-group:*:*"
        ]
    }
  ]
}

====

确保您具有正确的 IAM 角色。如果您先创建了 Lambda,然后将其部署到 Lambda@Edge,则自动生成的 IAM 角色将只有足够的权限将单个区域中的数据记录到以 Lambda 函数命名的日志组中,而使用 Lambda@Edge 意味着它将尝试将不同区域的数据记录到“/aws/lambda/”中。日志组。因此,有必要更改 IAM 角色以允许在不同区域创建日志组和写入访问权限。在 TL;DR 部分,我提供了示例 IAM 角色,但请确保缩小对生产中特定日志组列表的访问范围

于 2020-08-13T18:02:56.643 回答
9

根据Lambda@Edge 函数的AWS 文档

当您检查日志文件时,请注意日志文件存储在距离函数执行位置最近的区域中。因此,如果您从伦敦访问网站,则必须更改区域以查看伦敦区域的 CloudWatch Logs。

于 2018-07-17T02:25:45.440 回答
1

继@yevhenii-hordashnyk 的回答之后,如果您使用“无服务器”框架,默认情况下,它会创建一个仅对执行区域具有日志记录权限的 IAM 用户,并将其锁定为应用程序名称(这不适用于 Edge功能,因为它们以已安装功能的区域为前缀,因此需要不同的权限)。

您必须指定一个自定义角色,并按照https://www.serverless.com/framework/docs/providers/aws/guide/iam将该角色应用于您的函数

请注意以下代码段使用*代替- Ref: 'AWS::Region',以及edgelambda.amazonaws.com信任关系中的其他服务。

        AssumeRolePolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Principal:
                Service:
                  - lambda.amazonaws.com
                  - edgelambda.amazonaws.com
              Action: sts:AssumeRole

        Policies:
          - PolicyName: myPolicyName
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow # note that these rights are given in the default policy and are required if you want logs out of your lambda(s)
                  Action:
                    - logs:CreateLogGroup
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                  Resource:
                    - 'Fn::Join':
                      - ':'
                      -
                        - 'arn:aws:logs'
                        - '*'
                        - Ref: 'AWS::AccountId'
                        - 'log-group:/aws/lambda/*:*:*'

By default it does add the `AWSLambdaVPCAccessExecutionRole` policy to the lambda role, but I do not know why it does not create the Log Stream. Maybe I've missed something, but after doing the above, it works now.
于 2021-10-09T07:19:33.603 回答