実行環境に応じたバイナリの作成が重要

振り返り

学び

Discord上で、対面活動を定期アナウンスするBotを作成した。
以下、振り返り。

実装した機能

  • メンション付きで全員に通知。

  • Botがリアクションをあらかじめセット → メンバーは押すだけで反応できる

  • AWS Lambdaにデプロイし、クラウド環境で定期実行(手動実行ではない)

実装の流れ

1.手動実行でBotの動作確認

  • Discord APIとやり取りできるか確認

  • メッセージが正しく投稿されるか確認

2.AWS Lambdaに対応する形へコード変更

  • WebSocket通信やそれに関した部分の消去

  • handler関数をエントリーポイントに設定

3.AWS Lambdaへのデプロイ準備として、バイナリファイルの作成

  • 実行環境に合ったバイナリが必要

  • Lambda用のアーキテクチャでビルドする(Windows環境でのビルド方法)

4.デプロイ & テスト

  • zipに圧縮したバイナリをAWS Lambdaにアップロード。

  • テスト、デバック。

  • 正しい動作確認後、トリガー設定(CloudWatch Eventsでスケジュール実行を設定)。

    ※ UTC基準より、日本時間の22時に実行する際は cron(0 13 ? MON,THU )

学び

1.バイナリの実行環境を考慮する重要性

  • WindowsとAWS Lambdaの違い

    • 開発環境(Windows):GOOS=windows、GOARCH=amd64

    • 本番環境(AWS Lambda):GOOS=linux、GOARCH=arm64

Windowsでビルドしたバイナリ(`.exe`)は Linuxでは動かない ため、 Linux & ARM64用のバイナリを作成する必要あり。

  • GOARCH や arm64とは?

    • GOARCH(Go Architecture) → ターゲットアーキテクチャ(amd64, arm64 など)

    • GOOS(Go Operating System) → ターゲットOS(windows, linux など)

Goコンパイル時は、他の環境下でも動作するよう、どのOS・CPUアーキテクチャ向けにビルドするか決める必要がある。 AWS Lambdaではarm64を使うため、Windows上で GOARCH=arm64 と GOOS=linux を設定してビルドする。

2.WindowsでのLinux向けバイナリ作成方法

  • Windows上でのバイナリをビルドすると、デフォルトは「GOOS=windows, amd64」のバイナリになってしまう。

    Linux + ARM64向けのバイナリを作成(クロスコンパイル)するには、以下のようにプロセス変数を設定する必要あり。

~~WindowsのPowerShellでの、クロスコンパイル方法~~

$env:GOOS = "linux"
$env:GOARCH = "arm64"

このように、PowerShellでプロセス変数を使い、一次的にGoのビルド対象をWindows → Linux へ変更している』
($env:PowerShellのシェル変数(プロセス変数) を設定する書き方)

3.シェル変数設定後のgo buildコマンド

go build -tags lambda.norpc -o bootstrap main.go

  • -o bootstrap → 出力ファイル名を bootstrap に指定
    AWS Lambda では、Goのバイナリ名を bootstrap にする必要がある。

  • main.go → コンパイル対象のGoファイル

  • -tags lambda.norpc → AWS Lambdaで RPC通信を無効化→Lambda用にいい感じにしてる、なくてもよい。

結論

  • Windowsでの開発は AWS Lambdaと環境が違う ため、ビルド時に 環境変数を設定することがめちゃ大事。

  • Windowsでクロスコンパイルする際は、プロセスごとに毎回Powershellで設定すること。


yuto0024の画像
yuto0024

yuto0024 has shared 28 reflections. Discover new insights this platform.