【发布时间】:2018-10-10 02:30:36
【问题描述】:
我正在尝试在 JavaScript 中运行 AWS lambda 应用程序,但无法使其正常工作。 我在 JS 配置和触发方面没有任何问题(我成功运行了一个 hello world 应用程序),但是我遇到了 aws-sdk 库的问题。老实说,我不知道这是与网络配置有关的问题还是与 IAM 配置有关的问题,但我很确定这不是脚本问题,因为我可以在我的计算机上本地运行它而不会出现任何问题。 我遇到的主要问题是,当 lambda 应用程序调用 AWS EMR API 时,会出现超时错误。就像 lambda 无法与 EMR 通信一样。
这里可以看到emr客户端(console.log(emr_client)):
emr: Service {
config:
Config {
credentials:
EnvironmentCredentials {
expired: false,
expireTime: null,
accessKeyId: 'XXXXXXXXXXXXXXXX',
sessionToken: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
envPrefix: 'AWS' },
credentialProvider: CredentialProviderChain { providers: [Array] },
region: 'us-west-2',
logger: null,
apiVersions: {},
apiVersion: '2009-03-31',
endpoint: 'elasticmapreduce.us-west-2.amazonaws.com',
httpOptions: { timeout: 120000 },
maxRetries: undefined,
maxRedirects: 10,
paramValidation: true,
sslEnabled: true,
s3ForcePathStyle: false,
s3BucketEndpoint: false,
s3DisableBodySigning: true,
computeChecksums: true,
convertResponseTypes: true,
correctClockSkew: false,
customUserAgent: null,
dynamoDbCrc32: true,
systemClockOffset: 0,
signatureVersion: 'v4',
signatureCache: true,
retryDelayOptions: {},
useAccelerateEndpoint: false,
accesKeyId: 'XXXXXXXXXXXXXXXX' },
isGlobalEndpoint: false,
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/' },
_clientId: 1
}
一些 AWS 配置信息:
-
我创建了一个 VPC,我的 EMR 集群所在的位置位于 us-west-2 区域,我正在那里触发 lambda 函数(我可以确认正在安慰
process.env.AWS_REGION)。 -
我设置了一个先前在同一 VPC 中创建的子网。 EMR 集群在其中,Lambda 函数可以访问它。
-
我在同一个 VPC 中设置了一个安全组,允许所有入站/出站(所有进出 0.0.0.0/0 的端口),以查看那里是否存在配置问题。
-
我设置了一个执行角色,该角色附加了以下策略并将其与我的 lambda 函数链接:
AWSLambdaFullAccess
AmazonElasticMapReduceFullAccess
AWSLambdaExecute
AWSLambdaVPCAccessExecutionRole
AWSLambdaRole
AWSLambdaENIManagementAccess
最后,我的代码:
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 相关,但该功能也会超时。
【问题讨论】:
标签: javascript amazon-web-services aws-lambda aws-sdk amazon-emr