🛕
LambdaのレイヤーをTerraformでデプロイする
やりたいこと
LambdaのレイヤーをTerraformでデプロイする。
手動でデプロイしてる例は色々見かけたがTerraformでデプロイしてる例が見当たらなかったため備忘録。
やりかた
Pythonのrequestsライブラリをレイヤーにする場合。
事前準備
- 以下のようなディレクトリにしておく
- lambda
- function_source # 関数のソース
- sample.py
- layer # このディレクトリ名はなんでもいい
- python # このディレクトリは絶対に「Python」にしないといけない!
- main.tf # ここでLambdaや関連リソースのresourceを定義
- pythonディレクトリ配下にライブラリをインストールする
pip install requests -t python/
Layer側
pythonではなく一個上のlayerディレクトリを圧縮して使うことに注意
# layerをZIP化
data "archive_file" "requests_layer" {
type = "zip"
source_dir = "${path.module}/layer" # pythonではなく一個上のlayerディレクトリを圧縮する
output_path = "${path.module}/layer.zip"
}
# layerを作成
resource "aws_lambda_layer_version" "requests" {
layer_name = "requests"
filename = data.archive_file.requests_layer.output_path
compatible_runtimes = ["python3.13"]
source_code_hash = data.archive_file.requests_layer.output_base64sha256
}
関数のソースコード(おまけ)
data "archive_file" "lambda_source" {
type = "zip"
source_dir = "${path.module}/function_source"
output_path = "${path.module}/function_source.zip"
}
Lambda側
resource "aws_lambda_function" "sample" {
function_name = "sample"
role = aws_iam_role.sample.arn
filename = data.archive_file.lambda_source.output_path
source_code_hash = data.archive_file.lambda_source.output_base64sha256
handler = "sample.lambda_handler"
runtime = "python3.13"
timeout = 30
# Layerを指定
layers = [aws_lambda_layer_version.requests.arn]
#(後略)
}
注意点
pythonディレクトリじゃなくて、その一個上のディレクトリから圧縮して渡してあげる必要があることに注意
Discussion