2016-11-17 2 views
6

Я решил свой вопрос, но все равно отправляю его в надежде спасти кого-то еще несколько часов!AWS Lambda function using Boto3 тайм-аут

У меня есть серверный проект на AWS с использованием Python для вставки записи в очередь кинезитов. Однако, когда я использую 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" 

Когда я запускаю функцию я вижу следующее облако бревен часов:

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 

It оказывается, что решение заключалось в том, что функция лямбда не имела доступа к Интернету. По умолчанию функция лямбда не в VPC имеет доступ в Интернет, но функция лямбда внутри VPC этого не делает.

Чтобы исправить это, я создал новую подсеть, таблицу маршрутов, эластичный IP-адрес и шлюз. Они были настроены следующим образом:

  • нац шлюз использует упругую IP и указывает на любой подсети с интернет-шлюзом
  • В таблице маршрутов имеется маршрут для локального трафика ( .0.0/16 | Local. | Active) и маршрут для всех других IP-адресов шлюзу nat (0.0.0.0/0 | NAT ID | Active)
  • Установлен для использования новой таблицы маршрутов.

Надеюсь, это поможет кому-то!

ответ

8

Оказывается, решение заключалось в том, что функция лямбда не имела доступа к Интернету. По умолчанию функция лямбда не в VPC имеет доступ в Интернет, но функция лямбда внутри VPC этого не делает.

Чтобы исправить это, я создал новую подсеть, таблицу маршрутов, эластичный IP-адрес и шлюз. Они были настроены следующим образом:

  • Шлюз NAT использует упругую IP и указывает на любой подсети с интернет-шлюзом
  • В таблице маршрутов имеется маршрут для локального трафика (..0.0/16 | Local | Active) и маршрут для всех других IP-адресов к шлюзу NAT (0.0.0.0/0 | NAT ID | Active)
  • Установлен для использования новой таблицы маршрутов.

Надеюсь, это поможет кому-то!

+0

Спасибо @ Farhan.K –

+0

Как вы могли отладить это? Молчаливое сообщение «timeout» недостаточно для того, чтобы я мог что-то выяснить :-( –

+0

Я использовал протоколирование, чтобы выяснить, в какой строке возникла проблема, затем прочитал документацию AWS, где я был тем, что ему нужен доступ в Интернет чтобы иметь доступ к очереди кинезий и что функции лямбда по умолчанию не назначены для IP-адреса. –

Смежные вопросы