過去18か月間、S3オブジェクトで実行されているAWS Lambda関数があり、マイナーアップデート後に約1か月前に機能しなくなりました。元に戻しましたが、まだ壊れています。私はImageMagickを使用してPDFの最も基本的な変換を不運に行ったので、AWSが何かを更新し、pdfモジュールが削除されたか、動作しなくなったと思います。
Node.js 8.10のコアコードで基本的に実行していた基本的な機能だけを実行しました。
gm(response.Body).setFormat("png").stream((err, stdout,stderr) => {
if (err) {
console.log('broken');
}
const chunks = [];
stdout.on('data', (chunk) => {
chunks.Push(chunk);
});
stdout.on('end', () => {
console.log('gm done!');
});
stderr.on('data', (data) => {
console.log('std error data ' + data);
})
});
エラー応答:
stdエラーdataconvert:モジュール `/usr/lib64/ImageMagick-6.7.8/modules-Q16/coders/pdf.la 'をロードできません:ファイルが見つかりません
Node.js 10.xに移動して、awsサーバーレスアプリリポジトリから利用できるImageMagickレイヤーを使用してみました。同じコードでこれを試すと、このエラーが発生します
stdエラーデータの変換:FailedToExecuteCommand `'gs' -sstdout =%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 2 '-sDEVICE = pngalpha' -dTextAlphaBits = 4 -dGraphicsAlphaBits 4 '-r72x72' '-sOutputFile =/tmp/magick-22TOeBgB4WrfoN%d' '-f/tmp/magick-22KvuEBeuJuyq3' '-f/tmp/magick-22dj24vSktMXsj' '(1)@エラー/pdf.c/InvokePDFDelegate/292
どちらの場合も、代わりに画像ファイルで実行すると、関数は正しく機能します。
これに基づいて、aws 8.10 ImageMagickと10のレイヤーの両方にpdfモジュールがないと思いますが、それを追加する方法や、そもそもなぜそれが削除されたのかわかりません。機能していたこの機能を修正する最良の方法は何ですか?
[〜#〜]編集[〜#〜]
だから私は https://github.com/serverlesspub/imagemagick-aws-lambda-2 をダウンロードしてライブラリを手動でビルドし、それをLambdaにアップロードして、それをレイヤーとして正常に機能させましたが、オプションのライブラリであるGhostScriptは含まれません。ビルドして結果にGhostscriptへの参照が含まれるMakefile_ImageMagick
に追加しようとしましたが、実行してもPDF問題が解決しません(画像は機能します))。 GhostScriptオプションライブラリをMakeファイルに追加する最良の方法
他の回答は役に立ちましたが、実行可能なソリューションを実現するためにまだ多くの作業があったため、以下は、特にNodeJS用にこれを修正する方法を示しています。
ダウンロード: https://github.com/sina-masnadi/lambda-ghostscript
Binディレクトリを圧縮して、Lambdaにレイヤーとしてアップロードします。
NodeJSモジュールに https://github.com/sina-masnadi/node-gs を追加します。それらをプロジェクトの一部としてアップロードすることも、私がレイヤーとして実行した方法(他の必要なものすべてと一緒に)をアップロードすることもできます。
https://github.com/serverlesspub/imagemagick-aws-lambda-2 をレイヤーとして追加します。これを行うための最良の方法は、Lambdaで新しい関数を作成し、[サーバーレスアプリリポジトリの参照]を選択して、「ImageMagick」を検索し、「image-magick-lambda-layer」を選択することです(これをビルドしてレイヤーとしてアップロードすることもできます)。 。
関数に3つのレイヤーを追加します。この順序で実行しました
ImageMagickおよびGhostScriptのrequireステートメントにappPathを追加します。
var gm = require("gm").subClass({imageMagick: true, appPath: '/opt/bin/'});
var gs = require('gs');
鉱山は非同期の滝にあったので、以前の処理関数の前に、この関数を追加して、まだ画像でない場合はpngに変換しました。
function convertIfPdf(response, next) {
if (fileType == "pdf") {
fs.writeFile("/tmp/temp.pdf", response.Body, function(err) {
if (!err) {
gs().batch().nopause().executablePath('/opt/bin/./gs').device('png16m').input("/tmp/temp.pdf").output('/tmp/temp.png').exec(function (err, stdout, stderr){
if (!err && !stderr) {
var data = fs.readFileSync('/tmp/temp.png');
next(null, data);
} else {
console.log(err);
console.log(stderr);
}
});
}
});
} else {
next(null, response.Body);
}
}
それ以降は、同じ形式であるため、ImageMagickで以前行っていた操作を実行できます。 PDF変換を行うにはより良い方法があるかもしれませんが、ファイルを操作しない限り、GSライブラリに問題がありました。より良い方法がある場合はお知らせください。
ライブラリのロードに問題がある場合は、パスが正しいことを確認してください。パスを圧縮した方法によって異なります。
私も同じ問題を抱えていました。 pdf.la not foundエラーが原因で、1日に何千ものPDF=ページを処理する2つのクラウドサービスが失敗します。
解決策は、Image MagickからGhostScriptに切り替えてPDFをPNGに変換し、ImageMagickをPNGで使用することです(必要な場合)。このように、IMはPDFを処理する必要がなく、pdf.laファイルを必要としません。
AWS LambdaでGhostScriptを使用するには、gsバイナリを関数Zipファイルにアップロードするだけです。
Ghostscriptがもう見つからないという問題がありました。
以前は、次の方法でghostscriptを参照していました。
var gs = '/usr/bin/gs';
AWS lambdaがそのパッケージの提供を停止したので、私はそれをラムダ関数に直接含めて、うまくいきました。 https://github.com/sina-masnadi/lambda-ghostscript からファイルをダウンロードし、「ghostscript」という名前のフォルダーに配置した後、次のように参照しました。
var path = require('path')
var gs = path.join(__dirname,"ghostscript","bin","gs")
レイヤーをラムダ関数に追加して、2019年7月22日まで再び機能させることができます。追加する必要があるレイヤーのARNは次のとおりです。arn:aws:lambda ::: awslayer:AmazonLinux1703
手順は pcoming-updates-to-the-aws-lambda-execution-environment で説明されています
長期的な解決策があればすばらしいでしょう。