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 проделал очень паршивую работу по документированию шагов.
Вот шаги, которые работают на момент публикации:
- Перейдите к консоли AWS CloudFront.
- Щелкните ссылку «Мониторинг» в разделе «Телеметрия» (не «Журналы», в который передаются журналы CloudFront).
- Нажмите на вкладку « ».
- Выберите свою лямбда-функцию и нажмите кнопку «Просмотреть показатели».
Затем вы можете использовать график «Вызовы», чтобы определить, в какой области был выполнен конкретный вызов функции 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.