Web開発ログ | エンジニアに役立つ情報 | 開発の中での気づきを発信

高卒Devlog

【Lambda × Golang】エラー「"errorMessage": "fork/exec /var/task/main: exec format error"」を解消してみた

thumbnail

こんにちは! RYOTAです!

当記事をご覧くださりありがとうございます!

Golangで謎のエラーと遭遇したので簡単なログとして書き残します。

環境

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
逆に何故今まで動いてたんだ...?(謎だ)

さいごに

今回は脳死対応をしてしまいましたが、コンパイル周りが全く理解できていませんね。。。
時間が空いた時にしっかりと調べ直そうと思います。。。
一旦は動くようになったので、今回の記事は備忘録としてここまでとなります。
最後までご覧くださりありがとうございました。