Я не знаю, как отправить подписанный http-запрос на конечную точку AppSync GraphQL. В AWS нет библиотеки для этого.
aws-amplify не работает, потому что работает только в браузере, а не в функции Lambda.aws-sdk для AppSync предназначен только для использования администратором, у него нет методов для вызова API на стороне пользователя.Можно ли сделать подписанный IAM HTTP-запрос от AWS Lambda? (каким-то простым способом)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать любой клиент 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!
На этот вопрос уже дан ответ, но, поскольку он возник для меня первым, я решил поделиться другим решением.
Мой вариант использования состоял в том, чтобы отправить подписанный запрос в пользовательский 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
}
});
//(...)
Второй пример требует некоторых настроек, чтобы соответствовать вашим требованиям, мне пришлось изменить следующее:
signer декларация - мне пришлось сменить услугу (заменил es на execute-api)signer.addAuthorization мне пришлось использовать AWS.config.credentials (уже инициализированный кодом из первого примера) вместо AWS.EnvironmentCredentials('AWS')Надеюсь, это поможет кому-то!
Обновленная ссылка Backend GraphQL: как запустить мутацию AWS AppSync из AWS Lambda