# Terraform Lambda Deployment ## Terraform Lambda Deployment ```hcl # main.tf terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } } provider "aws" { region = var.aws_region } # Lambda execution role resource "aws_iam_role" "lambda_role" { name = "lambda-execution-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } }] }) } # CloudWatch Logs policy resource "aws_iam_role_policy_attachment" "lambda_logs" { role = aws_iam_role.lambda_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" } # S3 Lambda Layer (dependencies) resource "aws_lambda_layer_version" "dependencies" { filename = "layer.zip" layer_name = "nodejs-dependencies" compatible_runtimes = ["nodejs18.x"] } # Lambda function resource "aws_lambda_function" "api_handler" { filename = "lambda.zip" function_name = "api-handler" role = aws_iam_role.lambda_role.arn handler = "index.handler" runtime = "nodejs18.x" timeout = 30 memory_size = 256 layers = [aws_lambda_layer_version.dependencies.arn] environment { variables = { STAGE = "production" DB_HOST = var.database_host } } depends_on = [aws_iam_role_policy_attachment.lambda_logs] } # API Gateway trigger resource "aws_lambda_permission" "api_gateway" { statement_id = "AllowAPIGatewayInvoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.api_handler.function_name principal = "apigateway.amazonaws.com" } # S3 trigger resource "aws_lambda_permission" "s3_trigger" { statement_id = "AllowS3Invoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.api_handler.function_name principal = "s3.amazonaws.com" source_arn = aws_s3_bucket.upload_bucket.arn } resource "aws_s3_bucket_notification" "bucket_notification" { bucket = aws_s3_bucket.upload_bucket.id depends_on = [aws_lambda_permission.s3_trigger] lambda_function { lambda_function_arn = aws_lambda_function.api_handler.arn events = ["s3:ObjectCreated:*"] filter_prefix = "uploads/" filter_suffix = ".jpg" } } ```