Я решил свой вопрос, но все равно отправляю его в надежде спасти кого-то еще несколько часов!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)
- Установлен для использования новой таблицы маршрутов.
Надеюсь, это поможет кому-то!
Спасибо @ Farhan.K –
Как вы могли отладить это? Молчаливое сообщение «timeout» недостаточно для того, чтобы я мог что-то выяснить :-( –
Я использовал протоколирование, чтобы выяснить, в какой строке возникла проблема, затем прочитал документацию AWS, где я был тем, что ему нужен доступ в Интернет чтобы иметь доступ к очереди кинезий и что функции лямбда по умолчанию не назначены для IP-адреса. –