2016-04-26 20 views
5

Desidero consentire agli utenti di avviare un'istanza EC2 solo quando è necessario.Timeout durante l'avvio di un'istanza EC2 da AWS Lambda utilizzando boto3

così ho creato una funzione lambda per fare proprio questo:

import boto3 

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

Ho anche aggiunto le seguenti autorizzazioni: IAM

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

problema è che quando eseguo il Lambda ho cronometrato su.

BTW che esegue lo stesso codice esatto da un EC2 all'interno dello stesso VPC e stesse autorizzazioni, restituisce immediatamente.

Qualche idea?

+0

Hai abilitato l'accesso VPC per la funzione Lambda? –

+0

È stato effettuato l'installazione di una vera e propria ruoli IAM + utente in Lambda http://docs.aws.amazon.com/lambda/latest/dg/setting-up.html Potrebbe essere necessario fare chnage tuo arn risorsa da "" arn: aws: ec2: accoun-id: nome utente " Lo script lamdba richiede anche credenziali utente specifiche per determinare le risorse. – mootmoot

+0

Ho configurato il VPC del lambda per essere uguale all'istanza EC2. – Michael

risposta

2

Se le credenziali fossero il problema, non si otterrebbero i timeout. Più probabilmente, stai usando un piccolo modello di memoria, e boto occupa molta memoria, anche per fare cose semplici. Prova a utilizzare un modello di memoria più grande o un timeout più lungo.

Se questo risulta essere il problema, prendere in considerazione la creazione della risorsa ec2 nel codice di inizializzazione della classe o utilizzando un modello singleton, in modo che le chiamate successive possano utilizzare la stessa risorsa. Tuttavia, accertarsi di impostare il timeout della funzione in modo che abbia tempo sufficiente per eseguire l'inizializzazione, nonché i suoi normali compiti, anche se ciò non sembra necessario. Se la funzione riceve un errore, la prossima esecuzione potrebbe includere l'ora di inizio della classe.

Problemi correlati