2016-02-09 24 views
10

Tôi có một hàm Lambda cần đọc một tập tin từ S3 mỗi khi nó được thực hiện.
Tệp rất nhỏ, khoảng 200 byte, thùng S3 nằm trong vùng Tiêu chuẩn Hoa Kỳ, hàm Lambda nằm trong vùng phía đông-1 của chúng tôi (vì vậy cùng một vùng). Phải mất từ ​​10 đến 15 giây để đọc tệp, làm sao điều này chậm đến vậy?Chức năng AWS Lambda cực kỳ chậm để truy xuất tập tin S3

Cảm ơn.

EDIT: một số mã

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: Sau khi đề nghị Brooks' Tôi đã làm

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

Và tôi nhận được lỗi này:

Unable to load credentials from Amazon EC2 metadata service 

EDIT # 3:
Bộ nhớ được cấp cho hàm Lambda là 256MB, khi tôi phân bổ 1024MB, nó ta kes 3-4 giây mà vẫn còn quá chậm (phải mất khoảng 1-2 giây khi tôi kiểm tra cục bộ từ máy tính của tôi).

+0

Người xuống bình chọn có thể giải thích lý do. –

+0

Thử chỉ định InstanceProfileCredentialsProvider khi khởi tạo AmazonS3Client. Nhà xây dựng mặc định cần phải cố gắng ủy quyền thông qua (trong thứ tự này) biến môi trường, thuộc tính hệ thống, tệp thông tin xác thực và sau đó là hồ sơ cá thể. Vì vậy, phương pháp ủy quyền ưa thích của bạn là cuối cùng. Tôi sẽ không nghĩ rằng nó sẽ mất nhiều thời gian, tuy nhiên cho nó một shot và cho tôi biết. – Brooks

+0

Xin lỗi, tôi đã nhầm. Tôi đã nghĩ rằng các container Lambda được vận chuyển với InstanceProfiles (tôi không thể hiểu tại sao nó lại không). Dường như nó có các thông tin xác thực được chỉ định trong các biến môi trường (http://stackoverflow.com/questions/32275169/aws-lambda-custom-triggers). Hãy thử chỉ định (new EnvironmentVariableCredentialsProvider()) khi khởi tạo AmazonS3Client. Mặc dù đó là mục đầu tiên trong danh sách thông tin đăng nhập được kiểm tra khi sử dụng hàm tạo mặc định, nó không thể làm tổn thương để thử. Hãy cho chúng tôi biết. – Brooks

Trả lời

1

Những gì tôi sẽ đề nghị là sử dụng ProfileCredentialsProvider và bộ nhớ cache dụ khách hàng S3 giữa Lambda chức năng hành:

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

Cái này là phải mất một thời gian để thiết lập các khách hàng S3 trong đó quản lý hồ bơi kết nối và khác tài nguyên.

+0

'ProfileCredentialsProvider' hoạt động với các quyền vai trò mà bạn đã gán cho hàm của mình. – Nazar

Các vấn đề liên quan