2016-05-03 14 views
-1

次のコードはLambdaのputItem JAVA関数用です。機能は、client.putItem(itemRequest);行まで正しく機能しています。この関数は、入力を正しく読み取っています。 JUnit4テスト(合計時間< 2秒)を実行すると、このコード全体が正常に動作しており、データベース内のエントリを確認できます。しかし、putItem行でLambdaコンソールを使ったテストが失敗すると、これは失敗します(5秒後のタイムアウト)。ここでputItem(itemRequest)はJUnitテスト中に動作しますが、AWS Lambdaコンソールのテスト中では動作しません

public class HelloDB implements RequestHandler<UserClass, String> { 
AmazonDynamoDBClient client = null; 

public HelloDB() throws IOException { 
    AWSCredentials credentials = new PropertiesCredentials(HelloDB.class 
        .getResourceAsStream("AwsCredentials.properties")); 
    client = new AmazonDynamoDBClient(credentials); 
    System.out.println("Creds created"); 
} 

@Override 
public String handleRequest(UserClass input, Context context) { 
    System.out.println("U: " + input.getUserName() + " p: " + input.getPasswordHash()); 
    System.out.println("UI: " + input.userId + " O: " + input.getOpenIdToken()); 

    String tableName = "User"; 

    Map<String, AttributeValue> item = new HashMap<String, AttributeValue>(); 

    item.put("userName", new AttributeValue().withS(input.getUserName())); 
    item.put("passwordHash", new AttributeValue().withS(input.getPasswordHash())); 
    item.put("userId", new AttributeValue().withN(input.getUserId().toString())); 
    item.put("openIdToken", new AttributeValue().withS(input.getOpenIdToken())); 

    PutItemRequest itemRequest = new PutItemRequest().withTableName(tableName).withItem(item); 
    System.out.println("item request"); 
    client.putItem(itemRequest); 
    System.out.println("client put item request"); 
    item.clear(); 
    return "Success"; 
} 

はエラーメッセージです:

"errorMessage": .... Task timed out after 5.00 seconds" 

時間は15秒の代わりに、5秒に増加したとき、私はこのエラーを取得する:

"errorMessage": "Metaspace", 
"errorType": "java.lang.OutOfMemoryError" 
+1

「失敗します」というのは本当に役立つ説明ではありません。実際に私たちがあなたを助けてくれるようにしたいのであれば、「方法」は非常に重要です。 – GhostCat

+0

タイムアウトです。だから基本的には、それを挿入することができません... – suku

+0

ラムダ関数のVPCアクセスを有効にしましたか? –

答えて

1

機能がない場合には任意のリクエストを受け取ると、Amazonはラムダサーバから自動的に削除して、リソースを使用していません。これが発生した場合は、次に要求が来るときに、関数を要求を処理する前に、その関数をラムダサーバーに再デプロイする必要があります。これは "コールドスタート"と呼ばれます。コールドスタートから実行するためにJAVAで書かれたラムダ関数がpythonやnodejで書かれたものと比べて、もっと長い時間とリソースが必要です。したがって、開始するには最低10秒の時間制限と512MBのメモリを割り当てることをお勧めします。その後の実行には約20-30msかかる。

ここでは、3つの言語すべてで記述された関数のコールドスタート時間とその結果の実行時間についての研究を示します。

JUnit4テストはラムダがコールドスタートに起因する可能性があるよりも速く実行されます。