It's a peacehell world.

こんな名前ですが情報技術について主に扱うブログです。

[Amplify] ARM マシンでの開発で Amplify の Lambda Layer に x64 の sharp をインストールしたい

8 ヶ月ぶりの更新がこんなしょぼい内容であれですが、メモ代わりということで。

前提

  1. Amplify および AppSync リゾルバとして Lambda を利用している。
  2. AppSync リゾルバの Lambda で画像処理ライブラリ sharp を使いたい。

課題

  1. AWS Lambda で sharp を利用するには arch=x64 で npm install 必要。 sharp.pixelplumbing.com

  2. 従って npm install --arch=x64 sharp でデプロイしたいが amplify push の際には npm install でインストールされるようなのでオプション指定をどうする?

※ x64 のマシンで運用する分には問題ありませんが、ARM のマシン(例:M1 Mac)の際に端末のアーキテクチャでインストールされてしまいます。

対策

※ 最善策である保証はありません。

docs.npmjs.com

script の postinstall を利用して ARM でインストール後に x64 でのインストールで上書きするようにします。

{
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "sharp": "^0.31.0"
  },
  "scripts": {
    "postinstall": "SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch=x64 --platform=linux --libc=glibc sharp"
  }
}

これによって npm install した際に x64 で sharp がインストールされます。

めでたし。めでたし。

2022-09-13 追記

初回は問題ないのですが、複数回 push していると sharp/build ディレクトリが生成されない現象がありました。

npm install でそもそも端末アーキテクチャ依存の sharp をインストールしないように preinstall で消すことで対応できました。

{
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "sharp": "^0.31.0"
  },
  "scripts": {
    "preinstall": "npm uninstall sharp",
    "postinstall": "SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm install --arch=x64 --platform=linux --libc=glibc sharp"
  }
}