AWS Тайм-ауты шлюза API - PullRequest
       1

AWS Тайм-ауты шлюза API

2 голосов
/ 19 февраля 2020

Я установил безсерверную среду на AWS, используя lambdas и api gateway. У меня есть сценарий, который вызывается всякий раз, когда кто-то заполняет информацию в контактной форме. Сам скрипт выглядит так:

const rp = require('request-promise')
const sendEmail = require('./sendEmail')

    module.exports.run = async (event, context, callback) => {
      const body = JSON.parse(event.body)
      const { name, email, budget, message, attachment } = body
      if (!name) {
        return callback(null, {
          statusCode: 400,
          body: JSON.stringify({ message: 'Name is required' }),
        })
      }

      if (!email) {
        return callback(null, {
          statusCode: 400,
          body: JSON.stringify({ message: 'Email address is required' }),
        })
      }

      if (!message) {
        return callback(null, {
          statusCode: 400,
          body: JSON.stringify({ message: 'Message is required' }),
        })
      }


      return Promise.all([
        sendEmail({
          to: 'Example <user@example.com>',
          subject: 'Received submission',
          data:
            'Hello'
        }),
        sendEmail({
          to: `${name} <${email}>`,
          subject: 'Subject',
          data:
            'Example text',
        }),

      ])
        .then(() => {
          return callback(null, {
            statusCode: 200,
            headers: {
              'Access-Control-Allow-Origin': '*',
              'Access-Control-Allow-Credentials': true,
            },
            body: JSON.stringify({ message: 'Great success' }),
          })
        })
        .catch(err => {
          return callback(null, {
            statusCode: 500,
            body: JSON.stringify({
              message: 'Oh no :( Message not delivered',
              error: err,
            }),
          })
        })
    }

И это мой класс sendEmail

const AWS = require('aws-sdk')

const ses = new AWS.SES()

module.exports = function({ to, subject, data, replyTo }) {
  return ses
    .sendEmail({
      Destination: { ToAddresses: [to] },
      Message: {
        Body: {
          Text: { Charset: 'UTF-8', Data: data },
        },
        Subject: {
          Data: subject,
          Charset: 'UTF-8',
        },
      },
      Source: 'Example <user@example.com>',
      ReplyToAddresses: [replyTo],
    })
    .promise()
}

Однако он продолжает зависать из-за тайм-аута, который ограничен пятью минутами на стороне aws , я что-то упускаю, что это занимает больше пяти минут?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Проблема заключалась в том, что лямбды были расположены в eu-west-2, в то время как SES была установлена ​​в eu-west-1, что означало, что он не мог связаться с конечной точкой API в eu-west-2 в SES, в результате чего в ответе 500.

0 голосов
/ 19 февраля 2020

Я вижу здесь две проблемы.

  • вы смешиваете обратный вызов и асинхронный c синтаксис лямбды
  • вы смешиваете обещание и асинхронный / ожидающий синтаксис

вы можете просто вернуть вывод вместо использования обратного вызова. Я также изменил синтаксис обещания на async / await.

const sendEmail = require('./sendEmail')

module.exports.run = async (event, context) => {
  const body = JSON.parse(event.body)
  const { name, email, budget, message, attachment } = body
  if (!name) {
    return {
      statusCode: 400,
      body: JSON.stringify({ message: 'Name is required' }),
    }
  }

  if (!email) {
    return {
      statusCode: 400,
      body: JSON.stringify({ message: 'Email address is required' }),
    }
  }

  if (!message) {
    return {
      statusCode: 400,
      body: JSON.stringify({ message: 'Message is required' }),
    }
  }

  try {
    await Promise.all([
      sendEmail({
        to: 'Example <user@example.com>',
        subject: 'Received submission',
        data:
          'Hello'
      }),
      sendEmail({
        to: `${name} <${email}>`,
        subject: 'Subject',
        data:
          'Example text',
      }),

    ]);

    return {
      statusCode: 200,
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Credentials': true,
      },
      body: JSON.stringify({ message: 'Great success' }),
    }
  } catch (err) {
    return {
      statusCode: 500,
      body: JSON.stringify({
        message: 'Oh no :( Message not delivered',
        error: err,
      }),
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...