Codync
무료 오픈소스 1:1 대안, Grok Bot과 Muse 대신
AWS 인프라를 코드로 관리, 기본 암호화·프라이빗 접근·최소 권한 IAM 제공, TypeScript·Python·Go 지원, Pulumi 기반
Infrastructure as code for AWS with encryption, private access and least-privilege IAM on by default. TypeScript, Python and Go, built on Pulumi.
개발 도구Go · TypeScriptGitHub @anvil-cloud온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Secure-by-default alternative to Terraform and CDK on AWS, built on Pulumi.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A Postgres-compatible database, an API, and a website behind a firewall:
import * as anvil from '@anvil-cloud/sdk';
export default new anvil.App({
run(ctx) {
const db = new anvil.aws.DSQL('db', {
schemas: [{
name: 'shop',
roles: [{ name: 'app_role', grants: ['SELECT', 'INSERT', 'UPDATE'] }],
tables: [{
name: 'orders',
columns: [
{ name: 'id', type: 'uuid', notNull: true },
{ name: 'total', type: 'numeric', precision: 10, scale: 2 },
],
primaryKey: ['id'],
}],
}],
});
const handler = new anvil.aws.Lambda('orders', {
runtime: 'nodejs22.x',
handler: 'functions/orders.handler',
environment: { DSQL_ENDPOINT: db.endpoint },
});
db.grantConnect(handler, { schemas: [{ schema: 'shop', roleName: 'app_role' }] });
const api = new anvil.aws.HttpApi('api', {
routes: [{ method: 'GET', path: '/orders', consumer: { lambda: { arn: handler.arn } } }],
});
const waf = new anvil.aws.Waf('edge');
new anvil.aws.SvelteKitSite('web', {
path: 'web',
runtimeEnvironment: { API_URL: api.url },
waf: { arn: waf.arn },
});
},
});
What anvil deploy gives you without being asked:
app_role with a short-lived IAM token, so there are no passwords and no admin credentials in your pipeline.* is rejected).nosniff, and frame-protection headers on every response.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.
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.
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',
handler: 'functions/resize/index.handler',
});
// Read-only, and objects only under incoming/
uploads.grantRead(resize, ['incoming/*']);
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::uploads-…",
"arn:aws:s3:::uploads-…/incoming/*"
]
}
No ARNs to wire, no s3:* policies left over from debugging.
Add one block to your app and Anvil scans what you deployed against the frameworks you're working toward, using Prowler:
export default new anvil.App({
compliance: {
frameworks: ['soc2', 'iso27001', 'cis'],
schedule: 'daily',
scanOnDeploy: true,
},
run(ctx) {
// ...
},
});
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.
macOS / Linux
curl -fsSL https://raw.githubusercontent.com/anvil-cloud/anvil/master/install.sh | sh
Windows (PowerShell)
irm https://raw.githubusercontent.com/anvil-cloud/anvil/master/install.ps1 | iex
Installs anvil and the provider to /usr/local/bin. Works on Apple Silicon and Intel.
anvil init --name my-app --lang ts
cd my-app
npm install
Declare a bucket in anvil.config.ts:
import * as anvil from '@anvil-cloud/sdk';
export default new anvil.App({
defaults: {
tags: {
project: 'my-app',
costCenter: 'platform-eng',
},
},
run(ctx) {
const uploads = new anvil.aws.Bucket('uploads');
ctx.export('bucketName', uploads.bucketName);
},
});
The bucket is private and encrypted without any extra arguments. Preview, deploy, and tear down:
anvil preview
anvil deploy
anvil destroy --stage <stage>
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.
See the Quickstart for Python and Go.
Every component behaves identically across all three SDKs.
| Language | Package | Requirement |
|---|---|---|
| TypeScript | npm install @anvil-cloud/sdk | Node.js 18+ |
| Python | pip install anvil-cloud | Python 3.9+ |
| Go | go get github.com/anvil-cloud/anvil/sdk/go/anvil | Go 1.25+ |
AWS
| Category | Components |
|---|---|
| Compute | Lambda |
| Storage | Bucket |
| Database | DynamoDB, DSQL, DSQLConnect |
| Networking | Vpc, VpcEndpoint |
| Messaging | Queue, EventBus, KinesisStream |
| API & Auth | HttpApi, CognitoUserPool, CognitoAuth, OAuthAuthorizer |
| Hosting | SvelteKitSite |
| Security | Waf, ComplianceScanner |
GCP (early): StorageBucket, Function
Full arguments, outputs, and examples for each are in the component docs.
Contributions are welcome, from typo fixes to new components.
If Anvil saves you time, a ⭐ helps other people find it.