3

Ich versuche, verschlüsselte Umgebungsvariablen in einer AWS Lambda-Funktion zu verwenden, die in Node.js 4.3 ausgeführt wird, aber der Code hängt, wenn versucht wird, die Variablen zu entschlüsseln. Ich bekomme keine Fehlermeldungen, es kommt einfach mal raus. Hier ist, was ich versucht habe:Verwendung von verschlüsselten Umgebungsvariablen in AWS Lambda?

Ich habe den Verschlüsselungsschlüssel in der gleichen Region wie das Lambda erstellt und sichergestellt, dass die Rolle, die der Lambda läuft, wie Zugriff auf den Schlüssel hat. (Ich habe sogar versucht, die Rolle volle Kontrolle über die Schlüssel zu geben.)

Wenn die Lambda-Erstellung, aktiviere ich Verschlüsselung Helfer, meinen Verschlüsselungsschlüssel auswählen und verschlüsseln die Umgebungsvariable:

enter image description here

Als nächstes klicke ich auf den "Code" -Button, der mir Javascript-Code gibt, der die Entschlüsselung zur Laufzeit verarbeiten soll. Hier ist der Code - die einzige Änderung, die ich gemacht habe console.log Anweisungen hinzufügen und fügte ich einen try/catch:

"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!'); 
     } 
    } 
}; 

Hier ist, was ich bekomme, wenn ich die Funktion auszuführen:

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

Wenn ich die Funktion starte, läuft die Zeit ab. Ich sehe, dass es alle Log-Anweisungen bis zu "Get Blob" druckt, dann stoppt es einfach. Keine andere Fehlermeldung als die Zeitüberschreitung. Ich habe versucht, Timeout und Speicher für das Lambda zu erhöhen, aber es lässt es einfach länger warten, bevor es ausgeht.

Wie soll die Entschlüsselung funktionieren, wenn ich der App nie sage, welcher Entschlüsselungsschlüssel verwendet werden soll? Die documentation for decrypt erwähnt keine Möglichkeit, es zu sagen, welcher Entschlüsselungsschlüssel zu verwenden ist. Und ich bekomme keine Fehlermeldungen, die mir sagen würden, dass es nicht weiß, welchen Schlüssel man benutzen soll oder so.

Ich habe versucht, this tutorial durchlaufen, aber es sagt mir nur, dass ich das gleiche tun, was ich schon getan habe. Ich habe auch alle environment variables documentation gelesen, aber es sagt, dass, was ich tue, sollte nur funktionieren.

+0

Funktioniert Ihre Lambda-Funktion in einer VPC? – garnaat

+0

@garnaat Ja, es ist in einer VPC. Es ist Teil einer Sicherheitsgruppe und eines Subnetzes, das eine Verbindung zu einer RDS-MySQL-Instanz herstellen kann. – Kip

+2

Ich denke, das Problem besteht darin, dass Sie den Internet-Zugang benötigen, um KMS zu erreichen, da es die KMS-Endpunkte erreicht. Es gibt keinen VPC-Endpunkt für KMS, daher müssten Sie in Ihrer VPC einen NAT-Server einrichten. – garnaat

Antwort

5

Das Entschlüsseln der Umgebungsvariablen erfordert einen API-Aufruf an den KMS-Dienst. Dazu muss Ihre Lambda-Funktion Zugriff auf das Internet haben, da es für KMS keine VPC-Endpunkte gibt. Wenn Ihr Lambda in einer VPC ausgeführt wird, stellen Sie daher sicher, dass ein NAT für die VPC konfiguriert ist, damit Ihre Lambda-Funktion KMS aufrufen kann.