2017-02-08 28 views
3

Node.js 4.3で実行されているAWS Lambda関数で暗号化された環境変数を使用しようとしていますが、変数を解読しようとするとコードがハングします。私はエラーメッセージを受け取っていない、それは単にタイムアウトします。ここで私が試したものです:AWS Lambdaで暗号化された環境変数を使用するには?

私はラムダと同じ地域内の暗号化キーを作成し、キーへのアクセス権を持っているような役割は、ラムダが実行されることを確実にしました。 (私も、キーの役割を完全に制御を与えてみました。)

ラムダを作成するときに、私は、環境変数の私の暗号化キーを選択して、暗号化、暗号化ヘルパーを有効にします。

enter image description here

を次に、実行時に復号化を処理するはずのjavascriptコードを提供する「コード」ボタンをクリックします。ここでは、コードは - 私が作った唯一の変化はconsole.log文を追加することであり、私はの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!'); 
     } 
    } 
}; 

は、私は、関数を実行したときに、私が得るものです:

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

関数を実行すると、タイムアウトします。私はすべてのログステートメントを "blobを持っている"まで表示してから停止することがわかります。タイムアウト以外のエラーメッセージはありません。私はラムダのタイムアウトとメモリを増やそうとしましたが、タイムアウトするまで待つ時間が長くなります。

はどのように解読は、私が使用するアプリ何復号鍵を伝えることはありません時に動作するようになっていますか?documentation for decryptには、どのような復号化キーを使用するかについては言及していません。そして、私はそれが何を使うべきか、何かを知らないというエラーメッセージを受け取っていません。

私はthis tutorialを通過しようとしましたが、それはちょうど私がすでにやったと同じことを行うために私に語りました。私はenvironment variables documentationも読んだことがありますが、私がやっていることはちょうどうまくいくはずです。環境変数を解読

+0

ラムダ機能はVPC内で実行されていますか? – garnaat

+0

@garnaatはいVPCにあります。それはRDS MySQLインスタンスに接続できるセキュリティグループとサブネットの一部です – Kip

+2

私は、KMSエンドポイントに当たっているので、KMSへの呼び出しを行うにはインターネットアクセスが必要であると思います。 KMSのVPCエンドポイントはありませんので、VPCにNATサーバを設定する必要があります。 – garnaat

答えて

5

は、KMSサービスのAPI呼び出しを必要とします。これを行うには、KMSのVPCエンドポイントがないため、ラムダ機能がインターネットにアクセスできる必要があります。したがって、ラムダがVPCで動作している場合、ラムダ機能がKMSを呼び出せるようにVPC用にNATが設定されていることを確認してください。

関連する問題