概要
HTTP APIをLambdaで動かすときは、AWS Apigateway & Lambdaの構成を取ることが多いが、今回はALBをトリガーとしてLambdaを動かす機会があったので、terraformでの作り方をまとめる。
LambdaをTerraformで作成する
まずは、Lambdaを作る。
resource "aws_lambda_function" "sample" { function_name = "sample_function" description = "Awesome API" role = aws_iam_role.metric_api.arn package_type = "Image" image_uri = "{コンテナイメージリポジトリのURI}" timeout = 60 memory_size = 128 vpc_config { security_group_ids = [{セキュリティグループのID}] subnet_ids = [{サブネットのID}] } }
ALBをTerraformで作成する
ALB、ターゲットグループ、リスナーグループを作成する。
resource "aws_alb" "alb" { name = "sample-alb" internal = false security_groups = [{セキュリティグループのID}] subnets = [{サブネットのID}] enable_deletion_protection = false idle_timeout = "60" access_logs { bucket = "{アクセスログを置くS3バケット}" enabled = true prefix = "alb/" } } resource "aws_alb_target_group" "tg" { name = "sample_lambda_target_group" target_type = "lambda" } resource "aws_alb_listener" "https_listener" { load_balancer_arn = aws_alb.alb.arn port = 443 protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-2016-08" certificate_arn = {ACMのARN} default_action { type = "forward" target_group_arn = aws_alb_target_group.tg.arn } }
ALBがLambdaをトリガーできるように構成する
ALBがLambdaをトリガーできるように設定する。
resource "aws_lambda_permission" "alb" { statement_id = "AllowExecutionFromALB" action = "lambda:InvokeFunction" function_name = aws_lambda_function.sample.function_name principal = "elasticloadbalancing.amazonaws.com" source_arn = aws_alb_target_group.tg.arn }
最後に、ALBのターゲットグループとLambdaを紐付ける。
resource "aws_lb_target_group_attachment" "metric_api" { target_group_arn = aws_alb_target_group.tg.arn target_id = aws_lambda_function.sample.arn }
以上です。