AWS lambda sql соединение работает отлично с первого раза, затем возвращает 403 для каждого другого запроса - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь подключиться к серверу SQL, размещенному на AWS. Когда я повторно внедряю приложение без сервера или запускаю функциональный тест в лямбда-консоли, все работает отлично (все функции возвращают ожидаемые результаты). Однако, когда я вызываю эту функцию с веб-сайта, она работает только в первый раз. Каждый звонок после этого возвращает 403 запрещенных. Я развертываю код, используя serverless deploy. Я попытался:

  1. переписать мой метод с помощью try-catch
  2. повторное развертывание функции (работает только в первый раз)
  3. закомментировал весь код другой функции (такничто другое не может выдать ошибку)
  4. жестко запрограммировал передачу в мою функцию авторизации (поэтому любой запрос работает)
  5. подтвердил, что токен отправлялся с каждым запросом от angular
  6. Подтвержденоимя пользователя и пароль были правильными в SQL (при запуске в лямбда-тесте)
  7. пошагово прошел по коду и разместил операторы return в разных точках - не имеет значения, откуда я возвращаюсь (даже первая строка метода)эта проблема

Ничто не может исправить это. Любые идеи о том, что я должен попробовать дальше?

Глобальные переменные

'use strict';
const AWS = require('aws-sdk');
const S3 = new AWS.S3();
const sql = require("mssql");

const ftp = require("basic-ftp")

//const fs = require("fs")

var version = '1.1.2'

var config = {
  user: 'ssssss',
  password: 'xxxxx',
  server: 'XXXX.rds.amazonaws.com',
  database: 'SA'
};

module.exports.rdsquery = async (event) => {
  //return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('rdsquery check') };
  try {
    let db;
    let tablequery;
    //return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('rdsquery check2') };

    try {
      console.log('--called rdsquery ' + version)// with body: '+JSON.stringify(event))

      //event = JSON.parse(event).body
      console.log('parsing params')
      db = 'SA'//event.db
      tablequery = 'select top(1) * from SA..Customer'//event.table

      //return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('db: ' + db + ' query: ' + tablequery) };


      if (!db || !tablequery)
        return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('cant parse event') };

      //console.log('aws db: ' + db + ' query: ' + tablequery.substring(0, 50) + '...')

    }
    catch (e) {
      return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('rdsquery top half err: ' + e) };
    }

    //return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('db: ' + db + ' query: ' + tablequery) };

    try {
      if (db != 'SA')
        throw ('DB mismatch. no config found')

      console.log('about to connect to sql pool')
      let pool=null;
      try{await sql.close();}catch{}

      if(!pool)
        pool = await sql.connect(config);

      //connection pool error handling
      pool.on( "error", async err => {
          console.log( [ "error", "data" ], "connection pool error" );
          console.log( [ "error", "data" ], err );
          try{await pool.close();}catch{pool=null;}
          return { statusCode: 500, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('conn pool failed') };
        } 
      );
      //return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('conn to pool') };

      console.log('sending query')
      const result = await pool.request().query(tablequery);
      //console.log('result: '+JSON.stringify(result.recordset))
      pool.close();
      console.log('pool closed')
      return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify(result.recordset) };
    }
    catch (e) {
      console.log('rdsquery-catch bott: ' + e)
      return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('rdsquery error bottom half: ' + e) };
    }
  } 
  catch (e) {
    return { statusCode: 200, headers: { 'Access-Control-Allow-Origin': '*' }, body: JSON.stringify('rdsquery error global: ' + e) };
  }
};
...