Вызвать лямбда-функцию из приложения React, сгенерированного Amplify, без использования API-шлюза - PullRequest
1 голос
/ 13 мая 2019

Я использовал Усиление для создания статического веб-сайта и базового приложения React.Сначала я также сгенерировал конечную точку API, но, поскольку моя лямбда-функция может работать с превышением лимита времени ожидания шлюза API (29 секунд), мне нужно вызывать лямбда-функцию непосредственно из сгенерированного приложения React, а не через API-шлюз.

Для проверки подлинности страницы React с использованием Cognito код выглядит следующим образом:

import Auth from '@aws-amplify/auth';
import { withAuthenticator } from 'aws-amplify-react';
import awsconfig from './aws-exports';

Auth.configure(awsconfig);

Приведенные выше строки обертывают объект App (корневой) и работают так, как объявлено.Но поскольку я не хочу использовать API-шлюз, как мне вызвать функцию AWS Lambda непосредственно из React App?

Ответы Я мог бы поговорить об импорте AWS и т. Д., Что, похоже, противоречит тому, что мы пытаемся сделать здесь.Мне нужно использовать аутентифицированное соединение (которое уже работает с использованием приведенного выше кода) при вызове лямбды, поэтому я не могу использовать общий вызов, приведенный в этом примере.

API-интерфейс Invoke также не предоставляет никаких примеров.

Любой совет приветствуется.

1 Ответ

3 голосов
/ 13 мая 2019

Примечание: если вам не нужен ответ после длительной работы лямбды, рассмотрите Асинхронный вызов шлюзов API

Амплификация вызывает этот подход «работа с сервисными объектами» .

Для этого вам необходимо убедиться, что роль, которую Cognito предоставляет вашим аутентифицированным пользователям, включает разрешения для lambda:invoke, а также любые дополнительные разрешения, необходимые для функции.Я предполагаю, что вы можете сделать это сейчас, однако вы можете просмотреть документацию Управление доступом на основе ролей или задать другой вопрос, если нет.

Для доступа к этим ролям в Amplify вам нужноиспользовать функцию Auth.currentCredentials, которая возвращает обещание с объектом credentials, который затем можно использовать на клиенте aws-sdk.

Например:

import Auth from '@aws-amplify/auth';
import Lambda from 'aws-sdk/clients/lambda'; // npm install aws-sdk

Auth.currentCredentials()
  .then(credentials => {
    const lambda = new Lambda({
      credentials: Auth.essentialCredentials(credentials)
    });
    return lambda.invoke({
      FunctionName: 'my-function',
      Payload: JSON.stringify({ hello: world }),
    });
  })

Youполную документацию по вызову лямбды можно найти в документации по JavaScript AWS-SDK .

Однако вы должны помнить , что полезная нагрузка из API Gateway создается AWS исодержит гораздо больше информации, чем просто тело, с которым была вызвана конечная точка, однако при непосредственном вызове вы получите только полезную нагрузку, поэтому вам придется соответствующим образом построить этот объект.

...