Anvil — secure-by-default cloud infrastructure components
Project description
anvil-cloud
Cloud infrastructure that's secure by default — not by accident.
Anvil wraps raw cloud resources into opinionated, production-ready components. No boilerplate. No copy-pasting security configs. Just declare what you need.
Built on Pulumi.
Install
pip install anvil-cloud
Secure by default
Every Anvil component ships with defaults aligned to production from day one — public access blocked, encryption enforced, cost tags applied. The goal isn't to make compliance automatic, but to make it a platform you can actually build on.
The App class
Every Anvil program starts with anvil.App(). The run callback receives a Context with:
ctx.stage— current deployment stage (defaults to your OS username for dev isolation)ctx.project— project name fromanvil.yamlctx.export(name, value)— export stack outputsctx.providers— named cloud providers for multi-region / multi-account
Grants
Grants are how Anvil wires permissions between resources. Instead of writing IAM policies by hand, you call .grant() on a resource and Anvil handles both the IAM role policy and the environment variable injection automatically.
A Lambda reading from a Bucket:
import anvil_cloud as anvil
def infra(ctx: anvil.Context):
bucket = anvil.aws.Bucket("uploads",
data_classification="sensitive",
)
fn = anvil.aws.Lambda("processor",
runtime="nodejs20.x",
handler="index.handler",
code="./src",
)
# Grants the Lambda read access to the bucket and scopes down to specific bucket paths.
# Anvil creates the IAM policy and injects UPLOADS_BUCKET_NAME
# into the Lambda's environment automatically.
bucket.grant(fn, actions=["read"], path=["user/*"])
anvil.App(run=infra)
What Anvil does under the hood:
- Creates an IAM
RolePolicyscoped to the exact actions requested - Injects the resource identifier as an environment variable on the target (e.g.
UPLOADS_BUCKET_NAME) - No manual ARN wiring, no forgotten permissions
SvelteKit deployment
Deploy a SvelteKit app to AWS with a single component. Anvil provisions S3, CloudFront, ACM, Lambda (via Lambda Web Adapter), and Route53 — with HTTPS and a custom domain out of the box:
import anvil_cloud as anvil
def infra(ctx: anvil.Context):
site = anvil.aws.SvelteKitSite("web",
domain="myapp.com",
)
ctx.export("url", site.url)
anvil.App(run=infra)
Overrides
Every component accepts a transform argument to override the underlying resource config when you need to break from the defaults:
bucket = anvil.aws.Bucket("custom",
data_classification="non-sensitive",
transform=anvil.aws.BucketTransformArgsArgs(
overrides=anvil.aws.BucketOverridesArgs(
force_destroy=True,
tags={"env": "dev"},
),
),
)
Requirements
- Python >= 3.8
- Pulumi >= 3.0.0
- Anvil CLI:
curl -fsSL https://raw.githubusercontent.com/DamienPace15/anvil/master/install.sh | sh
Links
License
Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file anvil_cloud-0.0.14.tar.gz.
File metadata
- Download URL: anvil_cloud-0.0.14.tar.gz
- Upload date:
- Size: 49.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80da98bb83c612bc2534990e6b93816ea499e94a13fc5e7f6ba275bc90a00706
|
|
| MD5 |
38ac546b1f3fc22e0dd1649cf84af997
|
|
| BLAKE2b-256 |
acf43218982c6b96cdb2d5a1dbfc995b862359a467db8c74e578bd53e3636bf3
|
File details
Details for the file anvil_cloud-0.0.14-py3-none-any.whl.
File metadata
- Download URL: anvil_cloud-0.0.14-py3-none-any.whl
- Upload date:
- Size: 59.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82323fdb7f1b25d72718aea400a83a287f232847eac1d8ec64dc179e8cb1b1be
|
|
| MD5 |
a09db196ac7b24d6de2d74ecbaea37d9
|
|
| BLAKE2b-256 |
f7ad6bae6d1e1538495ab05194328901e85f9d4d4a4ec6bcbb8bd5f976c393d3
|