🎉

AWS Lambda で Go のランタイム選択時のクロスコンパイル

2022/07/13に公開

はじめに

AWS Lambda でランタイムに Go 1.x を指定してアーキテクチャを arm64 にすると以下のエラーが表示される。

Runtime go1.x does not support the following architectures [arm64]. Please select different architectures from [x86_64] or select a different runtime.

ランタイムに Go 1.x を指定した場合に arm64 はサポートされていないとのことで、アーキテクチャは x86_64 を選択する必要がある。
M1 Mac を使ってローカル環境で zip を作成する際には以下のコマンドを実行する。

$ GOARCH=amd64 GOOS=linux go build -o hoge

go build コマンド実行時の $GOARCH$GOOS の環境変数について気になったので調べてみる。

$GOARCH$GOOS

$GOARCH はコンパイルアーキテクチャの名前である。
$GOOS はターゲットオペレーティングシステムの名前である。

クロスコンパイル

対象にするシステム上で実行するには、クロスコンパイルをする必要がある。
クロスコンパイルをする際には $GOARCH$GOOS の環境変数を指定して実行する。
$GOARCH$GOOS の環境変数に指定する値は以下のコマンドから確認ができる。

$ go tool dist list

JSON形式で出力したい場合は以下のコマンドを実行する。

$ go tool dist list -json

おわりに

クロスコンパイルの指定をせずに go build して zip を AWS Lambda にアップロードして実行すると以下のエラーが表示されたため、気になって調べてみました。

fork/exec /var/task/hoge: exec format error: PathError

これでプロセッサの違いが分かる大人になれたと思います。

Discussion