Skip to main content

DatabaseFactory.build

import { DatabaseFactory } from "@fjall/components-infrastructure";
Wraps common RDS configurations behind a simple interface for Aurora Serverless, traditional RDS instances, and Free Tier databases.

Interface

interface IDatabaseProps {
  type: "Aurora" | "Instance" | "FreeTier";
  databaseName: string;
  vpc?: IVpc;
  tags?: { [key: string]: string };
  
  // Advanced properties
  instanceType?: string;              // e.g., "t4g.small"
  engine?: DatabaseInstanceEngine;    // e.g., PostgreSQL 17.5
  multiAz?: boolean;
  publiclyAccessible?: boolean;
}
PropTypeRequiredNotes
type"Aurora" | "Instance" | "FreeTier"YesSelect Aurora Serverless, RDS Instance or RDS Free Tier
databaseNamestringYesLogical name & identifier prefix
vpcIVpcCustom VPC (required for Aurora)
instanceTypestringInstance size (e.g., “t4g.small”, “r6g.large”)
engineDatabaseInstanceEngineDatabase engine and version
multiAzbooleanEnable Multi-AZ deployment
publiclyAccessiblebooleanAllow public access
tagsobjectExtra resource tags

Storage Types

Aurora Serverless

Serverless Aurora v2 with auto-scaling capacity:
const database = app.addDatabase(
  DatabaseFactory.build("ProdDb", {
    type: "Aurora",
    databaseName: "production",
  })
);
Aurora Configuration:
  • Aurora Serverless v2
  • 1 writer, 2 readers
  • Built-in RDS Proxy
  • Auto-scaling capacity
  • High availability

RDS Instance

Traditional RDS instance with configurable engine:
const database = app.addDatabase(
  DatabaseFactory.build("AppDb", {
    type: "Instance",
    databaseName: "fjallDb",
    instanceType: "t4g.small",
    engine: DatabaseInstanceEngine.postgres({
      version: PostgresEngineVersion.VER_17_5,
    }),
    multiAz: false,
    publiclyAccessible: true,
  })
);
Instance Configuration:
  • PostgreSQL 17.5 (default)
  • r6g.large instance type (default)
  • Multi-AZ enabled by default
  • Optional RDS Proxy
  • Optional read replicas

Free Tier

Cost-free development database:
const database = app.addDatabase(
  DatabaseFactory.build("BlogDb", {
    type: "FreeTier",
    databaseName: "blogdb",
  })
);
Free Tier Configuration:
  • t3.micro / db.t3.micro instance
  • Single-AZ
  • Eligible for 750 hours/month free

Example – Free-tier MySQL

const database = app.addDatabase(
  DatabaseFactory.build("BlogDb", {
    type: "FreeTier",
    databaseName: "blogdb",
  })
);

Access helpers

The returned Database construct exposes helper methods:
  • getCredentials()Secret - AWS Secrets Manager secret with database credentials
  • getHostEndpoint()string - Database host endpoint
  • getHostPort()string | number - Database port
  • getDatabaseName()string - Database name
  • connectionsIConnectable - For security group connections
Use these to wire the DB into your compute stack.

Integration with Compute

Pass database credentials and connection info to containers:
// Create database
const database = app.addDatabase(
  DatabaseFactory.build("AppDb", {
    type: "Instance",
    databaseName: "myapp",
  })
);

// Connect to compute
app.addCompute(
  ComputeFactory.build("AppApi", {
    type: "ecs",
    containerPort: 3000,
    containerEnvironment: {
      DATABASE_HOST: database.getHostEndpoint(),
      DATABASE_PORT: database.getHostPort().toString(),
      DATABASE_NAME: database.getDatabaseName(),
    },
    containerSecretsImport: {
      DATABASE_PASSWORD: database.getCredentials().getImport("password"),
      DATABASE_USER: database.getCredentials().getImport("username"),
    },
    connections: [database],  // Auto security group rules
  })
);

Best Practices

  • Free Tier for Development: Use Free Tier type for dev environments to stay within AWS free tier limits
  • Aurora for Production: Use Aurora Serverless for production workloads requiring high availability and auto-scaling
  • Secret Management: Always use containerSecretsImport to inject credentials, never hardcode in environment variables
  • Connection Arrays: Pass database to connections array in compute for automatic security group configuration
  • Multi-AZ: Enable Multi-AZ for production Instance deployments

See Also