目次
準備
詳しい構築内容は今回省略させていただきます。
下記の記事の内容をまず構築してくだい
DockerのLambdaコンテナイメージをgolangで動かしてみた – Qiita
AWSで公開されているgolangのLambdaコンテナイメージを動かしてみました。パッケージの構成├── docker│ └── lambda-go-test│ └── Docke…
しかし、この記事エラーが発生します
そこで今回はエラーを通じて、Gateで言語の理解を深めていきましょう
発生するエラー1:fork/exec /var/task/main: no such file or directory
記事に記載されている通り、次のエラーが発生する
{"errorMessage":"fork/exec /var/task/main: no such file or directory","errorType":"PathError"}
原因
mainファイルがないことが原因です。
lambdaはデフォルトだと、go buildで生成されたmainファイルを実行します。
しかし、mainファイルがないためエラーを出しているのです。
error “fork/exec /var/task/main: no such file or directory” while executing aws-lambda function
Getting error fork/exec /var/task/main: no such file or directory while executing lambda function.
I am using windows platform to run and build code in Go.
I ha…
そのため、下記のコマンドを実行して、ビルドします。
go build main.go
これでmainファイルが生成されます
発生するエラー2:fork/exec /var/task/main: exec format error
さきほどbuildした結果、mainファイルが生成されました
しかし、下記のエラーが発生します。
{"errorMessage":"fork/exec /var/task/main: exec format error","errorType":"PathError"}
format errorが発生していることがわかりました。
このエラーは、下記のコマンドでバイナリを作り直せば解消されます。
GOARCH=amd64 GOOS=linux go build main.go
原因
Lambda環境下に合わせた、OS名(GOOS)と命令セットアーキテクチャ名(GOARCH)の指定ができていなかったことが原因です。
まず、Go言語の公式ドキュメントに記載されているGOOSとGOARCHの組み合わせを確認します。
lambdaはlinux環境なので、GOOSはlinuxを指定します。そのため、下記の選択肢に絞られます
linux 386
linux amd64
linux arm
linux arm64
linux loong64
linux mips
linux mipsle
linux mips64
linux mips64le
linux ppc64
linux ppc64le
linux riscv64
linux s390x
lambdaの命令セットアーキテクチャを確認すると、amd64を採用されていることがわかりました。
Lambda 関数の命令セットアーキテクチャの選択と設定 – AWS Lambda
Lambda 関数に ARM64 または x86 命令セットアーキテクチャを選択して設定する方法について説明します。
lambdaは、GOOS: linux、GOARCH: amd64環境下で
GOARCH=amd64 GOOS=linux go build main.go
このように、OS名(GOOS)と命令セットアーキテクチャ名(GOARCH)の組み合わせが正しくないと、
ビルドしたバイナリは失敗することがわかりました。
コメント