概要
ビルドプロジェクトを少し編集してからCodebuildを走らせたら以下のエラー。
./script.sh: exec format error
うむ?ビルドプロジェクトでそんな重要なところいじった記憶はないのに...
と言うことでこちらのエラーの原因がわかったので紹介します。
原因:「オペレーションシステム」の選択
今回編集したのは、以下にある環境変数。
CodeBuild -> ビルドプロジェクト -> 該当プロジェクト -> 編集 -> 環境
そこで一つ思い出す。
以前は出てなかった気がしたのですが、「オペレーションシステム」に何も選ばない状態で更新をしようとすると、「オペレーションシステムを選択する必要があります」と言うエラーが出ます。
(適当に)一番上のを選んでいたのですが、ここに原因がありました。
解決策
以下のように、ビルド環境をARMアーキテクチャからx86_64アーキテクチャに変更するで解決しました。
./script.sh
スクリプトがARMアーキテクチャでは実行できない形式だったのです。
エラーになった設定
aws/codebuild/amazonlinux2-aarch64-standard:2.0
エラーが解消された設定
aws/codebuild/amazonlinux2-x86_64-standard:5.0-24.02.08
このスクリプトには、nginx
やgunicorn
、alembic
などのコマンドやプログラムがあったのですが、ARMアーキテクチャではなくx86_64アーキテクチャで動作するように作られていた可能性が高いです。もしくは、それらに依存しているPythonインタープリタやライブラリが特定のアーキテクチャ向けだった場合もありますね。
どのアーキテクチャで動作するかを確認する場合は、それらのバイナリファイルに対してfile
コマンドを実行するとわかります。
file $(which nginx)
/usr/sbin/nginx: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=29eeec75474b0468b8cfc3029beed211a830f23e, for GNU/Linux 3.2.0, stripped