【Lambda × Golang】エラー「"errorMessage": "fork/exec /var/task/main: exec format error"」を解消してみた
環境
Lambda関数を久しぶりに更新をかけてデプロイをしたところ、謎のエラーに遭遇したので対処法を簡単にまとめます。
環境は下記の通りです。
- Golang
- Lambda
- Event Bridge
- Serverless
エラー内容と対策
エラー内容
golangのソースコードを変更したのでファイルをビルドします。
$ GOOS=linux go build -o bin/main
ビルドが完了したらserverlessデプロイ。
$ sls deploy
デプロイが完了したので、AWSコンソールに移動。
Lambdaのコンソールからテスト実行したところ、該当のエラーが発生!
{
"errorMessage": "fork/exec /var/task/main: exec format error",
"errorType": "PathError"
}
対策
エラーメッセージを色々調べてみると「クロスコンパイル」の記事がちらほら。
色々な記事で書かれてある通り、とりあえず脳死でGOARCH=amd64の設定を追加して、再ビルド・再デプロイしたところ何事もなく動きました。
下記のコマンドでビルドしたところ問題なく実行できるようですね。
$ GOARCH=amd64 GOOS=linux go build -o bin/main
公式で調べたところ、コンパイル対象のOS名(GOOS)とアーキテクチャ名(GOARCH)の組み合わせが悪かったようです。
http://golang.org/doc/install/source#environment
逆に何故今まで動いてたんだ...?(謎だ)
さいごに
今回は脳死対応をしてしまいましたが、コンパイル周りが全く理解できていませんね。。。
時間が空いた時にしっかりと調べ直そうと思います。。。
一旦は動くようになったので、今回の記事は備忘録としてここまでとなります。
最後までご覧くださりありがとうございました。