2016-11-17 116 views
6

我已经解决了我自己的问题,但无论如何发布它希望保存别人几个小时!AWS Lambda函数使用Boto3超时

我在AWS上有一个无服务器项目,使用Python将记录插入到kinesis队列中。但是,当我使用boto3.client('kinesis')或put_record函数时,它似乎挂起直到超时,没有错误消息或其他信息。下面是函数:

import boto3 

def put_record_kinesis(data, stream_name, partition_key): 
    print "create kinesis begin" 
    kinesis = boto3.client("kinesis") 

    print "put record begin" 
    response = kinesis.put_record(StreamName=stream_name, Data=data, PartitionKey=partition_key) 
    print "put record complete" 
    print response 

的serverless.yml定义是如下:

provider: 
    name: aws 
    runtime: python2.7 
    iamRoleStatements: 
    - Effect: "Allow" 
     Action: 
     - "ec2:CreateNetworkInterface" 
     - "ec2:DescribeNetworkInterfaces" 
     - "ec2:DeleteNetworkInterface" 
     - "kinesis:*" 
     Resource: "*" 

    vpc: 
    securityGroupIds: 
     - sg-... 
    subnetIds: 
     - subnet-... 
     - subnet-... 
     - subnet-... 

    stage: dev 
    region: eu-west-1 
    memorySize: 128 

functions: 
    LambdaQueueFunction: 
    handler: python_file.queue 
    memorySize: 1024 
    timeout: 100 

    LambdaDequeueFunction: 
    handler: python_file.dequeue 

resources: 
    Resources: 
    KinesisQueue: 
     Type: AWS::Kinesis::Stream 
     Properties: 
     Name: kinesis-queue 
     ShardCount: 1 
    ChronosQueueMap: 
     Type: AWS::Lambda::EventSourceMapping 
     DependsOn: 
     - "LambdaDequeueFunctionLambdaFunction" 
     - "IamPolicyLambdaExecution" 
     Properties: 
     BatchSize: 1 
     EventSourceArn: 
      Fn::GetAtt: 
      - "KinesisQueue" 
      - "Arn" 
     FunctionName: 
      Fn::GetAtt: 
      - "LambdaDequeueFunctionLambdaFunction" 
      - "Arn" 
     StartingPosition: "TRIM_HORIZON" 

当我跑我看到云watch日志以下功能:

10:53:02 | START RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943 Version: $LATEST 
10:53:02 | put records begin 
10:54:42 | END RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943 
10:54:42 | REPORT RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943 Duration: 100002.99 ms Billed Duration: 100000 ms Memory Size: 1024 MB Max Memory Used: 22 MB 
10:54:42 | 2016-11-17T10:54:42.155Z 027bb0cb-acb4-11e6-b20c-1b587b734943 Task timed out after 100.00 seconds 

它事实证明,解决方案是lambda函数无法访问互联网。默认情况下,不在VPC中的lambda函数可以访问互联网,但VPC中的lambda函数不会。

为了解决这个问题,我创建了一个新的子网,路由表,弹性IP和NAT网关。他们配置如下:

  • NAT网关使用弹性IP,并指出任何子网与Internet网关
  • 路由表对本地流量的路由( .0.0/16 |本地。 | Active)以及所有其他IP到nat网关的路由(0.0.0.0/0 | NAT ID | Active)
  • 设置为使用新的路由表。

希望这可以帮助别人!

回答

8

事实证明,解决方案是lambda函数无法访问互联网。默认情况下,不在VPC中的lambda函数可以访问互联网,但VPC中的lambda函数不会。

为了解决这个问题,我创建了一个新的子网,路由表,弹性IP和NAT网关。他们配置如下:

  • NAT网关使用弹性IP,并指出任何子网与Internet网关
  • 路由表对本地流量的路由(..0.0/16 | Local | Active)和所有其他IP的路由到NAT网关(0.0.0.0/0 | NAT ID | Active
  • 设置为使用新的路由表。

希望这可以帮助别人!

+0

Thanks @ Farhan.K –

+0

你怎么能够调试呢?无声的“超时”消息不足以让我弄清楚任何事情:-( –

+0

我使用日志记录来确定发生问题的线路,然后阅读AWS文档,在那里我需要互联网访问能够访问kinesis队列,并且lambda函数不是默认分配的IP地址。 –