feat(P02 W0): dynamodb L1 primitive — interface, terraform, registry, tests (REQ-322)
New L1 module modules/l1/dynamodb/ (stack type aws:dynamodb:table). Terraform aws_dynamodb_table with PK + optional SK, PAY_PER_REQUEST default, SSE-KMS + PITR + prevent_destroy per v1.8 NFR defaults. Registry entry (kind l1), catalog row, test_adapter.py updated to 15 entries / 13 L1. 45 tests passing. ---ci--- project: acdl phase: 2 milestone: v1.26 status: execute phase_role: execution wave: 0 requirements: [REQ-322] ---/ci---
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
# DynamoDB L1 Primitive
|
||||
|
||||
> Stack type: `aws:dynamodb:table` → Terraform `aws_dynamodb_table`
|
||||
|
||||
## Description
|
||||
|
||||
A DynamoDB table primitive with encryption + point-in-time recovery
|
||||
enabled by default (per v1.8 NFR defaults). Supports a partition key
|
||||
(required) + optional sort key. Default billing mode is
|
||||
`PAY_PER_REQUEST` (on-demand).
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Type | Required | Default | Description |
|
||||
|---|---|---|---|---|
|
||||
| `table_name` | string | yes | — | Globally-unique table name |
|
||||
| `region` | string | yes | — | AWS region |
|
||||
| `pk` | string | yes | — | Partition key attribute name |
|
||||
| `sk` | string | no | `""` | Sort key attribute name |
|
||||
| `billing_mode` | string | no | `PAY_PER_REQUEST` | Billing mode |
|
||||
| `enabled` | boolean | no | `true` | Feature flag |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Type | Description |
|
||||
|---|---|---|
|
||||
| `table_arn` | arn | The table ARN |
|
||||
| `table_name` | string | The table name |
|
||||
|
||||
## NFRs
|
||||
|
||||
- **Encryption:** SSE-KMS enabled by default.
|
||||
- **Point-in-time recovery:** Enabled by default.
|
||||
- **Deletion protection:** `prevent_destroy = true` (Terraform lifecycle).
|
||||
|
||||
## Examples
|
||||
|
||||
See `examples/simple.yaml`.
|
||||
@@ -0,0 +1,4 @@
|
||||
table_name: nova-simple-ledger
|
||||
region: us-east-1
|
||||
pk: block_index
|
||||
billing_mode: PAY_PER_REQUEST
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"module": "dynamodb",
|
||||
"version": "1.0.0",
|
||||
"inputs": {
|
||||
"table_name": "nova-blockchain-ledger",
|
||||
"region": "us-east-1",
|
||||
"pk": "block_index",
|
||||
"billing_mode": "PAY_PER_REQUEST"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
{
|
||||
"name": "dynamodb",
|
||||
"version": "1.0.0",
|
||||
"kind": "l1",
|
||||
"type": "aws:dynamodb:table",
|
||||
"description": "DynamoDB table primitive (engine-agnostic stack type aws:dynamodb:table; the Terraform adapter translates to aws_dynamodb_table). Encryption + PITR enabled per v1.8 NFR defaults.",
|
||||
"inputs": {
|
||||
"table_name": {
|
||||
"type": "string",
|
||||
"description": "Globally-unique DynamoDB table name.",
|
||||
"required": true
|
||||
},
|
||||
"region": {
|
||||
"type": "string",
|
||||
"description": "AWS region the table is created in.",
|
||||
"required": true
|
||||
},
|
||||
"pk": {
|
||||
"type": "string",
|
||||
"description": "Partition key attribute name.",
|
||||
"required": true
|
||||
},
|
||||
"sk": {
|
||||
"type": "string",
|
||||
"description": "Sort key attribute name (optional).",
|
||||
"required": false
|
||||
},
|
||||
"billing_mode": {
|
||||
"type": "string",
|
||||
"default": "PAY_PER_REQUEST",
|
||||
"description": "Billing mode: PAY_PER_REQUEST or PROVISIONED."
|
||||
},
|
||||
"enabled": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Feature flag: enable/disable this module."
|
||||
}
|
||||
},
|
||||
"outputs": {
|
||||
"table_arn": {
|
||||
"type": "arn",
|
||||
"description": "The DynamoDB table ARN."
|
||||
},
|
||||
"table_name": {
|
||||
"type": "string",
|
||||
"description": "The table name (echoes the input)."
|
||||
}
|
||||
},
|
||||
"nfrs": {
|
||||
"encryption_enabled": {
|
||||
"type": "boolean",
|
||||
"description": "Enable server-side encryption (KMS).",
|
||||
"default": true
|
||||
},
|
||||
"point_in_time_recovery": {
|
||||
"type": "boolean",
|
||||
"description": "Enable point-in-time recovery.",
|
||||
"default": true
|
||||
},
|
||||
"deletion_protection": {
|
||||
"type": "boolean",
|
||||
"description": "Prevent resource destruction via Terraform lifecycle prevent_destroy.",
|
||||
"default": true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
resource "aws_dynamodb_table" "this" {
|
||||
count = var.enabled ? 1 : 0
|
||||
name = var.table_name
|
||||
billing_mode = var.billing_mode
|
||||
|
||||
hash_key = var.pk
|
||||
range_key = var.sk != "" ? var.sk : null
|
||||
|
||||
attribute {
|
||||
name = var.pk
|
||||
type = "S"
|
||||
}
|
||||
|
||||
dynamic "attribute" {
|
||||
for_each = var.sk != "" ? [var.sk] : []
|
||||
content {
|
||||
name = attribute.value
|
||||
type = "S"
|
||||
}
|
||||
}
|
||||
|
||||
point_in_time_recovery {
|
||||
enabled = true
|
||||
}
|
||||
|
||||
server_side_encryption {
|
||||
enabled = true
|
||||
}
|
||||
|
||||
tags = {
|
||||
"nova:managed-by" = "platform"
|
||||
"nova:module" = "dynamodb"
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
prevent_destroy = true
|
||||
}
|
||||
}
|
||||
|
||||
variable "table_name" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "region" {
|
||||
type = string
|
||||
default = "us-east-1"
|
||||
}
|
||||
|
||||
variable "pk" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "sk" {
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "billing_mode" {
|
||||
type = string
|
||||
default = "PAY_PER_REQUEST"
|
||||
}
|
||||
|
||||
variable "enabled" {
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
output "table_arn" {
|
||||
value = var.enabled ? aws_dynamodb_table.this[0].arn : ""
|
||||
}
|
||||
|
||||
output "table_name" {
|
||||
value = var.enabled ? aws_dynamodb_table.this[0].name : ""
|
||||
}
|
||||
Reference in New Issue
Block a user