2016-04-26 7 views
5

Ich möchte Benutzern erlauben, eine EC2-Instanz nur dann zu starten, wenn sie benötigt wird.Timeout beim Starten einer EC2-Instanz von AWS Lambda mit boto3

So habe ich eine Lambda-Funktion genau das zu tun:

import boto3 

def lambda_handler(event, context): 
    ec2 = boto3.resource('ec2', region_name='eu-central-1') 
    return ec2.instances.filter(InstanceIds=['i-abc123']).start() 

Außerdem habe ich die folgenden IAM Berechtigungen:

{ 
     "Effect": "Allow", 
     "Action": [ 
      "ec2:StartInstances" 
     ], 
     "Resource": "arn:aws:ec2:*" 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "ec2:DescribeInstances" 
     ], 
     "Resource": "*" 
    } 

Problem ist, dass, wenn ich das Lambda ausführen ich zeitlich erhalten aus.

BTW läuft der exakt gleiche Code von einem EC2 innerhalb der gleichen VPC und die gleichen Berechtigungen, kehrt sofort zurück.

Irgendeine Idee?

+0

Haben Sie den VPC-Zugriff für die Lambda-Funktion aktiviert? –

+0

Haben Sie eine ordnungsgemäße IAM Rollen + Benutzer in Lambda eingerichtet http://docs.aws.amazon.com/lambda/latest/dg/setting-up.html Sie müssen möglicherweise tun, Ihre Ressource arn zu "" arn: aws: ec2: accoun-id: Benutzername " Das lamdba-Skript benötigt ebenfalls spezifische Benutzerdaten zur Bestimmung der Ressourcen. – mootmoot

+0

Ich habe die VPC des Lambdas so konfiguriert, dass sie mit der EC2-Instanz übereinstimmt. – Michael

Antwort

2

Wenn Anmeldeinformationen das Problem waren, würden Sie keine Timeouts erhalten. Wahrscheinlicher ist, dass Sie ein kleines Speichermodell verwenden, und Boto braucht viel Speicher, auch um einfache Dinge zu tun. Versuchen Sie es mit einem größeren Speichermodell oder einem längeren Timeout.

Wenn sich dies als Problem herausstellt, sollten Sie die ec2-Ressource im Klasseninitialisierungscode erstellen oder ein Singleton-Muster verwenden, damit nachfolgende Aufrufe die gleiche Ressource verwenden können. Stellen Sie jedoch sicher, dass das Funktions-Timeout so eingestellt ist, dass es genügend Zeit für die Initialisierung und die normalen Aufgaben hat, auch wenn dies nicht notwendig erscheint. Wenn Ihre Funktion einen Fehler erhält, kann der nächste Lauf die Klasseninitialisierungszeit enthalten.