■ はじめに
大分、久しぶりに、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