Skip to content

Serverless API (Terraform)

Source: examples/serverless-api.yaml

To check and price this model from a clone of the repository:

infra-cost-model validate examples/serverless-api.yaml
infra-cost-model compute --time-basis monthly examples/serverless-api.yaml
# Example: Serverless API (Terraform)
# Demonstrates: entry node branching with call rates, shared leaf node (DynamoDB),
# different Lambda configurations, PAY_PER_REQUEST DynamoDB pricing.
#
# Issue: https://github.com/elecnix/infra-cost-model/issues/3

version: "1.0"

workflow:
  name: serverless-api
  entry: aws_apigatewayv2_api.items_api
  frequency:
    unit: perMinute
    value: 1000

nodes:
  aws_apigatewayv2_api.items_api:
    nodeType: routing
    resourceAddress: aws_apigatewayv2_api.items_api
    provider: aws
    region: us-east-1
    service: AmazonAPIGatewayHTTP
    usageMetrics:
      requests: { unit: requests, value: 1 }

  # An HTTP API has no egress price of its own. AWS bills the response bytes
  # as data transfer out to the internet.
  data_transfer.items_api_egress:
    nodeType: external
    resourceAddress: data_transfer.items_api_egress
    provider: aws
    region: us-east-1
    service: AWSDataTransfer
    usageMetrics:
      internetOutGb: { unit: GB, value: 0.00005 }   # 50KB per request

  aws_lambda_function.get_items:
    nodeType: compute
    resourceAddress: aws_lambda_function.get_items
    provider: aws
    region: us-east-1
    service: AWSLambda
    usageMetrics:
      invocations: { unit: requests, value: 1 }
      avgDurationMs: { unit: ms, value: 50 }
      memoryMb: { unit: MB, value: 256 }

  aws_lambda_function.create_item:
    nodeType: compute
    resourceAddress: aws_lambda_function.create_item
    provider: aws
    region: us-east-1
    service: AWSLambda
    usageMetrics:
      invocations: { unit: requests, value: 1 }
      avgDurationMs: { unit: ms, value: 200 }
      memoryMb: { unit: MB, value: 512 }

  aws_dynamodb_table.items:
    nodeType: storage
    resourceAddress: aws_dynamodb_table.items
    provider: aws
    region: us-east-1
    service: AmazonDynamoDB
    usageMetrics:
      # Each metric counts only the calls over edges of its type, so a read
      # is not also charged as a write.
      readRequests: { unit: requests, value: 1, edgeType: read }
      writeRequests: { unit: requests, value: 1, edgeType: write }

edges:
  # Every response leaves AWS as data transfer out
  - from: aws_apigatewayv2_api.items_api
    to: data_transfer.items_api_egress
    rate: 1

  # Entry branching: 70% reads, 30% writes
  - from: aws_apigatewayv2_api.items_api
    to: aws_lambda_function.get_items
    rate: 0.7
  - from: aws_apigatewayv2_api.items_api
    to: aws_lambda_function.create_item
    rate: 0.3

  # Read path
  - from: aws_lambda_function.get_items
    to: aws_dynamodb_table.items
    rate: 1
    type: read

  # Write path
  - from: aws_lambda_function.create_item
    to: aws_dynamodb_table.items
    rate: 1
    type: write