2016-06-21 10 views
3

別のAWSラムダ関数内でAWSラムダ関数として呼び出されるコード(データと関数を含む)を渡すことはできないようです。例えばnode.jsのAWSラムダ関数間のコードを共有

、このcustomConfigLambda取る:私はここのような他のAWSのラムダ関数の前のAWSのラムダ関数を呼び出すと

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

exports.handler = (event, context, callback) => { 
    callback(null, callbackPayload); 
}; 

を:

var AWS = require('aws-sdk'); 
AWS.config.update({accessKey: '123', secretAccessKey: 'abc', region: 'us-east-1' }); 
var lambda = new AWS.Lambda({region: 'us-east-1'}); 

exports.handler = (event, context, callback) => { 
    var params = {FunctionName: 'customConfigLambda'}; 
    lambda.invoke(params, function(err, callbackPayload) { 
     if (err) { 
      // do nothing 
     } 
     else { 
      console.log('callbackPayload:', JSON.stringify(callbackPayload, null, 2)); 
     } 
    }); 
}; 

その後、私は唯一のcallbackPayload.fooDataなくcallbackPayload.fooFunctionを見ることができます。

callbackPayload.fooFunction(s)を複数の他のAWSラムダ関数間で共有するにはどうすればよいですか?

答えて

1

でコールバックパラメータを使用して上のドキュメントを参照してください:それはresult(あなたのコードでcallbackPayload)については、この言う

結果 - ですファンクション実行の成功結果を提供するために使用できるオプションのパラメータです。提供される結果は JSON.stringifyである必要があります。エラーが発生した場合、このパラメータは無視されます。

JSON.stringifyと互換性があるために、そこには機能がありません。有効なJSON(文字列、数値、オブジェクト、配列、truefalsenullのみ)を確認するには、http://json.org/を参照してください。

広い意味でAWS Lambda関数間でコードを共有したい場合は、同じノードモジュールをrequireに設定する必要があります。これにより、すべてのAWS Lamdaで共通の関数セットを使用できるようになりますハンドラー。しかし、JSON.stringifyで生存しないので、それらの間で任意のコードを渡すことはできません。

ブラウザでこれを実行してみてくださいすることができます試験として

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

alert(JSON.stringify(callbackPayload)); 

DEMOを参照)、またはこのノードで:

var callbackPayload = {}; 

callbackPayload.fooData = 'fooFromData'; 
callbackPayload.fooFunction = function() {return 'fooFromFunction'; }; 

console.log(JSON.stringify(callbackPayload)); 

と結果を参照してください。

{"fooData":"fooFromData"} 

関数は、シリアル化プロセス中に削除されます。JSON結果

callbackPayload.fooFunction 
    = function() {return 'fooFromFunction'; }.toString(); 

とget:

はもちろん、あなたがこのような何かを行うことができ

{"fooData":"fooFromData","fooFunction":"function() {return 'fooFromFunction'; }"} 

をあなたはもう一方の端に、理論的にevalが、私は実際にそれをお勧めしません可能性があります。

+0

ありがとう、私はそこに方法があったと思っていた:)異なるラムダ関数でカスタムモジュールをrequireすることに関しては、普通のコード(すなわち、ZIP/S3ファイルがアップロードされていない)を伴う方法があるのだろうか? 'eval'に関しては、関数が入力パラメータを持っていないときだけうまくいくと思いますか? – TPPZ

+1

@TPPZ Serverlessプロジェクト(以前はJAWSと呼ばれていました)を見てください。この情報はhttp://docs.serverless.com/docs/installing-serverlessを参照してください。いくつかの共通コードベース。関数の評価については、関数function(x){return x;} "'を評価することができ、evalの結果はパラメータで実行できる関数になります。関数内のシンボルは、書かれた元のスコープにアクセスすることはできませんが、たとえば、スコープがどこで評価されたかというスコープにアクセスすることはできません。 – rsp

+0

リンクと詳細をありがとう。完全性のために、次のようにすることができます: 'var fooFunctionParsed = eval( '(+ + callbackPayload.fooFunction +') ');' 'const inputX = 42; const outputX = fooFunctionParsed(inputX); '私は 'this'のようなスコープについてはほとんど調べていませんでしたが、入力パラメータの組み合わせを返す簡単なヘルパー/化粧品の関数では、' eval'が最速の解決策に見えます。 – TPPZ

関連する問題