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が一時ディレクトリへのファイルの書き込みに失敗し、他のユーザーと連携する理由は何ですか?
Amazon Lambdaは、イベントに応答するイベント駆動型システムとして使用されるように設計されています。フローは次のとおりです。
Lambda関数は最大実行時間15分に制限されています(これは元の5分タイムアウトから最近増加しました)実際の制限はLambda関数の作成時に設定されます。 Lambda関数は、大規模なアプリケーションではなく、小さくて高速であることを目的としているため、制限が設けられています。
エラーメッセージにはTask timed out after 15.00 seconds
と表示されます。これは、AWS 15秒の実行時間に達したらタスクを意図的に停止したを意味します。関数がその時点で実行していたことと、処理されていたファイルとは関係ありません。
修正するには: Lambda関数の構成ページのタイムアウト設定を増やします。
私の場合、タスクはローカルで正常に動作しましたが、Lambdaでタイムアウトしたのは、Lambdaインスタンスに割り当てられたメモリを増やす必要があったためです。
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");
...
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 */})
};
};
最近、AWS Lambda関数を操作するためにPOCに取り組んでいました。私も同じ問題に直面していました(タスクは15.01秒後にタイムアウトしました)。メモリ割り当てを増やしただけで、問題は解決しました。美しさは、数秒で応答が得られることです。だから、エラーは少し誤解を招くと思います。障害の正確な根本原因を提供する必要があります。
まず、なぜ/ tmp /に書き込むのですか? Lambda関数が実行されるのと同じ場所に書き込みますか?
ただし、文字列をS3ファイルとして書きたい場合は、S3Objectを作成してAWS S3に直接書き込むことができます。以下に例を示す投稿を示します。 https://stackoverflow.com/a/29844224/35801