【问题标题】:Timeout while triggering AWS EMR flow step from AWS Lambda从 AWS Lambda 触发 AWS EMR 流步骤时超时
【发布时间】: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 配置信息:

  1. 我创建了一个 VPC,我的 EMR 集群所在的位置位于 us-west-2 区域,我正在那里触发 lambda 函数(我可以确认正在安慰 process.env.AWS_REGION)。

  2. 我设置了一个先前在同一 VPC 中创建的子网。 EMR 集群在其中,Lambda 函数可以访问它。

  3. 我在同一个 VPC 中设置了一个安全组,允许所有入站/出站(所有进出 0.0.0.0/0 的端口),以查看那里是否存在配置问题。

  4. 我设置了一个执行角色,该角色附加了以下策略并将其与我的 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


    【解决方案1】:

    好吧,我解决了我的问题。基本上,如果您没有 Internet 访问权限,则无法在 VPC 内调用 AWS API 端点,因为大多数 aws 服务都有一个公共 URL,例如 https://elasticmapreduce.us-west-2.amazonaws.com。当您控制 EMR 客户端对象时,您可以清楚地看到这一点(这也适用于其他客户端对象,如我验证过的 S3)

    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/' 
        },
      ...
    }
    

    无论如何,AWS 在 vpcs VPC Endpoints 内提供了一些本地端点,因此您可以在没有 Internet 访问的情况下访问 VPC 内的这些服务端点。在另一种情况下,您必须设置 NAT 网关 + 互联网网关(约 u$s 30/月)才能访问其他服务,例如 EMR。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      相关资源
      最近更新 更多