Вызов функции Lambda из другой функции Lambda постоянно приводит к странной ошибке HTTP 421 Misdirected Request

Я страдаю от странной недокументированной ошибки 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, похоже, вообще не выдает ничего значимого.

Есть ли шанс, что вы передаете в FunctionName странный символ, например \n или %0a (символ новой строки)? Я спрашиваю, потому что мне удалось воспроизвести ту же ошибку, передав ее как FunctionName: FunctionName='autho\n' (autho — это фактическое имя функции, которую я вызываю, \n — это то, что я добавил для воспроизведения ошибки)

andresm53 03.09.2024 23:04

@ andresm53 Andresm53 Ты попал в самую точку! Я «решил» эту проблему ранее сегодня — до того, как заметил ваш комментарий — изменив значение переменной my_lambda_function, присвоенной FunctionName, со значения ARN на просто имя лямбда-функции; но это «решение» на самом деле не имело для меня смысла, потому что в любом случае, согласно официальной документации, все должно быть хорошо. И это действительно так; но — как вы и подозревали — это значение ARN случайно включало в себя завершающий символ новой строки, а версия, содержащая только имя функции, — нет.

Will 04.09.2024 06:00

Во время отладки я вывел значения, используемые в консоль, но не заметил, что символ новой строки фактически вызывает новую строку… Кстати, основная причина заключалась в том, что я объявляю эти значения в файлах конфигурации YAML, но парсер pyyaml, по-видимому, этого не делает. Strip() любые пробелы; с чем я сейчас справился, самостоятельно скопировав все строки. Раздражает, что SDK выдает такую ​​дикую задокументированную ошибку из-за такой глупости, но рад, что нашел причину. В любом случае спасибо @andresm53! Если вы напишете это в качестве ответа, я немедленно приму его!

Will 04.09.2024 06:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось воспроизвести ту же ошибку ClientError: An error occurred (421) when calling the Invoke operation, передав \n в FunctionName:

client.invoke(
  FunctionName='MyOtherFunction\n',
  InvocationType = 'Event'
)

MyOtherFunction — это имя функции, которую я хочу вызвать, а \n — это то, что я добавил, чтобы воспроизвести ошибку.

Поэтому убедитесь, что вы не передаете в FunctionName странные символы, такие как \n или %0a (символ новой строки).

Другие вопросы по теме