Pricing (AWS Price List Service)
Protocol: JSON 1.1
Header: X-Amz-Target: AWSPriceListService.<Action>
Endpoint prefix: api.pricing
Floci emulates the AWS Price List Service backed by a bundled static snapshot.
Responses match the real AWS wire format so AWS SDK and CLI clients accept the
reply without modification. The bundled snapshot covers a minimal, representative
set of services and regions; for broader coverage, point Floci at your own
snapshot with FLOCI_SERVICES_PRICING_SNAPSHOT_PATH.
Supported Operations
| Operation | Notes |
|---|---|
DescribeServices |
Lists bundled services and their queryable attribute names |
GetAttributeValues |
Returns the set of values a given attribute can take |
GetProducts |
Returns PriceList as an array of JSON-encoded product-offer strings (matches AWS format) |
ListPriceLists |
Lists available price-list ARNs filtered by service, currency, and optional region |
GetPriceListFileUrl |
Returns a stub HTTPS URL; useful for code paths that validate URL presence |
Pagination is supported on all list operations via NextToken + MaxResults.
Bundled Snapshot
The default snapshot on the classpath covers:
| ServiceCode | Regions | Notes |
|---|---|---|
AmazonEC2 |
us-east-1 (Linux/Shared tenancy, 3 instance types) |
t3.micro, m5.large, c5.large |
AmazonS3 |
us-east-1 (Standard storage) |
|
AWSLambda |
us-east-1 (Requests) |
The snapshot is intentionally minimal — enough to exercise SDK parsing and filter logic — not a comprehensive price database.
Configuration
| Variable | Default | Description |
|---|---|---|
FLOCI_SERVICES_PRICING_ENABLED |
true |
Enable or disable the service |
FLOCI_SERVICES_PRICING_SNAPSHOT_PATH |
(unset) | Filesystem directory overriding the bundled snapshot |
Snapshot directory layout
When FLOCI_SERVICES_PRICING_SNAPSHOT_PATH is set, Floci reads files in this
layout (falling back to the classpath entry for any file that does not exist):
<path>/
services.json # [ { "ServiceCode": "...", "AttributeNames": [...] } ]
attribute-values/<ServiceCode>/<Attr>.json # [ { "Value": "..." } ]
products/<ServiceCode>/<Region>.json # [ { "product": {...}, "terms": {...}, ... } ]
price-lists/<ServiceCode>.json # [ { "PriceListArn": "...", "RegionCode": "...", ... } ]
Each product entry is stored as a JSON object; Floci re-serializes it into the array-of-JSON-strings shape AWS returns. Drop in a full snapshot generated from the AWS Price List Bulk API when the bundled fixtures are insufficient.
Examples
export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
aws pricing describe-services --service-code AmazonEC2
aws pricing get-attribute-values \
--service-code AmazonEC2 --attribute-name instanceType
aws pricing get-products \
--service-code AmazonEC2 \
--filters 'Type=TERM_MATCH,Field=instanceType,Value=t3.micro' \
'Type=TERM_MATCH,Field=regionCode,Value=us-east-1'
aws pricing list-price-lists \
--service-code AmazonEC2 \
--effective-date 2026-01-01T00:00:00Z \
--currency-code USD
import boto3
client = boto3.client(
"pricing",
endpoint_url="http://localhost:4566",
region_name="us-east-1",
)
resp = client.get_products(
ServiceCode="AmazonEC2",
Filters=[
{"Type": "TERM_MATCH", "Field": "instanceType", "Value": "t3.micro"},
{"Type": "TERM_MATCH", "Field": "regionCode", "Value": "us-east-1"},
],
)
for item in resp["PriceList"]:
# AWS returns PriceList as an array of JSON strings; parse each separately.
import json
print(json.loads(item)["product"]["sku"])
Out of Scope
- Bulk download of full regional price lists (
GetPriceListFileUrlreturns a stub URL; the file is not served). - Volume discounts, Savings Plans, or Reserved Instance pricing terms beyond what the bundled snapshot declares.
- Automatic refresh of the snapshot from upstream AWS.