Lambda@Edge не входит в систему по запросу Cloudfront

Как объясняется в Документах, я настроил Lambda@edge для триггера облачного фронта Viewer Response,

Лямбда-код функции:

'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 (используя кнопку), он зарегистрирован правильно.

В чем может быть проблема здесь?

5 ответов

Решение

При развертывании функции Lambda@Edge она развертывается во всех регионах мира со своей версией "Реплика" функции Lambda Edge.

Когда пользователь запрашивает ближайший pop/edge, вызывается лямбда, связанная с ближайшим регионом. Все журналы Lambda, связанные с этими регионами, будут в их региональных журналах облачных часов.

Например,

Если пользователь обращается к региону us-east-1, то связанные с ним журналы будут под us-east-1.

Надеюсь, поможет.

Для тех, кто искал журналы и не смог их найти с помощью скрипта, предоставленного @Kannaiyan.

TL;DR

Используйте эту роль IAM для своей лямбда-функции

{
"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, но не забудьте сузить доступ к конкретному списку групп журналов в производственной среде.

Согласно документации AWS для функций Lambda@Edge:

Когда вы проверяете файлы журналов, имейте в виду, что файлы журналов хранятся в регионе, ближайшем к месту, где выполняется функция. Поэтому, если вы посещаете веб-сайт, например, из Лондона, вы должны изменить регион, чтобы просмотреть журналы CloudWatch для лондонского региона.

Журналы [email protected][защищенные электронной почтой][электронная почта защищена] и регион, в котором был выполнен запрос, доступны в консоли AWS CloudFront, хотя путь запутан, и AWS проделал очень паршивую работу по документированию шагов.

Вот шаги, которые работают на момент публикации:

  1. Перейдите к консоли AWS CloudFront.
  2. Щелкните ссылку «Мониторинг» в разделе «Телеметрия» (не «Журналы», в который передаются журналы CloudFront).
  3. Нажмите на вкладку « ».
  4. Выберите свою лямбда-функцию и нажмите кнопку «Просмотреть показатели».

Затем вы можете использовать график «Вызовы», чтобы определить, в какой области был выполнен конкретный вызов функции Lambda. Когда у вас есть регион, вы можете, наконец, использовать раскрывающееся меню «Просмотр журналов функций», чтобы просмотреть журналы функции Lambda для определенного региона.

Я понял это, долго копаясь в консоли. «Документация» для этого журнала находится здесь , но, похоже, не объясняет, как на самом деле найти журналы для определенного региона.

Если кто-то найдет надлежащую документацию по этому поводу, пожалуйста, обновите сообщение.

Следуя ответу @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.
Другие вопросы по тегам