Я страдаю от странной недокументированной ошибки HTTP 421 Misdirected Request при попытке вызвать функции Lambda из других функций Lambda через Python/boto3 (с InvocationType = 'Event'
), например:
lambda_client.invoke(
FunctionName = my_lambda_function,
Payload = json.dumps('{'foo': 'bar'}),
InvocationType = 'Event'
)
Выданная ошибка:
botocore.exceptions.ClientError: An error occurred (421) when calling the Invoke operation:
(За двоеточием ничего не напечатано.)
Я полагаю, что мое разрешение Lambda тоже в порядке, как показано ниже?
Роль исполнения:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Политика роли выполнения (встроенная):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:MY_AWS_REGION:MY_AWS_ACCOUNT_ID:function:MY_LAMBDA_FUNCTION_NAME"
]
}
]
}
У кого-нибудь есть идеи?
https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html перечисляет множество возможных кодов ошибок, но они не содержат никаких упоминаний о HTTP 421
или Misdirected Request
. Хуже того, поиск в Google "421" Lambda invoke
, похоже, вообще не выдает ничего значимого.
@ andresm53 Andresm53 Ты попал в самую точку! Я «решил» эту проблему ранее сегодня — до того, как заметил ваш комментарий — изменив значение переменной my_lambda_function
, присвоенной FunctionName
, со значения ARN на просто имя лямбда-функции; но это «решение» на самом деле не имело для меня смысла, потому что в любом случае, согласно официальной документации, все должно быть хорошо. И это действительно так; но — как вы и подозревали — это значение ARN случайно включало в себя завершающий символ новой строки, а версия, содержащая только имя функции, — нет.
Во время отладки я вывел значения, используемые в консоль, но не заметил, что символ новой строки фактически вызывает новую строку… Кстати, основная причина заключалась в том, что я объявляю эти значения в файлах конфигурации YAML, но парсер pyyaml, по-видимому, этого не делает. Strip() любые пробелы; с чем я сейчас справился, самостоятельно скопировав все строки. Раздражает, что SDK выдает такую дикую задокументированную ошибку из-за такой глупости, но рад, что нашел причину. В любом случае спасибо @andresm53! Если вы напишете это в качестве ответа, я немедленно приму его!
Мне удалось воспроизвести ту же ошибку ClientError: An error occurred (421) when calling the Invoke operation
, передав \n
в FunctionName
:
client.invoke(
FunctionName='MyOtherFunction\n',
InvocationType = 'Event'
)
MyOtherFunction
— это имя функции, которую я хочу вызвать, а \n
— это то, что я добавил, чтобы воспроизвести ошибку.
Поэтому убедитесь, что вы не передаете в FunctionName
странные символы, такие как \n
или %0a
(символ новой строки).
Есть ли шанс, что вы передаете в FunctionName странный символ, например \n или %0a (символ новой строки)? Я спрашиваю, потому что мне удалось воспроизвести ту же ошибку, передав ее как FunctionName: FunctionName='autho\n' (autho — это фактическое имя функции, которую я вызываю, \n — это то, что я добавил для воспроизведения ошибки)