web-dev-qa-db-ja.com

ImageMagickがAWS LambdaでPDFを変換しない

過去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ファイルに追加する最良の方法

10
Rudiger

他の回答は役に立ちましたが、実行可能なソリューションを実現するためにまだ多くの作業があったため、以下は、特に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つのレイヤーを追加します。この順序で実行しました

  1. GhostScript
  2. ImageMagick
  3. NodeJSモジュール

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ライブラリに問題がありました。より良い方法がある場合はお知らせください。

ライブラリのロードに問題がある場合は、パスが正しいことを確認してください。パスを圧縮した方法によって異なります。

13
Rudiger

私も同じ問題を抱えていました。 pdf.la not foundエラーが原因で、1日に何千ものPDF=ページを処理する2つのクラウドサービスが失敗します。

解決策は、Image MagickからGhostScriptに切り替えてPDFをPNGに変換し、ImageMagickをPNGで使用することです(必要な場合)。このように、IMはPDFを処理する必要がなく、pdf.laファイルを必要としません。

AWS LambdaでGhostScriptを使用するには、gsバイナリを関数Zipファイルにアップロードするだけです。

3

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")
1
Raymond Nguyen

レイヤーをラムダ関数に追加して、2019年7月22日まで再び機能させることができます。追加する必要があるレイヤーのARNは次のとおりです。arn:aws:lambda ::: awslayer:AmazonLinux1703

手順は pcoming-updates-to-the-aws-lambda-execution-environment で説明されています

長期的な解決策があればすばらしいでしょう。

1
Nicolas Oste