2016-02-09 114 views
10

私は実行するたびにS3からファイルを読み込む必要があるラムダ関数を持っています。
ファイルは非常に小さく、約200バイトです.S3バケットはUS標準領域にあり、ラムダ関数はus-east-1領域(同じ領域)にあります。ファイルの読み込みには10〜15秒かかりますが、どうしてこれが遅いのですか?AWS Lambda関数がS3ファイルを取得するのが極端に遅い

ありがとうございました。

編集:いくつかのコード

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:ブルックスの提案した後、私は

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

を行なったし、私はこのエラーを取得する:

Unable to load credentials from Amazon EC2 metadata service 

EDIT#3:
ラムダ関数に割り当てられたメモリは256MBでした。私が1024MBを割り当てると、それはta 3〜4秒の遅さはまだ遅いです(コンピュータからローカルにテストすると約1〜2秒かかります)。

+0

投票した人がその理由を説明している可能性があります。 –

+0

AmazonS3Clientをインスタンス化するときにInstanceProfileCredentialsProviderを指定してみてください。デフォルトのコンストラクターは、(この順序で)環境変数、システム・プロパティー、信任状ファイル、およびインスタンス・プロファイルを介して許可を試行する必要があります。したがって、あなたの優先権申請方法は最後です。私はそれが長い時間がかかりそうだとは思わないでしょうが、ショットを与えて私に知らせてください。 – Brooks

+0

申し訳ありませんが、私は間違っていました。私はラムダコンテナがInstanceProfilesに同梱されていると思っていた(なぜそうでないのか分からない)。それは、環境変数(http://stackoverflow.com/questions/32275169/aws-lambda-custom-triggers)で指定された資格情報とともに出荷されるようです。 AmazonS3Clientをインスタンス化するときに、(新しいEnvironmentVariableCredentialsProvider())を指定してみてください。デフォルトのコンストラクタを使用するときにチェックされる資格情報のリストの最初の項目でも、試しても害はありません。我々に教えてください。 – Brooks

答えて

1

私は何を示唆していることProfileCredentialsProviderを使用し、ラムダ関数の実行の間S3クライアントのインスタンスをキャッシュすることです:

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

ところは、接続プールや他の管理S3クライアントを設定するにはある程度の時間がかかることですリソース。

+0

'ProfileCredentialsProvider'は、あなたの関数に割り当てられたロールのアクセス権で動作します。 – Nazar

関連する問題