2016-12-26 2 views
0

Ich verwende aws Lambda, um benutzerdefinierte Aktionen auszuführen, da Auto Scaling Instanzen beendet. Es sieht aus wie diesesAWS Lambda hängt beim Abschließen der Lifecycle-Aktion ab

def scaledown_handler(event, context): 
    # customs actions 
    client = boto3.client('autoscaling') 
    response = client.complete_lifecycle_action(LifecycleHookName=event['detail']['LifecycleHookName'], 
            LifecycleActionToken=event['detail']['LifecycleActionToken'], 
            AutoScalingGroupName=event['detail']['AutoScalingGroupName'], 
            LifecycleActionResult='CONTINUE', 
            InstanceId=event['detail']['EC2InstanceId']) 

Das Problem ist, dass die Funktion hängt nur auf client.complete_lifecycle_action() und endet durch Timeout ohne Antwort und meine EC2-Instanzen sind immer „Waiting for Lifecycle Aktion beenden“.

aws autoscaling complete-lifecycle-action in aws CLI funktioniert gut, aber ich muss dies von AWS Lambda getan werden. Wie kann ich herausfinden, warum complete_lifecycle_action() hängt ohne eine Antwort?

+0

Haben Sie die Lambda-Funktion in einer VPC platziert? –

+0

Ja, das Lambda ist in der gleichen VPC wie meine ec2-Instanzen. –

+0

Brauchen Sie es wirklich in der VPC? Wenn Sie in Ihrer VPC kein NAT-Gateway haben, hat die Lambda-Funktion keinen Zugriff auf Daten außerhalb der VPC. Die AWS-API existiert außerhalb Ihrer VPC, sodass die Lambda-Funktion beim Versuch, auf sie zuzugreifen, ein Netzwerk-Timeout erhält. –

Antwort

1

Wenn Sie in Ihrer VPC kein NAT-Gateway haben, hat die Lambda-Funktion keinen Zugriff auf Daten außerhalb der VPC. Die AWS-API existiert außerhalb Ihrer VPC, sodass die Lambda-Funktion beim Versuch, auf sie zuzugreifen, ein Netzwerk-Timeout erhält.

Sie müssen ein NAT-Gateway zu Ihrer VPC hinzufügen, damit Lambda-Funktionen (und andere Dinge in Ihrer VPC, die keine öffentliche IP haben) auf etwas außerhalb der VPC zugreifen.

0

Sie müssen die put_lifecycle_hook() API verwenden. http://www.callumpember.com/auto-scaling-lifecycle-hooks/ Auf diesem Link können Sie das vollständige Python-Skript zum Ausführen der benutzerdefinierten Aktionen vor dem Beenden der Instanz abrufen.

+0

Ich habe bereits Autoscaling Lifecycle Hook von CLI-Befehl 'aws Autoscaling Put-Lifecycle-Hook' erstellt –