Как отправить подписанный HTTP-запрос из AWS Lambda в AppSync GraphQL?

Я не знаю, как отправить подписанный http-запрос на конечную точку AppSync GraphQL. В AWS нет библиотеки для этого.

  • aws-amplify не работает, потому что работает только в браузере, а не в функции Lambda.
  • aws-sdk для AppSync предназначен только для использования администратором, у него нет методов для вызова API на стороне пользователя.

Можно ли сделать подписанный IAM HTTP-запрос от AWS Lambda? (каким-то простым способом)

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
7
0
3 095
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать любой клиент graphql или подписанный HTTP-запрос sigv4. Вот как вы создаете подпись для своего запроса (https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html). Если вы прикрепите роль выполнения к своей лямбде, вы можете получить к ней доступ по ключу доступа из переменных среды лямбда (https://docs.aws.amazon.com/lambda/latest/dg/lambda-environment-variables.html).

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

я бы рекомендовал прочитать эту статью: Backend GraphQL: как запустить мутацию AWS AppSync из AWS Lambda,

цитируя автора https://stackoverflow.com/users/1313441/адриан-холл, мы имеем:

GraphQL is routed over HTTPS. That means we can simulate the GraphQL client libraries with a simple HTTPS POST. Since we are using IAM, we need to sign the request before we deliver it. Here is my code for this:

// ... more code here
    // POST the GraphQL mutation to AWS AppSync using a signed connection
    const uri = URL.parse(env.GRAPHQL_API);
    const httpRequest = new AWS.HttpRequest(uri.href, env.REGION);
    httpRequest.headers.host = uri.host;
    httpRequest.headers['Content-Type'] = 'application/json';
    httpRequest.method = 'POST';
    httpRequest.body = JSON.stringify(post_body);

    AWS.config.credentials.get(err => {
        const signer = new AWS.Signers.V4(httpRequest, "appsync", true);
        signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate());

        const options = {
            method: httpRequest.method,
            body: httpRequest.body,
            headers: httpRequest.headers
        };

        fetch(uri.href, options)
// ... more code here

Я использовал его в качестве шаблона для всего моего общения Lambda-> AppSync!

Обновленная ссылка Backend GraphQL: как запустить мутацию AWS AppSync из AWS Lambda

Boris 18.07.2020 05:29

На этот вопрос уже дан ответ, но, поскольку он возник для меня первым, я решил поделиться другим решением.

Мой вариант использования состоял в том, чтобы отправить подписанный запрос в пользовательский HTTP API, размещенный на AWS, где cognito использовался в качестве бэкенда аутентификации, у которого был включен только ALLOW_USER_SRP_AUTH (поэтому нет ни ALLOW_ADMIN_USER_PASSWORD_AUTH, ни ALLOW_USER_PASSWORD_AUTH)

В итоге я объединил этот пример из AWS, показывающий, как выполнять аутентификацию cognito в узле:

С другим примером из AWS, показывающим, как подписать запрос:

Вы подключаете второй пример к первому примеру, заменяя эту строку (из первого примера):

//(...)
        //refreshes credentials using AWS.CognitoIdentity.getCredentialsForIdentity()
        AWS.config.credentials.refresh(error => {
            if (error) {
                console.error(error);
            } else {
                // Instantiate aws sdk service objects now that the credentials have been updated.
                // example: var s3 = new AWS.S3();
                console.info('Successfully logged!'); // <-- replace this line
            }
        });
//(...)

Второй пример требует некоторых настроек, чтобы соответствовать вашим требованиям, мне пришлось изменить следующее:

  • Метод HTTP (мне нужен был GET)
  • signer декларация - мне пришлось сменить услугу (заменил es на execute-api)
  • В signer.addAuthorization мне пришлось использовать AWS.config.credentials (уже инициализированный кодом из первого примера) вместо AWS.EnvironmentCredentials('AWS')

Надеюсь, это поможет кому-то!

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