api_gateway.tf 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. # ============================================================
  2. # API Gateway (HTTP API)
  3. # ============================================================
  4. resource "aws_apigatewayv2_api" "api" {
  5. name = "${local.prefix}-api"
  6. protocol_type = "HTTP"
  7. cors_configuration {
  8. allow_origins = ["*"]
  9. allow_methods = ["POST", "OPTIONS"]
  10. allow_headers = ["Content-Type", "X-Api-Key"]
  11. max_age = 86400
  12. }
  13. }
  14. resource "aws_apigatewayv2_stage" "default" {
  15. api_id = aws_apigatewayv2_api.api.id
  16. name = "$default"
  17. auto_deploy = true
  18. }
  19. resource "aws_apigatewayv2_integration" "submit" {
  20. api_id = aws_apigatewayv2_api.api.id
  21. integration_type = "AWS_PROXY"
  22. integration_uri = aws_lambda_function.submit.invoke_arn
  23. payload_format_version = "2.0"
  24. }
  25. resource "aws_apigatewayv2_route" "submit" {
  26. api_id = aws_apigatewayv2_api.api.id
  27. route_key = "POST /submit"
  28. target = "integrations/${aws_apigatewayv2_integration.submit.id}"
  29. }
  30. resource "aws_lambda_permission" "apigw" {
  31. statement_id = "AllowAPIGateway"
  32. action = "lambda:InvokeFunction"
  33. function_name = aws_lambda_function.submit.function_name
  34. principal = "apigateway.amazonaws.com"
  35. source_arn = "${aws_apigatewayv2_api.api.execution_arn}/*/*"
  36. }
  37. # ============================================================
  38. # Outputs
  39. # ============================================================
  40. output "api_endpoint" {
  41. value = aws_apigatewayv2_stage.default.invoke_url
  42. }
  43. output "s3_bucket" {
  44. value = aws_s3_bucket.media.id
  45. }