2

「argon2」というパッケージの「無効な ELF ヘッダー」というエラーが表示されます。サーバーレス フレームワークを介して AWS Lambda にコードをアップロードする場合。ローカルで実行すると、コードは完全に実行されます。

MacOS Big Sur バージョン 11.4 での開発

私が得ているエラーの画像

エラーについて少し調べたところ、Docker を使用してパッケージをコンパイルしてから Lambda に送信するように言われています。私は Docker をあまり使ったことがなく、Docker ソリューションを試す前に他のオプションを検討したいと考えていました。

ガイダンスやヘルプをいただければ幸いです。私はこのバグで1日か2日以上立ち往生しています。

4

2 に答える 2

2

何が起こっている?

使用しているパッケージ ( argon2) には、arg2 アルゴリズムの C 実装へのバインドが含まれています。つまり、パッケージ自体が C で記述されたライブラリをラップし、node.js 環境内でアクセスできるようにします。

その C パッケージもパッケージに同梱されており、実行時にコンパイル (またはダウンロード) されますnpm install argon2。つまり、Argon2 をインストールすると、ファイル システムにバイナリ共有ライブラリが作成され、ノード環境と接続されます。MacOS にインストールしているため、バイナリは Mac 用にコンパイル (またはダウンロード) されます。これは、ELF ファイル (Linux が実行可能ファイルに使用する形式) ではなく、MACH-O ファイル (macOS 用の実行可能ファイルの形式) になることを意味します。

これで、(内部で Linux を実行している) Lambda は、Mac 上でビルドした実行可能ファイルが Linux 実行可能ファイルではないことを効果的に訴えます。

これをどのように修正しますか?

簡単に言えば、npm installLinux 用の Argon2 バージョンをビルドまたはダウンロードする方法が必要です。これを実現するには、2 つの異なる方法があります。一つを選ぶ:

  1. npm installLinux の場合

タイトルが示すように、Linux で依存関係をダウンロードしてビルドします。これを行うには、仮想マシンまたは Docker コンテナーを使用できます。別のオプションは、AWS ビルド SaaS 製品 (AWS CodeBuild) を使用してこれを行うことです。

  1. npm install --target_arch=x64 --target_platform=linux --target_libc=glibcMac で

ありがたいことに、Argon2 には node-pre-gyp のサポートが付属しています。ビルド前のバイナリを効果的に提供します。つまり、Linux バイナリをプルするだけで、自分でコンパイルする必要はありません。これを行うには、node_modules フォルダーを破棄して実行しますnpm install --target_arch=x64 --target_platform=linux。これにより、macOS ファイルの代わりに Linux ファイルがダウンロードされます。その後、すべてをラムダにプッシュできます。これは、Mac が Linux 実行可能ファイルを実行できないため、アプリケーションがローカルで実行されなくなることに注意してください ( npm installMacOS バージョンに戻すには、2 つのパラメーターを除外して再度実行する必要があります)。

Argon2 とは別に、MacOS をサポートしないパッケージが存在する可能性があることに注意してください。その場合、最初のオプションを使用する必要があります。

于 2021-09-24T19:17:36.660 に答える