web-dev-qa-db-ja.com

AWS Lambda:タスクがタイムアウトしました

AWS Lambdaで実行されるJavaコードを書くために、学校プロジェクトに依頼されました。特定のURLのソースコードを取得し、S3バケットにアップロードすることになっています。 JavaコードがAWS Lambdaで実行されている必要があります。

JavaのString変数にソースコードを取得します。次に、/ tmpディレクトリのファイルに文字列を書き込もうとするwhileループがあります。次に、ファイルがS3にアップロードされます。

すべて正常に機能しますが、特定のURLが1つしかありません。私はこの点まで問題を追跡しました:

try {
    BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt"));
    out.write(source_code);  //Replace with the string 
    //you are trying to write  
    out.close();
}
catch (IOException e) {
    System.out.println("Exception ");
}

最も奇妙なことは、コードをローカルでテストすると、すべてが機能することです。コンピューターの/ tmpディレクトリにファイルが作成され、S3バケットにアップロードされます。ただし、Lambdaでコードを実行すると、次のエラーが表示されます。

Task timed out after 15.00 seconds

この特定のケースでLambdaが一時ディレクトリへのファイルの書き込みに失敗し、他のユーザーと連携する理由は何ですか?

33
jansv

Amazon Lambdaは、イベントに応答するイベント駆動型システムとして使用されるように設計されています。フローは次のとおりです。

  • triggers Lambda(例:Amazon S3へのアップロード、Amazon Kinesisストリームに着信するデータ、Lambda関数を直接呼び出すアプリケーション)のどこかで何かが起こります
  • Lambda関数は作成済みで、トリガーイベントからのデータが渡されます
  • Lambda関数runs

Lambda関数は最大実行時間15分に制限されています(これは元の5分タイムアウトから最近増加しました)実際の制限はLambda関数の作成時に設定されます。 Lambda関数は、大規模なアプリケーションではなく、小さくて高速であることを目的としているため、制限が設けられています。

エラーメッセージにはTask timed out after 15.00 secondsと表示されます。これは、AWS 15秒の実行時間に達したらタスクを意図的に停止したを意味します。関数がその時点で実行していたことと、処理されていたファイルとは関係ありません。

修正するには: Lambda関数の構成ページのタイムアウト設定を増やします。

60
John Rotenstein

私の場合、タスクはローカルで正常に動作しましたが、Lambdaでタイムアウトしたのは、Lambdaインスタンスに割り当てられたメモリを増やす必要があったためです。

8
andreamc

タイムアウトを15秒に設定したようです。このスクリーンショットで説明されているようにタイムアウトを増やすことができ、ラムダ設定ごとに実行できる最大時間は15分です。

timeout configuration

7
user2226400

AWS-SDKを関数本体の外側に配置することで問題を解決しました。

var AWS = require("aws-sdk");
exports.handler = function(event, context, callback)
{
//var AWS = require("aws-sdk"); //Error: Task timed out after 3.00 seconds
var docClient = new AWS.DynamoDB.DocumentClient();
console.log("Lambda starts");
...
3

asyncを使用するときにこのタイムアウトの問題が発生する場合は、非同期関数のハンドラーでパターンが異なることに注意してください。

の代わりに

exports.handler = function (event, context, callback) {
    callback(null, {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    });
};

それは

exports.handler = async function (event, context) {
    return {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    };
};
2
jperezov

最近、AWS Lambda関数を操作するためにPOCに取り組んでいました。私も同じ問題に直面していました(タスクは15.01秒後にタイムアウトしました)。メモリ割り当てを増やしただけで、問題は解決しました。美しさは、数秒で応答が得られることです。だから、エラーは少し誤解を招くと思います。障害の正確な根本原因を提供する必要があります。

1
Pankaj Jain

まず、なぜ/ tmp /に書き込むのですか? Lambda関数が実行されるのと同じ場所に書き込みますか?

ただし、文字列をS3ファイルとして書きたい場合は、S3Objectを作成してAWS S3に直接書き込むことができます。以下に例を示す投稿を示します。 https://stackoverflow.com/a/29844224/35801

0
blueskin