Назад | Перейти на главную страницу

Обновление проблемы SSL сертификата Amazon RDS с помощью MySQL Lambda

Как и многие люди, я обновил свой сертификат 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'))
    }
  }
})