# rds — RDS database instance

> **Module kind:** primitive  |  **Version:** 1.0.0

An RDS database instance. Supports multiple database engines (postgres,
mysql, mariadb, sqlserver, oracle) via the `engine` input. The adapter
translates the engine-agnostic `aws:rds:instance` stack type to the
Terraform `aws_db_instance` resource.

## Resources

| Resource | Type | Purpose |
|----------|------|---------|
| `rds` | `aws_db_instance` | The RDS database instance |

## Inputs

| Name | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `engine` | string | yes | — | Database engine (postgres, mysql, mariadb, sqlserver-ex, sqlserver-web, sqlserver-se, oracle-se2) |
| `engine_version` | string | yes | — | Engine version (e.g. 16.4 for postgres, 8.4 for mysql) |
| `instance_class` | string | yes | `db.t3.micro` | RDS instance class (e.g. db.t3.micro, db.r6g.large) |
| `allocated_storage` | number | no | 20 | Allocated storage in GB |
| `db_name` | string | yes | — | The database name (some engines have restrictions) |
| `username` | string | yes | — | Master username |
| `multi_az` | boolean | no | false | Multi-AZ deployment |
| `storage_encrypted` | boolean | no | true | Enable storage encryption |
| `region` | string | yes | — | AWS region the RDS instance is created in |

## Outputs

| Name | Type | Description |
|------|------|-------------|
| `db_endpoint` | string | The RDS instance endpoint (host:port) |
| `db_arn` | arn | The RDS instance ARN |

## NFRs

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `backup_retention_period` | number | 7 | Backup retention period in days |
| `deletion_protection` | boolean | true | Enable deletion protection (default true for prod) |

## Usage

```json
{
  "id": "rds",
  "type": "aws:rds:instance",
  "module": "rds@1.0.0",
  "inputs": {
    "engine": "postgres",
    "engine_version": "16.4",
    "instance_class": "db.t3.micro",
    "allocated_storage": 20,
    "db_name": "acdl_db",
    "username": "acdl_admin",
    "multi_az": false,
    "storage_encrypted": true,
    "region": "us-east-1"
  },
  "nfrs": {
    "backup_retention_period": 7,
    "deletion_protection": true
  }
}
```

A concrete instance is at `instance.json` (used by the platform pipeline
as the regression baseline).

## Compliance extension points

- **KMS encryption** — add a customer-managed KMS key for storage
  encryption (`kms_key_id` argument) (SOC2 CC6.1,
  GDPR Art.32).
- **Automated backups** — the `backup_retention_period` NFR controls
  automated backup retention; extend with backup windows + copy tags to
  another region for DR (SOX ITGC, DORA operational resilience).
- **Audit logging via CloudTrail** — RDS does not emit CloudTrail events
  for data-plane access; add `aws_db_instance_automated_backups_replication`
  + CloudWatch Logs for database audit (SOX, SOC2 CC7.2).
- **IAM database authentication** — add `iam_database_authentication_enabled
  = true` so IAM users/roles can authenticate to the database without
  long-lived passwords (SOC2 CC6.1).
- **Read replicas** — add `aws_db_instance` with `replicate_source_db` for
  read scaling and DR failover (SOC2 CC9.1, DORA operational resilience).

## Examples

Validated example contracts are in [`examples/`](examples/). The platform-test
pipeline validates them against `schemas/contract.schema.json`.

### Simple

A minimal deployment:

[`examples/simple.yml`](examples/simple.yml)
```yaml
environment: dev
id: rds
infrastructure:
  rds:
    inputs:
      allocated_storage: 20
      db_name: my_app_db
      engine: postgres
      engine_version: '16.4'
      instance_class: db.t3.micro
      region: us-east-1
      username: db_admin
    version: 1.0.0
name: rds-instance
```

### Complex

A production deployment with optional inputs:

[`examples/complex.yml`](examples/complex.yml)
```yaml
environment: dev
id: rds
infrastructure:
  rds:
    inputs:
      allocated_storage: 100
      db_name: my_production_db
      engine: postgres
      engine_version: '16.4'
      instance_class: db.r6g.large
      multi_az: true
      region: us-east-1
      storage_encrypted: true
      username: db_admin
    version: 1.0.0
name: rds-instance
```

### Multi-engine variation

RDS supports multiple database engines. The `engine` input selects the engine;
the `engine_version` must match.

#### PostgreSQL

[`examples/simple.yml`](examples/simple.yml) — postgres 16.4

#### MySQL

[`examples/mysql.yml`](examples/mysql.yml) — mysql 8.4

```yaml
environment: dev
id: rds
infrastructure:
  rds:
    inputs:
      allocated_storage: 20
      db_name: my_mysql_db
      engine: mysql
      engine_version: '8.4'
      instance_class: db.t3.micro
      region: us-east-1
      username: db_admin
    version: 1.0.0
name: rds-instance
```

## Versioning

`1.0.0` — interface MAJOR, behavior MINOR, lifecycle PATCH. MAJOR bumps
require a new registry entry (immutable publication); old entries enter
a 12-month deprecation window.