AWS Lambda Mysql подключение пула шифрование пароля - PullRequest
0 голосов
/ 08 октября 2019

У меня настроена безсерверная среда, и я пытаюсь звонить в базу данных MySQL с пулами соединений mysql. Все прекрасно работает, когда пароль mysql хранится в зашифрованном виде в переменной окружения. Однако, когда я шифрую переменную среды, а затем пытаюсь расшифровать ее с помощью функции, основанной на обещаниях, пул соединений больше не работает. Я переместил пул соединений в функцию обещания, которая обрабатывает мои запросы, и это сработало, но также создает новый пул соединений для каждого запроса, так что это плохо.

var express = require('express')
var bodyParser = require('body-parser')
var awsServerlessExpressMiddleware = require('aws-serverless-express/middleware')
var AWS = require("aws-sdk");
var mysql = require('mysql');

// declare a new express app
var app = express()
app.use(bodyParser.json())
app.use(awsServerlessExpressMiddleware.eventContext())

// Enable CORS for all methods
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next()
});

const kms = new AWS.KMS();
// let decrypted;

function decryptEnvVar(val){
  const p = new Promise((res,reject)=>{
kms.decrypt({ CiphertextBlob: Buffer(val, 'base64') }, (err, data) => {
    if (err) {
                console.log('Decrypt error:', err);
                reject(err);
            }
            var decrypted = data.Plaintext.toString('ascii');

            res(decrypted);
        });
        });
        return p;
// })
}


var pool;
decryptEnvVar('process.env.RDS_PASSWORD').then(decrypt=>{
    pool = mysql.createPool({
                host     : process.env.RDS_TEST_HOSTNAME,
                password : decrypt,
                password: process.env.RDS_TEST_PASSWORD,
                port     : process.env.RDS_PORT,
                database: process.env.RDS_DATABASE
            });
})


function sqlReq(sql){

    const p = new Promise((res,reject)=>{

      pool.getConnection(function(err, connection) {
        console.log('connection');
        if (err){
          console.log(err);
          reject(err); // not connected!
        }
        // Use the connection
        connection.query(sql, function (error, results, fields) {
          // When done with the connection, release it.
          connection.release();

          // Handle error after the release.
          if (error){
             reject(error);
          } 

          // Don't use the connection here, it has been returned to the pool.
          res(results);
        });
      });
      // });

    }).catch(err => {
      return err;
    });
    return p;
}

app.get('/api/some_endpoint', function(req, res){
  var sql = "Some SQL statement";
    sqlReq(sql).then(resp=>{
        res.json({'resp': resp});
  }).catch(err=>{
    res.json({err});
  });
});

This results in no data being passed back to my app.
...