-1

私はNodeJSキネシスストリームから読み込み、処理して別のキネシスストリームに書き込むラムダ関数です。書き込み部分がラムダにエラーを引き起こしています。 aws-sdk npmモジュールを使用してデータを書き込みます。 putRecordを呼び出すと、コールバックは発生せず、ラムダはタイムアウトします。 この書き込みコードは、ラップトップ上のノードアプリケーションとしてローカルで実行するとうまく動作します。NodeJSスクリプトはローカルでは動作しますが、ラムダのハンドラでは動作しません。

ローカル設定: - 資格情報がファイルにキネシスフルアクセスポリシーを持つプログラムで、ユーザーの資格情報がある保存され、putRecordが正常など

ラムダ関数shardId、シーケンス番号を、返し実行します。 - putRecordのコードが返されず、ハングします。エラーもスローされません。ラムダはキネシスフルアクセスポリシーの役割を担っています。

コード:

var AWS = require('aws-sdk'); 
    var kinesis = new AWS.Kinesis({ 
     region: 'us-east-1', 
    }); 
    var randomNumber = Math.floor(Math.random() * 100000); 
      var data = 'data-' + randomNumber; 
      var partitionKey = 'pk-' + randomNumber; 
      var recordParams = { 
       Data: data, 
       PartitionKey: partitionKey, 
       StreamName: streamName 
      }; 
      kinesis.putRecord(recordParams, function(err, data) { 
       console.log(data); 

       if (err) { 
        console.error(err); 
       } 
      }); 

問題を引き起こしている可能性がどのような任意のアイデア。 VPCやセキュリティグループは多分関連していますか? 思想と示唆が得られました。おかげさまで

答えて

2

VPCに機能を追加すると、そのVPC内のリソースにのみアクセスできます。 VPC外のリソースにアクセスしようとするとハングし、最終的にタイムアウトになります。 KinesisはあなたのVPCの内部に存在しないので、あなたはそれにアクセスすることはできません。

解決策は、VPCの外部でラムダ機能を実行するか、またはVPCにNATゲートウェイを追加することです。

+1

また、(IIRC)は、ラムダ関数のサブネットがVPC内のプライベートサブネットであり、VPCのパブリックサブネットではないことを確認します。 –

+1

@ JeffLearmanそうですね、NATゲートウェイへのルートを持たせるためには、彼らが必要となります。 –

+0

ありがとうございます@マークB! VPCとセキュリティグループを削除した。 NATゲートウェイについての情報もありがとう。 – Malaka

3

上記の正確なNode.jsスクリプトコードをLambdaにアップロードしても、間違いなく動作します。

Lamdaでは、呼び出すハンドラ関数をエクスポートする必要があります。

あなたはそれがラムダ関数になりたいのであれば、スクリプトは次のように記述する必要があります...

'use strict'; 

var AWS = require('aws-sdk'); 
var kinesis = new AWS.Kinesis({ 
    region: 'us-east-1', 
}); 


exports.handler = function (event, context, callback) { 
    var randomNumber = Math.floor(Math.random() * 100000); 
    var data = 'data-' + randomNumber; 
    var partitionKey = 'pk-' + randomNumber; 
    var recordParams = { 
    Data: data, 
    PartitionKey: partitionKey, 
    StreamName: streamName, 
    }; 

    kinesis.putRecord(recordParams, function (err, data) { 
    callback(null, data); 

    if (err) { 
     callback(err); 
    } 
    }); 
}; 

ではなくconsole.logconsole.errorを使用しての、あなたの代わりにcallbackを呼び出す必要がありますのでご注意ください。

関連する問題