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