【Terraform】Terraform ~ AWS Lambda / 入門編 ~

■ はじめに

大分、久しぶりに、Terraformを使うので
リハビリがてらに、AWS Lambdaをまとめていく

目次

【1】API
 1)aws_lambda_function
 2)aws_lambda_layer_version
 3)aws_lambda_permission
【2】Tips
 1)${path.module}
 2)archive_file
 3)filebase64sha256
【3】Hello World
 0)前提条件
 1)サンプル
 2)実行

【1】API

1)aws_lambda_function

* Lambda関数を作成

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function

resource "aws_lambda_function" "demo_func" {
   filename = "lambda.zip"
   # ★後述
   source_code_hash = data.archive_file.demo_lambda_function.output_base64sha256
   function_name = "demo-lambda"
   role = "arn:aws:iam::123456789012:role/your-role"
   handler = "index.handler"
   runtime = "python3.12"

   # For VPC
   vpc_config {
      # Every subnet should be able to reach an EFS mount target in the same Availability Zone. Cross-AZ mounts are not permitted.
      subnet_ids         = [aws_subnet.subnet_for_lambda.id]
      security_group_ids = [aws_security_group.sg_for_lambda.id]
   }

   # For Environment variables 
   environment {
       variables = {
           DST_BUCKET = "demo-${var.env}-bucket",
           REGION = "${var.aws_region}"
       }
   }
}

archive_file

* Lambdaをアップロードする際にzipにする必要があり、そのパスを指定

source_code_hash

* アップデートのトリガーに使用されるハッシュ
* コードを修正した際に、terraformがその修正を検知するためにハッシュ化してある

2)aws_lambda_layer_version

* Lambda レイヤー を作成

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_layer_version

3)aws_lambda_permission

* S3などのリソースに対して、Lambda関数のアクセス許可を付与

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission

【2】Tips

1)${path.module}

* モジュールのディレクトリを指す

https://y-ni-shi.hatenablog.com/entry/2020/06/22/235254

2)archive_file

*  archive_fileで ZIP圧縮する

https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file

# Archive a single file.
data "archive_file" "init" {
  type        = "zip"
  source_file = "${path.module}/init.tpl"
  output_path = "${path.module}/files/init.zip"
}

3)filebase64sha256

* ファイルをbase64エンコードしたSHA256ハッシュ値を返す

https://developer.hashicorp.com/terraform/language/functions/filebase64sha256

【3】Hello World

手始めに、最小単位の物を作ってみる

0)前提条件

* Lambda の IAMロールは、既に作成してあるもの
 ("arn:aws:iam::123456789012:role/your-role")とし、
 それを使うものとする

1)サンプル

* TFコードとLambdaの基になるPythonコードを作成する

フォルダ構成

├── lambda
│   └── main.py
└── main.tf

main.tf

# Lambdaをアップロードする際にzipにする必要があるので
# ファイルをZIP圧縮する
data "archive_file" "demo_zip" {
  type        = "zip"
  source_dir  = "${path.module}/lambda"
  output_path = "${path.module}/demo_lambda.zip"
}

# Lambda関数の作成
resource "aws_lambda_function" "demo_lambda" {
  function_name    = "demo-lambda"
  handler          = "main.handler"
  runtime          = "python3.12"
  filename         = data.archive_file.demo_zip.output_path
  source_code_hash = filebase64sha256(data.archive_file.demo_zip.output_path)
  # ★Need to modify, otherwise error 'AccessDeniedException: Cross-account pass role is not allowed'
  role = "arn:aws:iam::123456789012:role/your-role"
}

resource "aws_cloudwatch_log_group" "demo_log_group" {
  name = "/aws/lambda/${aws_lambda_function.demo_lambda.function_name}"
  retention_in_days = 30
}

main.py

import json

def handler(event, context):
    response = {
        'statusCode': 200,
        'body': 'Hello, World!'
    }
    return response

2)実行

# 初期化
terraform init

# 確認
terraform plan

# デプロイ
terraform apply --auto-approve

後片付け

terraform destroy

参考文献

https://zenn.dev/not75743/articles/7a7d3a2fc7e788
https://qiita.com/curlneko/items/15607f8ef319cc97a75e

関連記事

Terraform ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/04/05/000224
Terraform ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/12/09/222057
Terraform ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/05/03/000000
Terraform ~ local / variable ~
https://dk521123.hatenablog.com/entry/2023/12/24/173633
Terraform ~ tfstate / Backend ~
https://dk521123.hatenablog.com/entry/2023/05/05/004939
Terraform ~ Terraformあれこれ ~
https://dk521123.hatenablog.com/entry/2023/05/15/205352
Terraform ~ AWS ECR ~
https://dk521123.hatenablog.com/entry/2023/05/23/002314
Terraform ~ 複数環境へデプロイすることを考える ~
https://dk521123.hatenablog.com/entry/2023/05/06/003645
Terraform ~ AWS Lambda / あれこれ ~
https://dk521123.hatenablog.com/entry/2024/05/31/005406
Lambda ~ Python / 入門編 ~
https://dk521123.hatenablog.com/entry/2021/10/07/103317
Lambda ~ Python / 外部モジュール追加 ~
https://dk521123.hatenablog.com/entry/2024/05/25/005456
Lambda ~ Python / S3トリガー ~
https://dk521123.hatenablog.com/entry/2024/05/23/162229