Creates an API using an AWS API Gateway and Lambda function, based on this walkthrough. The setup uses:
- API: FastAPI +Mangum
- Infrastructure: Terraform +Terragrunt
Requests are sent to the API Gateway, which has one /{proxy+} resource.  This resource handles all requests using a proxy integration with the Lambda function.  Mangum acts as a wrapper, which allows FastAPI to handle the requests and create responses the API gateway can serve.  All logs are sent to CloudWatch log groups.
          ┌─── AWS region ─────────────────────────────┐
          │                  ┌─── VPC: three AZs ────┐ │
          │                  │                       │ │
Request  ───►  API Gateway  ───►  Lambda (FastAPI)   │ │
          │                  │                       │ │
          │         │        └───────────│───────────┘ │
          │ ┌───────│────────────────────│───────────┐ │
          │ │       ▼      CloudWatch    ▼           │ │
          │ └────────────────────────────────────────┘ │
          └────────────────────────────────────────────┘If performance becomes an issue, a CloudFront distribution could be added for API responses that are cacheable.
cd api
make install
make install-dev
make serveView the API endpoints.
# Create the zip that will be used for the Lambda function
cd api
make zip
# Create the AWS infrastructure
cd ../infra/env/dev
terragrunt run-all plan   # to see all the goodness that will get created
terragrunt run-all apply  # create all the goodnessThe API gateway proxy integration with the Lambda function does not include a / root path.  If you need a root path, you'll need to add this method integration:
resource "aws_api_gateway_method" "api_gateway_root_method" {
  rest_api_id   = aws_api_gateway_rest_api.api_gateway.id
  resource_id   = aws_api_gateway_rest_api.api_gateway.root_resource_id
  http_method   = "ANY"
  authorization = "NONE"
}
resource "aws_api_gateway_integration" "api_proxy_integration" {
  rest_api_id             = aws_api_gateway_rest_api.api_gateway.id
  resource_id             = aws_api_gateway_rest_api.api_gateway.root_resource_id
  http_method             = aws_api_gateway_method.api_gateway_root_method.http_method
  integration_http_method = "POST"
  type                    = "AWS_PROXY"
  uri                     = aws_lambda_function.api_lambda.invoke_arn
}An API key is created and required by the API gateway. You can retrieve the key from the API's usage plan in the AWS console. To use the key:
curl --header "x-api-key: ${API_KEY_VALUE}" \
  https://${API_ID}.execute-api.${API_REGION}.amazonaws.com/dev/hello