2016-02-09 24 views
10

Her çalıştırıldığında S3'ten bir dosya okuması gereken bir Lambda fonksiyonu var.
Dosya çok küçük, yaklaşık 200 bayt, S3 kovası ABD Standart bölgesinde, Lambda işlevi bize doğu-1 bölgesinde (aynı bölgede). Dosyayı okumak 10 ile 15 saniye arasında sürüyor, bu nasıl bu kadar yavaş?AWS Lambda fonksiyonu, S3 dosyasını almak için çok yavaş yavaş

Teşekkürler.

DÜZENLEME: Bazı kod

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)); 

DÜZENLEME # 2: Brooks'un öneri sonra

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

yaptım Ve bu hatayı alıyorum:

Unable to load credentials from Amazon EC2 metadata service 

DÜZENLEME # 3:
1024MB ayırdığımda, Lambda işlevine ayrılan bellek 256 MB oldu. hala çok yavaş olan 3-4 saniye keser (bilgisayarımdan yerel olarak test ettiğimde yaklaşık 1-2 saniye sürer).

+0

Aşağıya oy kullanan kişi bunun nedenini açıklayabilir. –

+0

AmazonS3Client'i başlatırken InstanceProfileCredentialsProvider belirtmeyi deneyin. Varsayılan kurucu, (bu sırayla) ortam değişkenleri, sistem özellikleri, kimlik bilgileri dosyası ve sonra da örnek profili aracılığıyla yetkilendirmeyi denemelidir. Yani, tercih ettiğiniz yetkilendirme yöntemi son. Bunun uzun süreceğini düşünmüyordum, ancak bir şans ver ve bana haber ver. – Brooks

+0

Üzgünüz, ben yanılmışım. Lambda kapsayıcılarının InstanceProfiles ile birlikte gönderildiğini düşünmüştüm (bunun neden olmadığını anlayamıyorum). Ortam değişkenlerinde belirtilen kimlik bilgileriyle birlikte geliyor gibi görünüyor (http://stackoverflow.com/questions/32275169/aws-lambda-custom-triggers). AmazonS3Client'i başlatırken (yeni EnvironmentVariableCredentialsProvider()) belirtmeyi deneyin. Varsayılan kurucu kullanılırken kontrol edilen kimlik listesindeki ilk öğe olsa da, denemek zarar veremez. Bilmemize izin ver. – Brooks

cevap

1

Ne öneriyorsun ProfileCredentialsProvider kullanmak ve Lambda fonksiyon yürütmeler arasında S3 istemci örneği önbelleğe şudur:

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 
    } 
} 

şey bağlantıları havuz ve diğer yöneten S3 istemcisi kurmak için biraz zaman alır olmasıdır kaynaklar.

+0

'ProfileCredentialsProvider', işlevinize atadığınız rol izinleriyle çalışır. – Nazar