🗄️ Database: schema, tables, and roles created from code. The Lambda connects as app_role with a short-lived IAM token, so there are no passwords and no admin credentials in your pipeline.
🔐 Permissions: least-privilege IAM written for you. The Lambda can connect to this cluster and nothing else.
🚦 API: rate limiting on every route, access logs kept for a year, and CORS off until you configure it (* is rejected).
🛡️ Website: CloudFront with AWS managed WAF rules, a server Lambda reachable only through CloudFront, and HSTS, nosniff, and frame-protection headers on every response.
🏷️ Tagging: every resource tagged with its project and stage, plus any tags you add, so costs are traceable from day one.
Each default is a starting point. You can opt out of or override any of them, which beats starting from nothing and hoping you remembered everything. The defaults are aligned to SOC 2 and ISO 27001 controls: that isn't a certification, but it does the heavy lifting when you're working toward one.
Comparing Anvil
The same image upload stack, built five ways.
Framework
Infra lines
Components
Manual permissions
Deploys with
Anvil
58
4
1
Pulumi engine
CDK
74 (1.3×)
7 (1.8×)
1 (1.0×)
CloudFormation
CloudFormation
134 (2.3×)
12 (3.0×)
4 (4.0×)
CloudFormation
Pulumi
150 (2.6×)
17 (4.3×)
6 (6.0×)
Pulumi engine
Terraform
194 (3.3×)
17 (4.3×)
7 (7.0×)
Terraform engine
See all five implementations side by side at anvilcloud.dev.
Permissions without writing IAM
Resources grant each other access. Anvil writes the least-privilege IAM policy, scoped to the actions and paths you ask for:
run(ctx) {
const uploads = new anvil.aws.Bucket('uploads');
const resize = new anvil.aws.Lambda('resize', {
runtime: 'nodejs22.x',
entry: 'functions/resize/index.ts',
handler: 'handler',
});
// Read-only, and objects only under incoming/
uploads.grantRead(resize, ['incoming/*']);
},
anvil compliance scan # scan this app's resources now
anvil compliance status # latest results
anvil compliance dashboard # open a local dashboard of findings
Supported frameworks include SOC 2, ISO 27001, CIS, NIST 800-53, PCI DSS, HIPAA, GDPR, NIS2, DORA, FedRAMP, and the ASD Essential Eight. Results stay in your own AWS account.
Install Anvil
macOS / Linux
curl -fsSL https://raw.githubusercontent.com/anvil-cloud/anvil/master/install.sh | sh
Every deploy goes to a stage. Without --stage it's your active stage (anvil stage set <name>), or your username if none is set, so each developer gets their own copy. destroy always needs --stage spelled out, so you can't tear down the wrong one by accident.
destroy keeps protected resources that hold data (DSQL clusters, DynamoDB tables, Cognito user pools). Add --force to delete them too.