用于创建 EMR 集群的 Lambda 不会触发集群创建
Posted
技术标签:
【中文标题】用于创建 EMR 集群的 Lambda 不会触发集群创建【英文标题】:Lambda to create EMR Cluster don't fire the cluster creation 【发布时间】: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 集群。
对此有什么想法吗?
【问题讨论】:
【参考方案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 时静默失败。我想取消步骤(最近的),然后有效地克隆它以上是关于用于创建 EMR 集群的 Lambda 不会触发集群创建的主要内容,如果未能解决你的问题,请参考以下文章
使用 lambda 函数删除关联的 cloudformation 堆栈时 EMR 集群未终止
我们可以使用 lambda 函数克隆一个终止的 emr 集群吗?在新集群中会有任何差异吗?
如何从 Lambda 函数在亚马逊 EMR 上执行 spark 提交?