何が起こっている?
使用しているパッケージ ( argon2
) には、arg2 アルゴリズムの C 実装へのバインドが含まれています。つまり、パッケージ自体が C で記述されたライブラリをラップし、node.js 環境内でアクセスできるようにします。
その C パッケージもパッケージに同梱されており、実行時にコンパイル (またはダウンロード) されますnpm install argon2
。つまり、Argon2 をインストールすると、ファイル システムにバイナリ共有ライブラリが作成され、ノード環境と接続されます。MacOS にインストールしているため、バイナリは Mac 用にコンパイル (またはダウンロード) されます。これは、ELF ファイル (Linux が実行可能ファイルに使用する形式) ではなく、MACH-O ファイル (macOS 用の実行可能ファイルの形式) になることを意味します。
これで、(内部で Linux を実行している) Lambda は、Mac 上でビルドした実行可能ファイルが Linux 実行可能ファイルではないことを効果的に訴えます。
これをどのように修正しますか?
簡単に言えば、npm install
Linux 用の Argon2 バージョンをビルドまたはダウンロードする方法が必要です。これを実現するには、2 つの異なる方法があります。一つを選ぶ:
npm install
Linux の場合
タイトルが示すように、Linux で依存関係をダウンロードしてビルドします。これを行うには、仮想マシンまたは Docker コンテナーを使用できます。別のオプションは、AWS ビルド SaaS 製品 (AWS CodeBuild) を使用してこれを行うことです。
npm install --target_arch=x64 --target_platform=linux --target_libc=glibc
Mac で
ありがたいことに、Argon2 には node-pre-gyp のサポートが付属しています。ビルド前のバイナリを効果的に提供します。つまり、Linux バイナリをプルするだけで、自分でコンパイルする必要はありません。これを行うには、node_modules フォルダーを破棄して実行しますnpm install --target_arch=x64 --target_platform=linux
。これにより、macOS ファイルの代わりに Linux ファイルがダウンロードされます。その後、すべてをラムダにプッシュできます。これは、Mac が Linux 実行可能ファイルを実行できないため、アプリケーションがローカルで実行されなくなることに注意してください ( npm install
MacOS バージョンに戻すには、2 つのパラメーターを除外して再度実行する必要があります)。
Argon2 とは別に、MacOS をサポートしないパッケージが存在する可能性があることに注意してください。その場合、最初のオプションを使用する必要があります。