6

aws iot を使用して mqtt プロトコルを介して aws lambda からデータを公開する必要があります。node.js コードでラムダ関数を作成しました。このような

exports.handler = (event, context, callback) => {

    var awsIot = require('aws-iot-device-sdk');

    var device = awsIot.device({
        keyPath: 'samplepath/test.pem.key',
        certPath: 'samplepath/test.crt',
        caPath: 'samplepath',
        clientId: 'sampleId',
        region: 'us-east-1'
    });

    device
        .on('connect', function () {
            console.log('connected');
            device.publish('test_topic', JSON.stringify({ "test_name": "hello", "test_value": 1001 }));
            console.log('published successfully');
            callback(null, 'item added');
        });
}

サブスクライバーで mqtt メッセージを受け取りました。しかし、ラムダはこのようなエラーメッセージを生成します

Task timed out after 10.00 seconds 

コールバックの代わりに context.succeed() を使用しました。ラムダは適切に終了します。サブスクライバーでメッセージを取得できません。

どちらの場合も、コンソールは正常に発行されたというメッセージを適切に出力します。

パブリッシング コードに関連する問題は何ですか?

4

2 に答える 2

3

AWS IoT に接続するときにラムダ関数がタイムアウトすることを理解しています。使用している SDK については、aws-iot-device-sdk は組み込みデバイス内で使用するように設計されています。Lambda 関数を使用している場合、またはコンピューターで公開しようとしている場合、ベスト プラクティスは aws-sdk を使用することです。aws-sdk を使用すると、AWS IoT で発行するために証明書を使用する必要はありません。AWS 認証情報を使用するだけです。また、aws-sdk を使用すると、IoT で管理タスクを実行したり、モノを作成したり、証明書を作成したりできます。

私のコードに来て、関数が終了せずタイムアウトしない理由は、コールバックが非同期呼び出しが実行を終了するのを待っている必要があるためです。これは、関数から IoT への接続が維持されていることによって助けられていると思います。context.succeed() が正常に終了したが、メッセージが表示されなかった理由は、context.succeed が非同期呼び出しの実行が完了するのを待たないためです。

于 2016-10-14T11:07:32.690 に答える
2

メッセージを発行した後、必ずデバイスから切断してください。そうしないと、Lambda は接続が維持されるまで待機します ( http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context. html、探しますcallbackWaitsForEmptyEventLoop)。

終了時に切断するには、単に次のように変更callback(null, 'item added');します

device.end((err) => { callback(err, "item added"); });

于 2017-01-04T11:01:51.873 に答える