Created
February 25, 2020 20:39
-
-
Save btbytes/cf1a1e4a90582924833f4d0a15acc1e9 to your computer and use it in GitHub Desktop.
using-amazon-rds-proxy-with-aws-lambda
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// from https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/ | |
let AWS = require('aws-sdk'); | |
var mysql2 = require('mysql2'); //https://www.npmjs.com/package/mysql2 | |
let fs = require('fs'); | |
let connection; | |
exports.handler = async(event) => { | |
const promise = new Promise(function(resolve, reject) { | |
console.log("Starting query ...\n"); | |
console.log("Running iam auth ...\n"); | |
// | |
var signer = new AWS.RDS.Signer({ | |
region: '[insert your region here]', // example: us-east-2 | |
hostname: '[insert your RDS Proxy endpoint here]', | |
port: 3306, | |
username: '[Your RDS User name]' | |
}); | |
let token = signer.getAuthToken({ | |
username: '[Your RDS User name]' | |
}); | |
console.log ("IAM Token obtained\n"); | |
let connectionConfig = { | |
host: process.env['endpoint'], // Store your endpoint as an env var | |
user: '[Your RDS User name]', | |
database: process.env['my_db'], // Store your DB schema name as an env var | |
ssl: { rejectUnauthorized: false}, | |
password: token, | |
authSwitchHandler: function ({pluginName, pluginData}, cb) { | |
console.log("Setting new auth handler."); | |
} | |
}; | |
// Adding the mysql_clear_password handler | |
connectionConfig.authSwitchHandler = (data, cb) => { | |
if (data.pluginName === 'mysql_clear_password') { | |
// See https://dev.mysql.com/doc/internals/en/clear-text-authentication.html | |
console.log("pluginName: "+data.pluginName); | |
let password = token + '\0'; | |
let buffer = Buffer.from(password); | |
cb(null, password); | |
} | |
}; | |
connection = mysql2.createConnection(connectionConfig); | |
connection.connect(function(err) { | |
if (err) { | |
console.log('error connecting: ' + err.stack); | |
return; | |
} | |
console.log('connected as id ' + connection.threadId + "\n"); | |
}); | |
connection.query("SELECT * FROM contacts", function (error, results, fields) { | |
if (error){ | |
//throw error; | |
reject ("ERROR " + error); | |
} | |
if(results.length > 0){ | |
let result = results[0].email + ' ' + results[0].firstname + ' ' + results[0].lastname; | |
console.log(result); | |
let response = { | |
"statusCode": 200, | |
"statusDescription": "200 OK", | |
"isBase64Encoded": false, | |
"headers":{ | |
"Content-Type": "text/html" | |
}, | |
body: result, | |
}; | |
connection.end(function(error, results) { | |
if(error){ | |
//return "error"; | |
reject ("ERROR"); | |
} | |
// The connection is terminated now | |
console.log("Connection ended\n"); | |
resolve(response); | |
}); | |
} | |
}); | |
}); | |
return promise; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment