Javascript 从AWS Lambda触发AWS EMR流程步骤时超时
我试图用JavaScript运行AWS lambda应用程序,但无法使其正常工作。 我在JS配置和触发方面没有任何问题(我成功运行了一个hello world应用程序),但我在aws sdk库方面遇到了问题。老实说,我不知道这是一个与网络配置或IAM配置相关的问题,但我很确定这不是一个脚本问题,因为我可以在计算机本地运行它而不会出现任何问题。 我遇到的主要问题是,当lambda应用程序调用AWS EMR API时,会出现超时错误。就好像lambda无法与EMR通信一样 在这里,您可以看到emr客户端(Javascript 从AWS Lambda触发AWS EMR流程步骤时超时,javascript,amazon-web-services,aws-lambda,aws-sdk,amazon-emr,Javascript,Amazon Web Services,Aws Lambda,Aws Sdk,Amazon Emr,我试图用JavaScript运行AWS lambda应用程序,但无法使其正常工作。 我在JS配置和触发方面没有任何问题(我成功运行了一个hello world应用程序),但我在aws sdk库方面遇到了问题。老实说,我不知道这是一个与网络配置或IAM配置相关的问题,但我很确定这不是一个脚本问题,因为我可以在计算机本地运行它而不会出现任何问题。 我遇到的主要问题是,当lambda应用程序调用AWS EMR API时,会出现超时错误。就好像lambda无法与EMR通信一样 在这里,您可以看到emr客
console.log(emr\u客户端)
):
一些AWS配置信息:
process.env.AWS\u region
)
const AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
const emr = new AWS.EMR({
apiVersion:'2009-03-31',
region: process.env.AWS_REGION,
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});
const flowSteps = {
JobFlowId: process.env['JOB_FLOW_ID'],
Steps: [{
Name: "my_beautiful_step",
ActionOnFailure: "CANCEL_AND_WAIT",
HadoopJarStep: {
Jar: "command-runner.jar",
Args: [
"spark-submit",
"--master"," yarn",
...
...
...
]
}
}]
};
emr.addJobFlowSteps(flowSteps, (err, data) => {
if (err) {
console.log('ERROR', err, err.stack);
} else {
console.log('NO ERROR', data);
}
});
};
编辑:
我尝试与s3(获取存储桶位置)通信,只是为了测试问题是否仅存在于EMR,但函数也存在超时。好吧,我解决了我的问题。基本上,如果您没有internet访问权限,就不能在VPC内调用AWS API端点,因为大多数AWS服务都有一个公共URL,例如,
https://elasticmapreduce.us-west-2.amazonaws.com
。当您控制台EMR客户机对象时,您可以清楚地看到这一点(这也适用于其他客户机对象,如我验证的S3)
无论如何,AWS在VPC内提供了一些本地端点,因此您可以访问VPC内的那些服务端点,而无需访问internet。在另一种情况下,您必须设置NAT网关+internet网关(~u$s 30/月)才能访问其他服务,如EMR
const AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
const emr = new AWS.EMR({
apiVersion:'2009-03-31',
region: process.env.AWS_REGION,
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});
const flowSteps = {
JobFlowId: process.env['JOB_FLOW_ID'],
Steps: [{
Name: "my_beautiful_step",
ActionOnFailure: "CANCEL_AND_WAIT",
HadoopJarStep: {
Jar: "command-runner.jar",
Args: [
"spark-submit",
"--master"," yarn",
...
...
...
]
}
}]
};
emr.addJobFlowSteps(flowSteps, (err, data) => {
if (err) {
console.log('ERROR', err, err.stack);
} else {
console.log('NO ERROR', data);
}
});
};
Service {
config:
Config {
...
...
region: 'us-west-2',
logger: null,
apiVersions: {},
apiVersion: null,
endpoint: 'elasticmapreduce.us-west-2.amazonaws.com',
httpOptions: { timeout: 120000 },
maxRetries: undefined,
},
endpoint:
Endpoint {
protocol: 'https:',
host: 'elasticmapreduce.us-west-2.amazonaws.com',
port: 443,
hostname: 'elasticmapreduce.us-west-2.amazonaws.com',
pathname: '/',
path: '/',
href: 'https://elasticmapreduce.us-west-2.amazonaws.com/'
},
...
}