Ich habe meine eigene Frage gelöst, aber posten es trotzdem in der Hoffnung, jemand anderes ein paar Stunden zu sparen!AWS Lambda-Funktion mit Boto3-Timeout
Ich habe ein serverloses Projekt auf AWS mit Python, um einen Datensatz in eine Kinesis-Warteschlange einzufügen. Wenn ich jedoch boto3.client ('kinesis') oder die Funktion put_record benutze, scheint es zu hängen, bis es abläuft, ohne Fehlermeldungen oder andere Informationen. Im Folgenden ist die Funktion:
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
Die serverless.yml Definition ist wie folgt:
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"
Wenn betreibe ich die Funktion ich folgendes in Cloud-Uhr-Protokolle sehen:
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
Es stellt sich heraus, dass die Lösung war, dass die Lambda-Funktion keinen Zugang zum Internet hatte. Standardmäßig hat eine Lambda-Funktion in einer VPC keinen Internetzugriff, eine Lambda-Funktion in einer VPC jedoch nicht.
Um dies zu beheben, habe ich ein neues Subnetz, Routentabelle, elastische IP und NAT-Gateway erstellt. Sie wurden wie folgt konfiguriert:
- Das NAT-Gateway verwendet das elastische IP und Punkte in jedem Subnetz mit einem Internet-Gateway
- der Routentabelle eine Route für den lokalen Verkehr hat ( .0.0/16 | Lokale. | Aktiv) und eine Route für alle anderen IPs zum NAT-Gateway (0.0.0.0/0 | NAT-ID | Aktiv)
- Die neue Routentabelle wird verwendet.
Hoffe, das hilft jemandem!
Danke @ Farhan.K –
Wie konnten Sie dies debuggen? Die stille "Timeout" -Nachricht reicht für mich nicht aus, um etwas herauszufinden :-( –
Ich verwendete Logging, um herauszufinden, in welcher Zeile das Problem auftrat, dann lesen Sie in der AWS-Dokumentation, wo ich den Internetzugang benötigte um auf die Kinesis-Queue zugreifen zu können und die Lambda-Funktionen sind standardmäßig nicht mit einer IP-Adresse belegt –