Как и многие люди, я обновил свой сертификат Amazon RDS до CA_2019 с CA_2015.
Сначала все казалось хорошо, но позже, проверяя, я заметил, что лямбда-функция mysql, которую я написал для запроса базы данных, больше не работает.
Лямбда использует nodejs 8.10
я получаю следующую ошибку:
{
"errorMessage": "unable to get local issuer certificate",
"errorType": "Error",
"stackTrace": [
"TLSSocket.<anonymous> (/var/task/node_modules/mysql2/lib/connection.js:383:46)",
"emitNone (events.js:106:13)",
"TLSSocket.emit (events.js:208:7)",
"TLSSocket._finishInit (_tls_wrap.js:639:8)",
"TLSWrap.ssl.onhandshakedone (_tls_wrap.js:469:38)"
]
}
Когда я возвращаю изменения обратно к CA_2015, он работает ..
При написании лямбда-функции я не ставил никаких сертификатов и прочего ..
'use strict'
const AWS = require('aws-sdk')
const mysql = require('mysql2')
var dbPort = 3306
var dbUsername = 'enactor_lambda'
var dbName = 'rds_db_test'
var readerEndpoint = process.env.READER_ENDPOINT
var region = process.env.REGION
var topicArn = process.env.TOPIC_ARN
var alertBucket = process.env.ALERT_BUCKET
var queueThreshold = process.env.QUEUE_THRESHOLD
var pendingThreshold = process.env.PENDING_THRESHOLD
AWS.config.update({region: region})
var sns = new AWS.SNS()
var s3 = new AWS.S3()
var cloudwatch = new AWS.CloudWatch()
exports.handler = function (event, context, cb) {
var signer = new AWS.RDS.Signer()
signer.getAuthToken({
region: region,
hostname: readerEndpoint,
port: dbPort,
username: dbUsername
}, function (err, token) {
if (err) {
console.log(`Unable to retrieve authentication token (AWS.RDS.Signer.getAuthToken): ${err}`)
cb(err)
} else {
var connection = mysql.createConnection({
host: readerEndpoint,
port: dbPort,
user: dbUsername,
password: token,
database: dbName,
ssl: 'Amazon RDS',
multipleStatements: true,
authSwitchHandler: function (data, cb) {
if (data.pluginName === 'mysql_clear_password') {
cb(null, Buffer.from(token + '\0'))
}
}
})
connection.connect()
Пока не появится новый сертификат слился с mysql2, вы можете исправить это загрузка нового сертификата, COPY
вставьте его в образ Docker и загружая это с чем-то вроде
const fs = require('fs')
// ...code...
var connection = mysql.createConnection({
host: readerEndpoint,
port: dbPort,
user: dbUsername,
password: token,
database: dbName,
// Here's the change. Replace the path as appropriate.
ssl: { ca: fs.readFileSync(__dirname + '/rds-ca-2019-root.pem') },
multipleStatements: true,
authSwitchHandler: function (data, cb) {
if (data.pluginName === 'mysql_clear_password') {
cb(null, Buffer.from(token + '\0'))
}
}
})