My Note

自己理解のためのブログ

Lambdaレイヤーを利用してラインタイムPython上でgoバイナリを実行 & レイヤーをバージョン管理する

今回はLambdaレイヤーについて簡単な検証とレイヤーのバージョン管理について検証しました。

Lambdaレイヤーとは

docs.aws.amazon.com

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 タグを埋め込めるので何のバージョンのものかすぐにわかるようにできそうです。