AWS Lambda NodeJS 启动 EMR Spark 问题
AWS Lambda NodeJS launch EMR Spark Problem
我正在尝试在 Lambda (NodeJS-12) 中使用以下脚本启动 EMR 集群。
var AWS = require('aws-sdk');
var emr = new AWS.EMR({apiVersion: '2009-03-31', region: 'ap-northeast-1'});
exports.handler = (event, context, callback) => {
var params = {
"Name": "LaunchEMR",
"Instances": {
"KeepJobFlowAliveWhenNoSteps": true,
"TerminationProtected": false,
"Ec2SubnetId": "subnet-XXXXXXXX",
"EmrManagedMasterSecurityGroup": "ElasticMapReduce-master",
"EmrManagedSlaveSecurityGroup": "ElasticMapReduce-slave",
"HadoopVersion": "2.8.5",
"InstanceGroups": [{
"Name": "Master",
"InstanceRole": "MASTER",
"InstanceCount": 1,
"InstanceType": "m3.xlarge",
"Market": "ON_DEMAND"
}, {
"Name": "Core",
"InstanceRole": "CORE",
"InstanceCount": 1,
"InstanceType": "m3.xlarge",
"Market": "ON_DEMAND"
}]
},
"Applications": [{
"Name": "Hadoop"
}, {
"Name": "Spark"
}],
"ServiceRole": "EMR_DefaultRole",
"JobFlowRole": "EMR_EC2_DefaultRole",
"ReleaseLabel": "emr-5.28.0"
};
emr.runJobFlow(params)
.on('success', function(response){ console.log("success => " + response); console.log(response); })
.on('error', function(response){ console.log("error => " + response); console.log(response); })
.on('complete', function(response){ console.log("complete => " + response); console.log(response); })
.send( function(err, data){
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
callback(null, {
statusCode: 200,
body: JSON.stringify(err),
});
});
};
我已经调整了 IAM 策略,我似乎能够将请求成功提交到 EMR,因为 Lambda 云监视日志中没有错误,我们可以在 EMR 事件中看到该请求。
然而,我们将在请求事件之后立即获得集群终止事件。
错误日志
Amazon EMR Cluster j-31OE0F3OXGO4K (LaunchEMR) has terminated with errors at 2019-12-02 06:32 UTC with a reason of VALIDATION_ERROR.
SubnetID和Security-Group与我手动启动的集群相同。
我在 "EMR_DefaultRole" 中添加了 "iam:PassRole"。
我还尝试了其他一些实例类型。
有什么我遗漏的吗?
我可以通过取消这 3 行来成功运行它。
"Ec2SubnetId": "subnet-XXXXXXXX",
"EmrManagedMasterSecurityGroup": "ElasticMapReduce-master",
"EmrManagedSlaveSecurityGroup": "ElasticMapReduce-slave",
但我仍然不知道它为什么有效。 (以及为什么没有)
我正在尝试在 Lambda (NodeJS-12) 中使用以下脚本启动 EMR 集群。
var AWS = require('aws-sdk');
var emr = new AWS.EMR({apiVersion: '2009-03-31', region: 'ap-northeast-1'});
exports.handler = (event, context, callback) => {
var params = {
"Name": "LaunchEMR",
"Instances": {
"KeepJobFlowAliveWhenNoSteps": true,
"TerminationProtected": false,
"Ec2SubnetId": "subnet-XXXXXXXX",
"EmrManagedMasterSecurityGroup": "ElasticMapReduce-master",
"EmrManagedSlaveSecurityGroup": "ElasticMapReduce-slave",
"HadoopVersion": "2.8.5",
"InstanceGroups": [{
"Name": "Master",
"InstanceRole": "MASTER",
"InstanceCount": 1,
"InstanceType": "m3.xlarge",
"Market": "ON_DEMAND"
}, {
"Name": "Core",
"InstanceRole": "CORE",
"InstanceCount": 1,
"InstanceType": "m3.xlarge",
"Market": "ON_DEMAND"
}]
},
"Applications": [{
"Name": "Hadoop"
}, {
"Name": "Spark"
}],
"ServiceRole": "EMR_DefaultRole",
"JobFlowRole": "EMR_EC2_DefaultRole",
"ReleaseLabel": "emr-5.28.0"
};
emr.runJobFlow(params)
.on('success', function(response){ console.log("success => " + response); console.log(response); })
.on('error', function(response){ console.log("error => " + response); console.log(response); })
.on('complete', function(response){ console.log("complete => " + response); console.log(response); })
.send( function(err, data){
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
callback(null, {
statusCode: 200,
body: JSON.stringify(err),
});
});
};
我已经调整了 IAM 策略,我似乎能够将请求成功提交到 EMR,因为 Lambda 云监视日志中没有错误,我们可以在 EMR 事件中看到该请求。 然而,我们将在请求事件之后立即获得集群终止事件。
错误日志
Amazon EMR Cluster j-31OE0F3OXGO4K (LaunchEMR) has terminated with errors at 2019-12-02 06:32 UTC with a reason of VALIDATION_ERROR.
SubnetID和Security-Group与我手动启动的集群相同。 我在 "EMR_DefaultRole" 中添加了 "iam:PassRole"。 我还尝试了其他一些实例类型。
有什么我遗漏的吗?
我可以通过取消这 3 行来成功运行它。
"Ec2SubnetId": "subnet-XXXXXXXX",
"EmrManagedMasterSecurityGroup": "ElasticMapReduce-master",
"EmrManagedSlaveSecurityGroup": "ElasticMapReduce-slave",
但我仍然不知道它为什么有效。 (以及为什么没有)