ツー

日常の記録

Lambda上でnodeのsharpが動かないのをなんとかする

現状

長らく放置していたnode(version8くらい)で作ったイメージをリサイズするLambdaが死んでいたので修正していた。

死ぬようになった原因は、Lambdaを実行するイメージのベースがAmazonLinux2に移行してimagemagickがデフォルトで含まれなくなったせいなので、最初は imagemagick を入れ直そうと思った。

けど、Lambdaレイヤー入れるとか話が大きくなるし、実際試してみたらうまくいかなかったので、CloudFrontのLambda@edgeの例で使われている sharp に入れ変えるために試行錯誤した。

Lambdaの修正

先に修正例から。画像をリサイズするコードをimagemagickで書いた例。

const im = require('imagemagick');
const img = await new Promise((resolve, reject) => {
    im.resize({ srcData: obj.Body, format: extension, height: 200 }, function (err, stdout, stderr) {
        if (err) { reject(err) }
        else { resolve({ ct: contentType, output: stdout }) }
    });
});

上記コードを sharpで書いた例。

const sharp = require('sharp');
const img = await sharp(obj.Body).resize({ width: 200 }).toBuffer();

Promiseの有り無しがあるけれど大体同じ感じ。コードが簡単に入れ替えられるならこれで良さそう。

インストール

インストールはいつも通りコマンドで一発

npm i sharp

いざソースを上げてみるとエラーが出る。

Could not load the "sharp" module using the linux-x64 runtime
Possible solutions:
- Ensure optional dependencies can be installed:
    npm install --include=optional sharp
    yarn add sharp --ignore-engines
- Ensure your package manager supports multi-platform installation:
    See https://sharp.pixelplumbing.com/install#cross-platform
- Add platform-specific dependencies:
    npm install --os=linux --cpu=x64 sharp
- Consult the installation documentation:
    See https://sharp.pixelplumbing.com/install
 "Could not load the \"sharp\" module using the linux-x64 runtime
ERR_DLOPEN_FAILED: libvips-cpp.so.42: cannot open shared object file: No such file or directory\nPossible solutions:
- Ensure optional dependencies can be installed:
    npm install --include=optional sharp
    yarn add sharp --ignore-engines
- Ensure your package manager supports multi-platform installation:
    See https://sharp.pixelplumbing.com/install#cross-platform
- Add platform-specific dependencies:
    npm install --os=linux --cpu=x64 sharp
- Consult the installation documentation:
    See https://sharp.pixelplumbing.com/install",

メッセージを見るにプラットフォームごとのライブラリが入っていないと言うのがわかる。上記エラーメッセージにも npm install --os=linux --cpu=x64 sharp を実行してプラットフォームのライブラリをインストールしろと書いてある。でも実行してもうまくいかない。

最終的に下記のようにインストールしたらうまくいった。

npm i @img/sharp-linux-x64
npm i @img/sharp-libvips-linux-x64

プラットフォーム固有のインストールをpackage.jsonに書くのはよろしくない気はするが、Lambdaしか使わないのでこれでよしとする。

まとめ

EOLまで放置するな。