Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从AWS Lambda触发AWS EMR流程步骤时超时_Javascript_Amazon Web Services_Aws Lambda_Aws Sdk_Amazon Emr - Fatal编程技术网

Javascript 从AWS Lambda触发AWS 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客

我试图用JavaScript运行AWS lambda应用程序,但无法使其正常工作。 我在JS配置和触发方面没有任何问题(我成功运行了一个hello world应用程序),但我在aws sdk库方面遇到了问题。老实说,我不知道这是一个与网络配置或IAM配置相关的问题,但我很确定这不是一个脚本问题,因为我可以在计算机本地运行它而不会出现任何问题。 我遇到的主要问题是,当lambda应用程序调用AWS EMR API时,会出现超时错误。就好像lambda无法与EMR通信一样

在这里,您可以看到emr客户端(
console.log(emr\u客户端)
):

一些AWS配置信息:

  • 我在我的EMR集群所在的us-west-2区域创建了一个VPC,我正在那里触发lambda函数(我可以确认consoling
    process.env.AWS\u region

  • 我设置了一个子网,该子网以前是在同一VPC内创建的。EMR集群位于其内部,Lambda功能可以访问该集群

  • 我在同一VPC中设置了一个安全组,允许所有入/出边界(0.0.0.0/0和0.0.0/0之间的所有端口),以查看是否存在配置问题

  • 我设置了一个执行角色,该角色附加了以下策略并将其与lambda函数链接:

  • AWSLAMDAFULLACCESS

    Amazon LasticMapreducefullAccess

    AWSLambdaExecute

    AWSLambdaVPCAccessExecutionRole

    奥斯拉姆达罗

    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,但函数也存在超时。

    好吧,我解决了我的问题。基本上,如果您没有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/' 
        },
      ...
    }