【问题标题】:Lambda to create EMR Cluster don't fire the cluster creation用于创建 EMR 集群的 Lambda 不会触发集群创建
【发布时间】:2015-03-21 19:22:48
【问题描述】:

我正在尝试运行创建集群的 λ 代码,但没有任何反应,可能是我误解了 Node 上的用法(因为我不太熟悉它。)

函数很简单:

// configure AWS Dependecies
var AWS = require('aws-sdk');

exports.handler = function(event, context) {
    // EMR Client
    var emr = new AWS.EMR({apiVersion: '2009-03-31', region: 'us-east-1'});

    var params = {... dozens of params describing jobs ...};
    var AWSRequest = emr.runJobFlow(params);
    AWSRequest
        .on('success', function(response){ console.log("success => " + response)})
        .on('error', function(response){ console.log("error => " + response)})
        .on('complete', function(response){ console.log("complete => "  + response)})
        .send( function(err, data){
            if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
        });

    context.done(null, 'λ Completed');
};

我正在使用grunt-aws-lambda grunt 任务和在控制台中对其进行测试,但除了以下内容之外什么都没有显示:

aws-emr-lambda$ grunt lambda_invoke
Running "lambda_invoke:default" (lambda_invoke) task

Message
-------
λ Completed

Done, without errors.

从 AWS 控制台执行它会产生相同的输出,并且不会创建 EMR 集群。

对此有什么想法吗?

【问题讨论】:

    标签: node.js amazon-web-services gruntjs emr aws-lambda


    【解决方案1】:

    AWSRequest 异步发送请求,但您在主处理程序中调用 context.done。这意味着充其量这将发送请求但不等待响应。 context.done 需要在 send 回调中,否则 AWS 可能会在收到响应之前终止函数,或者甚至在响应发送之前终止函数,具体取决于请求在 AWS 开发工具包中的执行方式。

    exports.handler = function(event, context) {
        // EMR Client
        var emr = new AWS.EMR({apiVersion:'2009-03-31', region:'us-east-1'});
    
        var params = {... dozens of params describing jobs ...};
        var AWSRequest = emr.runJobFlow(params);
        AWSRequest
            .on('success', function(response){ console.log("success => " + response)})
            .on('error', function(response){ console.log("error => " + response)})
            .on('complete', function(response){ console.log("complete => "  + response)})
            .send( function(err, data){
                if (err) console.log(err, err.stack); // an error occurred
                else     console.log(data);           // successful response
                context.done(null,'λ Completed');
            });
    };
    

    【讨论】:

    • 因为只是集群 EMR 创建调用,所以我对返回不是很感兴趣。我也试试看。
    • 太棒了!通过该编辑,我现在可以看到请求的验证错误,非常感谢!
    • 是否可以应用相同或相似的逻辑,而是向现有集群添加一个步骤?我们有一个场景,其中一个步骤可能会在发送 SNS 时静默失败。我想取消步骤(最近的),然后有效地克隆它
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多