# ============================================================ # API Gateway (HTTP API) # ============================================================ resource "aws_apigatewayv2_api" "api" { name = "${local.prefix}-api" protocol_type = "HTTP" cors_configuration { allow_origins = ["*"] allow_methods = ["POST", "OPTIONS"] allow_headers = ["Content-Type", "X-Api-Key"] max_age = 86400 } } resource "aws_apigatewayv2_stage" "default" { api_id = aws_apigatewayv2_api.api.id name = "$default" auto_deploy = true } resource "aws_apigatewayv2_integration" "submit" { api_id = aws_apigatewayv2_api.api.id integration_type = "AWS_PROXY" integration_uri = aws_lambda_function.submit.invoke_arn payload_format_version = "2.0" } resource "aws_apigatewayv2_route" "submit" { api_id = aws_apigatewayv2_api.api.id route_key = "POST /submit" target = "integrations/${aws_apigatewayv2_integration.submit.id}" } resource "aws_lambda_permission" "apigw" { statement_id = "AllowAPIGateway" action = "lambda:InvokeFunction" function_name = aws_lambda_function.submit.function_name principal = "apigateway.amazonaws.com" source_arn = "${aws_apigatewayv2_api.api.execution_arn}/*/*" } # ============================================================ # Outputs # ============================================================ output "api_endpoint" { value = aws_apigatewayv2_stage.default.invoke_url } output "s3_bucket" { value = aws_s3_bucket.media.id }