3

Я пытаюсь использовать зашифрованные переменные окружения в функции AWS Lambda, запущенной в Node.js 4.3, но код зависает при попытке расшифровки переменных. Я не получаю сообщений об ошибках, это просто время. Вот что я пробовал:Как использовать зашифрованные переменные окружения в AWS Lambda?

Я создал ключ шифрования в том же регионе, что и лямбда, и гарантировал, что роль, которую Lambda выполняет, имеет доступ к ключу. (Я даже пытался давать роль полный контроль над ключом.)

При создании Lambda, включить шифрование хелперы, выберите свой ключ шифрования и зашифровать переменную окружения:

enter image description here

Затем я нажимаю кнопку «Код», которая дает мне код javascript, который должен обрабатывать дешифрование во время выполнения. Вот код - единственное изменение, которое я сделал, чтобы добавить console.log заявления, и я добавил Try/улов:

"use strict"; 

const AWS = require('aws-sdk'); 

const encrypted = process.env['DBPASS']; 
let decrypted; 


function processEvent(event, context, callback) { 
    console.log("Decrypted: " + decrypted); 
    callback(); 
} 

exports.handler = (event, context, callback) => { 
    if (decrypted) { 
     console.log('data is already decrypted'); 
     processEvent(event, context, callback); 
    } else { 
     console.log('data is NOT already decrypted: ' + encrypted); 
     // Decrypt code should run once and variables stored outside of the function 
     // handler so that these are decrypted once per container 
     const kms = new AWS.KMS(); 
     console.log('got kms object'); 
     try { 
     var myblob = new Buffer(encrypted, 'base64'); 
     console.log('got blob'); 
     kms.decrypt({ CiphertextBlob: myblob }, (err, data) => { 
      console.log('inside decrypt callback'); 
      if (err) { 
       console.log('Decrypt error:', err); 
       return callback(err); 
      } 
      console.log('try to get plaintext'); 
      decrypted = data.Plaintext.toString('ascii'); 
      console.log('decrypted: ' + decrypted); 
      processEvent(event, context, callback); 
     }); 
     } 
     catch(e) { 
      console.log("exception: " + e); 
      callback('error!'); 
     } 
    } 
}; 

Вот что я получаю, когда я бегу функции:

data is NOT already decrypted: AQECAH..... 
got kms object 
got blob 
END RequestId: 9b7af..... 
Task timed out after 30.00 seconds 

Когда я запускаю функцию, время истекает. Я вижу, что он печатает все записи журнала до «got blob», после чего он просто останавливается. Нет сообщений об ошибках, отличных от времени ожидания. Я пробовал увеличивать тайм-аут и память для Lambda, но это просто заставляет ждать дольше, прежде чем истечет время ожидания.

Как дешифрование должно работать, когда я никогда не скажу приложению, какой ключ дешифрования использовать?documentation for decrypt не упоминает о том, какой ключ дешифрования использовать. И я не получаю сообщений об ошибках, которые говорят мне, что они не знают, какой ключ использовать или что-то еще.

Я пробовал пройти через this tutorial, но он просто говорит мне делать то же самое, что я уже сделал. Я также прочитал все environment variables documentation, но он говорит, что то, что я делаю, должно просто работать.

+0

Является ли ваша функция лямбда запущенной внутри VPC? – garnaat

+0

@ garnaat да, это в VPC. Это часть группы безопасности и подсети, которая может подключаться к экземпляру RDS MySQL. – Kip

+2

. Я думаю, проблема в том, что вам нужен интернет-доступ, чтобы позвонить в KMS, так как он попадает в конечные точки KMS. Конечной точки VPC для KMS нет, поэтому вам нужно будет настроить NAT-сервер в VPC. – garnaat

ответ

5

Расшифровка переменных окружения требует вызова API для службы KMS. Для этого ваша функция Lambda должна иметь доступ к Интернету, поскольку для KMS нет конечных точек VPC. Итак, если ваша Lambda работает в VPC, убедитесь, что у вас настроен NAT для VPC, чтобы ваша функция Lambda вызывала KMS.

Смежные вопросы