2016-02-09 10 views
10

Ho una funzione Lambda che deve leggere un file da S3 ogni volta che viene eseguito.
Il file è molto piccolo, circa 200 byte, il secchio S3 si trova nella regione degli Stati Uniti, la funzione Lambda si trova nella regione us-east-1 (quindi nella stessa regione). Ci vogliono tra 10 e 15 secondi per leggere il file, come mai questo è così lento?Funzione AWS Lambda estremamente lenta per il recupero del file S3

Grazie.

EDIT: un codice

long start = System.nanoTime(); 
AmazonS3Client s3Client = new AmazonS3Client(); 
S3Object propertyFile = null; 
try { 
    propertyFile = s3Client.getObject(S3_BUCKET_NAME, S3_PROPERTY_FILE); 
} catch (Exception e) {...} 
try (InputStream in = propertyFile.getObjectContent()) { 
    PROPERTIES.load(in); 
} catch (Exception e) {...} 
LOGGER.debug("S3 access " + (System.nanoTime() - start)); 

EDIT # 2: Dopo il suggerimento Brooks' ho fatto

AmazonS3Client s3Client = new AmazonS3Client(new InstanceProfileCredentialsProvider()); 

e ottengo questo errore:

Unable to load credentials from Amazon EC2 metadata service 

EDIT # 3:
La memoria allocata alla funzione Lambda era 256 MB, quando alloco 1024 MB, è kes 3-4 secondi che è ancora troppo lento (ci vogliono circa 1-2 secondi quando provo localmente dal mio computer).

+0

La persona che ha votato potrebbe forse spiegare il motivo. –

+0

Provare a specificare InstanceProfileCredentialsProvider durante l'istanziazione di AmazonS3Client. Il costruttore predefinito deve tentare l'autorizzazione tramite variabili di ambiente (in questo ordine), proprietà di sistema, file di credenziali e quindi profilo di istanza. Quindi, il tuo metodo di autorizzazione preferito è l'ultimo. Non penserei che ci vorrebbe QUELLO a lungo, comunque dagli un colpo e fammi sapere. – Brooks

+0

Mi dispiace, mi sono sbagliato. Pensavo che i contenitori Lambda fossero forniti con InstanceProfiles (non riesco a capire perché non lo farebbe). Sembra che venga fornito con le credenziali specificate nelle variabili di ambiente (http://stackoverflow.com/questions/32275169/aws-lambda-custom-triggers). Prova a specificare (nuovo EnvironmentVariableCredentialsProvider()) durante l'istanziazione di AmazonS3Client. Anche se è il primo elemento nell'elenco di credenziali verificate quando si utilizza il costruttore predefinito, non può fare male provare. Facci sapere. – Brooks

risposta

1

Quello che vorrei suggerire è quello di utilizzare ProfileCredentialsProvider e memorizzare nella cache istanza del client S3 tra Lambda esecuzioni di funzione:

public class MyLambda { // No matter you implement standard AWS SDK interfaces or not 

    private final AmazonS3Client s3Client = new AmazonS3Client(new ProfileCredentialsProvider()); 

    public String sayHello(Request request, Context context) { 
     S3Object s3Obj = s3Client.getObject(request.getBucket(), request.getKey()); 
     return S3Utils.getContent(s3Object); // Some util which retrieves object content 
    } 
} 

Il fatto è che ci vuole un po 'di tempo per impostare il client S3 che gestisce le connessioni piscina e altro risorse.

+0

'ProfileCredentialsProvider' funziona con le autorizzazioni di ruolo assegnate alla funzione. – Nazar

Problemi correlati