🛕

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