Как интегрировать API Gateway для вызова лямбда-функции с параметром?

#amazon-web-services #aws-lambda #aws-api-gateway #api-gateway

#amazon-web-services #aws-lambda #aws-api-gateway #api-шлюз

Вопрос:

У меня есть приложение react, которое загружает файл в S3. Когда пользователь нажимает кнопку для извлечения текста из файла, приложение вызывает GET to API Gateway и отправляет имя файла в качестве параметра. Это запустит лямбда-функцию для извлечения текста из файла на S3. Но я застрял с API, который должен вызывать лямбда-функцию.

Я следовал этому руководству от AWS: https://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html#api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function

Вот какой ответ я получаю, когда тестирую вызов API:

 Received response. Status: 403, Integration latency: 3 ms
Sun Oct 25 13:29:26 UTC 2020 : Endpoint response headers: {Date=Sun, 25 Oct 2020 13:29:26 GMT, Content-Length=130, Connection=keep-alive, x-amzn-RequestId=d8eab391-05a7-44f2-9721-ce67939a9514}
Sun Oct 25 13:29:26 UTC 2020 : Endpoint response body before transformations: <AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

Sun Oct 25 13:29:26 UTC 2020 : Method response body after transformations: <AccessDeniedException>
  <Message>Unable to determine service/operation name to be authorized</Message>
</AccessDeniedException>

Sun Oct 25 13:29:26 UTC 2020 : Method response headers: {X-Amzn-Trace-Id=Root=1-5f957db6-4e36be9def67f8157b8467c5, Content-Type=application/json}
Sun Oct 25 13:29:26 UTC 2020 : Successfully completed execution
Sun Oct 25 13:29:26 UTC 2020 : Method completed with status: 200
  

В каждом отдельном сообщении, которое я читал об этой ошибке, говорилось, что проблема в том, что мой метод HTTP должен быть POST, НО ЭТО ТАК? Здесь на скриншоте моих настроек:

Скриншот моего запроса на интеграцию с API

Итак, мой вопрос в том, как мне это исправить, чтобы мой API мог вызывать мою лямбда-функцию и возвращать текст обратно в приложение?

Комментарии:

1. Что такое myLambdaRole ?

2. Роль выполнения для лямбда-функции. Он имеет полный доступ к lambda и cloudwatch, а также позволяет вызывать лямбда-функцию

Ответ №1:

AWS Service тип интеграции заключается в интеграции api gateway с любым сервисом AWS. Несмотря на то, что лямбда-это функция AWS, Lambda для этого существует тип интеграции, специально предназначенный для интеграции лямбд. Я думаю, что тип интеграции lambda является подходящим в этом случае.

Вы также можете передать имя файла в запросе GET (например, в качестве параметра строки запроса).

Если вы хотите использовать AWS Service тип интеграции, обязательно добавьте разрешение для api gateway для вызова лямбда-функции. вам необходимо добавить это разрешение в политику доверия роли Lambda IAM.

Комментарии:

1. есть ли какая-либо причина, по которой вы используете AWS Service integration type вместо Lambda integration type

2. Привет, да, причиной использования этого вместо интеграции с лямбдой был тот факт, что AWS сделал это в руководстве, поэтому я предположил, что это будет «более правильно»

3. вы проверили журналы cloudwatch на наличие лямбды, поступает ли туда запрос

4. Удивительные. Я изменил его на лямбда-интеграцию, и это работает. СПАСИБО, Арун!! Вы должны пойти помочь AWS написать лучшие учебные пособия! xD

5. Не беспокойтесь об этом. Единственное, о чем я не могу думать, это то, что роль lambda должна позволять службе api gateway вызывать саму себя, используя политику доверия. можете ли вы опубликовать политику доверия роли IAM для lambda