Lambdaレイヤーを利用してラインタイムPython上でgoバイナリを実行 & レイヤーをバージョン管理する
今回はLambdaレイヤーについて簡単な検証とレイヤーのバージョン管理について検証しました。
Lambdaレイヤーとは
Lambda レイヤーは、Lambda 関数で使用できるライブラリとその他の依存関係をパッケージ化するための便利な方法を提供します。レイヤーを使用することで、アップロードされたデプロイメントアーカイブのサイズを削減し、コードをデプロイするスピードを速めることができます。 レイヤーは、追加のコードまたはデータを含むことができる .zip ファイルアーカイブです。レイヤーには、ライブラリ、 カスタムランタイム 、データ、または設定ファイルを含めることができます。レイヤーを使用すると、コードの共有と責任の分離を促進し、ビジネスロジックの記述をより迅速に繰り返すことができます。
レイヤーを利用することで
- 複数のlambdaで共通的に利用可能なライブラリを作れる
- ライブラリの依存関係をパッケージ化できる
- zipでコードやデータをアップロードして使える
- レイヤーに持たせることでlambdaにデプロイするデータサイズを削減できる
試してみる
やりたい事は、goのバイナリをLambdaレイヤーに登録してpythonランタイムの関数からの実行です。 レイヤーに登録するGoのコード。これをコンパイルして利用しました。
package main import "fmt" func main() { fmt.Println("hello world lambda layer") }
次はlambdaのレイヤーを作成するためのzipを用意します。
Lambda レイヤーの作成と共有 - AWS Lambda
このドキュメントの ライブラリの依存関係をレイヤーに含める
の項目に
すべてのランタイムは /bin
にPATHが通っているようなので、 ./bin/main にバイナリを配置して
zip化しました。
❯ ls bin main.go ❯ ls bin/ main ❯ zip -r go-cmd.zip bin
今回はAWSコンソールからポチポチしてレイヤーを作成しました。
レイヤーをLambda関数に追加して利用できる状態になったのでPythonでgoバイナリを実行します。 利用したのは以下のコードです。
- lambda_function.py
import subprocess def lambda_handler(event, context): cmd = ['main'] out = subprocess.run(cmd, stdout=subprocess.PIPE) print(out.stdout.decode())
■ 実行結果
Function Logs START RequestId: 68838428-bb76-4af7-86ab-4805669c676f Version: $LATEST hello world lambda layer END RequestId: 68838428-bb76-4af7-86ab-4805669c676f
hello world lambda layer
と表示されて実行できました。
レイヤーをバージョン管理する
レイヤーをコード管理する場合にバージョン管理する必要が出てくると思います。 そこで、バージョンに対してcommit-idやtag名などを付与できるか確認しました。
lambdaレイヤーを更新するために aws-cliを利用しました。(publish-layer-version
)
awscli.amazonaws.com
バージョンは1からインクリメントされていくので、レイヤーを更新するときに description
オプションを付与して仮のtag名(v0.0.1)を付与しました。
github actionsのworkflowを利用していればtag pushをトリガーにtag名を取得してレイヤーを更新するときに descriptionに付与できます。
- lambdaレイヤーを更新するコマンド (aws-vaultを利用した場合)
❯ aws-vault exec ${profile} -- aws lambda publish-layer-version \ --layer-name go-cmd \ --description "v0.0.1" \ --zip-file fileb://go-cmd.zip \ --compatible-runtimes python3.9
新しくレイヤーを更新したら以下のようになりました。説明の部分に v0.0.1
タグを埋め込めるので何のバージョンのものかすぐにわかるようにできそうです。