- 筒井悠平
- 約 800 文字
- 600 View
筒井です。
GoとAWS LambdaのためのMakefileを整理しました。
Lambda Functionの増加と同時に増えていくターゲットにはオサラバです。
前提・ディレクトリ構造
次のようなディレクトリ構造を前提としています。
. |
- dist : ビルドしたバイナリの出力先。このディレクトリを固めてデプロイします
- handler/funcN : 各Lambda Function用のパッケージ
- lib1, lib2 : Lambda Functionが依存するパッケージ(ライブラリ)
またデプロイはServerless Frameworkを使用することを想定しています。
次のようにServerlessの設定を書けば、良い感じにバイナリのみをデプロイ出来るようにします。
# serverless.yml |
Makefile
各Lambda Functionを一気にビルドするためのMakefileです。
# Makefile |
これだけだと黒魔術に近いので解説していきます。
変数の扱いがわかりにくと思いますので、コメントで展開例を記載しています。
まずターゲット handlers の依存に、各バイナリを追加します。
# TARGETS := dist/func1 dist/func2 |
各バイナリのビルド方法を書きます。
自動変数 $< の手前につけた ./ は、相対パスでパッケージを指定する際は必須です。
# dist/func1: handler/func1 handler/func1/main.go ... go.sum |
依存の $(DEPFILES) 以下が無くてもビルドは可能です。
しかしここで各ソースファイルを指定しておかないと、Makeがソースの変更を検知できません。
$(DEPFILES) には、各パッケージ配下の .go ファイルを集めています。
DEPFILES := |
これで make handlers で一度に全てのバイナリがビルドできるようになりました。
また make -j で並列実行も出来て便利です。Lambda Functionを追加した際には、LAMBDA_HANDLERS を追記するだけでOKです。
make func1、make func2…と繰り返すのと比べると、「Makefileは直したけどCIの設定ファイルを直してなかった!」なんてことも無く安心ですね。