mirror of
https://github.com/Sea-Haven-Industries/procurement-ingest.git
synced 2026-10-03 17:43:12 +00:00
feat(infra): retarget WO writers and ESMs to kebab tables (PLAT-11) (#174)
* feat(infra): retarget WO writers and ESMs to kebab Dynamo tables Point Lambda env, IAM, emitter streams, and DDB alarms at work-orders / work-order-comments for the PLAT-11 freeze cutover. Legacy PascalCase tables remain in state until the decommission soak. * style(infra): terraform fmt wo_ddb alarm map alignment
This commit is contained in:
parent
2e7cdc64e6
commit
419293b8ed
6 changed files with 34 additions and 51 deletions
|
|
@ -123,8 +123,8 @@ resource "aws_lambda_function" "procurement_api" {
|
||||||
environment {
|
environment {
|
||||||
variables = {
|
variables = {
|
||||||
VERIFIED_SITES_TABLE = aws_dynamodb_table.verified_sites.name
|
VERIFIED_SITES_TABLE = aws_dynamodb_table.verified_sites.name
|
||||||
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders.name
|
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders_kebab.name
|
||||||
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments.name
|
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments_kebab.name
|
||||||
PO_TABLE = aws_dynamodb_table.purchase_orders.name
|
PO_TABLE = aws_dynamodb_table.purchase_orders.name
|
||||||
WEB_UI_AUTH_TOKEN_SECRET_ARN = var.web_ui_auth_token_secret_arn
|
WEB_UI_AUTH_TOKEN_SECRET_ARN = var.web_ui_auth_token_secret_arn
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -357,10 +357,10 @@ resource "aws_iam_role_policy" "wo_email_processor_ddb" {
|
||||||
"dynamodb:UpdateItem",
|
"dynamodb:UpdateItem",
|
||||||
]
|
]
|
||||||
Resource = [
|
Resource = [
|
||||||
aws_dynamodb_table.work_orders.arn,
|
aws_dynamodb_table.work_orders_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_orders.arn}/index/*",
|
"${aws_dynamodb_table.work_orders_kebab.arn}/index/*",
|
||||||
aws_dynamodb_table.work_order_comments.arn,
|
aws_dynamodb_table.work_order_comments_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_order_comments.arn}/index/*",
|
"${aws_dynamodb_table.work_order_comments_kebab.arn}/index/*",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -421,10 +421,10 @@ resource "aws_iam_role_policy" "wo_web_ui_ddb" {
|
||||||
"dynamodb:Scan",
|
"dynamodb:Scan",
|
||||||
]
|
]
|
||||||
Resource = [
|
Resource = [
|
||||||
aws_dynamodb_table.work_orders.arn,
|
aws_dynamodb_table.work_orders_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_orders.arn}/index/*",
|
"${aws_dynamodb_table.work_orders_kebab.arn}/index/*",
|
||||||
aws_dynamodb_table.work_order_comments.arn,
|
aws_dynamodb_table.work_order_comments_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_order_comments.arn}/index/*",
|
"${aws_dynamodb_table.work_order_comments_kebab.arn}/index/*",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -468,16 +468,16 @@ resource "aws_iam_role_policy" "wo_shoc_emitter_streams" {
|
||||||
"dynamodb:ListStreams",
|
"dynamodb:ListStreams",
|
||||||
]
|
]
|
||||||
Resource = [
|
Resource = [
|
||||||
aws_dynamodb_table.work_orders.stream_arn,
|
aws_dynamodb_table.work_orders_kebab.stream_arn,
|
||||||
aws_dynamodb_table.work_order_comments.stream_arn,
|
aws_dynamodb_table.work_order_comments_kebab.stream_arn,
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Effect = "Allow"
|
Effect = "Allow"
|
||||||
Action = ["dynamodb:DescribeTable"]
|
Action = ["dynamodb:DescribeTable"]
|
||||||
Resource = [
|
Resource = [
|
||||||
aws_dynamodb_table.work_orders.arn,
|
aws_dynamodb_table.work_orders_kebab.arn,
|
||||||
aws_dynamodb_table.work_order_comments.arn,
|
aws_dynamodb_table.work_order_comments_kebab.arn,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -635,10 +635,10 @@ resource "aws_iam_role_policy" "procurement_api_ddb" {
|
||||||
"${aws_dynamodb_table.purchase_orders.arn}/index/*",
|
"${aws_dynamodb_table.purchase_orders.arn}/index/*",
|
||||||
aws_dynamodb_table.verified_sites.arn,
|
aws_dynamodb_table.verified_sites.arn,
|
||||||
"${aws_dynamodb_table.verified_sites.arn}/index/*",
|
"${aws_dynamodb_table.verified_sites.arn}/index/*",
|
||||||
aws_dynamodb_table.work_orders.arn,
|
aws_dynamodb_table.work_orders_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_orders.arn}/index/*",
|
"${aws_dynamodb_table.work_orders_kebab.arn}/index/*",
|
||||||
aws_dynamodb_table.work_order_comments.arn,
|
aws_dynamodb_table.work_order_comments_kebab.arn,
|
||||||
"${aws_dynamodb_table.work_order_comments.arn}/index/*",
|
"${aws_dynamodb_table.work_order_comments_kebab.arn}/index/*",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -570,25 +570,9 @@ import {
|
||||||
id = "workorder-shoc-emitter-rejected-messages"
|
id = "workorder-shoc-emitter-rejected-messages"
|
||||||
}
|
}
|
||||||
|
|
||||||
import {
|
# PLAT-11 cutover: PascalCase WO DDB alarm imports removed when alarm map
|
||||||
to = aws_cloudwatch_metric_alarm.wo_ddb_throttles["WorkOrders"]
|
# keys moved to work-orders / work-order-comments. Legacy alarm resources are
|
||||||
id = "WorkOrders-throttles"
|
# destroyed by the cutover apply; kebab alarms are created fresh.
|
||||||
}
|
|
||||||
|
|
||||||
import {
|
|
||||||
to = aws_cloudwatch_metric_alarm.wo_ddb_system_errors["WorkOrders"]
|
|
||||||
id = "WorkOrders-system-errors"
|
|
||||||
}
|
|
||||||
|
|
||||||
import {
|
|
||||||
to = aws_cloudwatch_metric_alarm.wo_ddb_throttles["WorkOrderComments"]
|
|
||||||
id = "WorkOrderComments-throttles"
|
|
||||||
}
|
|
||||||
|
|
||||||
import {
|
|
||||||
to = aws_cloudwatch_metric_alarm.wo_ddb_system_errors["WorkOrderComments"]
|
|
||||||
id = "WorkOrderComments-system-errors"
|
|
||||||
}
|
|
||||||
|
|
||||||
# --- CloudWatch alarms (API) ---
|
# --- CloudWatch alarms (API) ---
|
||||||
import {
|
import {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
# PLAT-11: PascalCase tables remain authoritative until the freeze cutover.
|
# PLAT-11: PascalCase tables retained until decommission soak.
|
||||||
# Kebab tables are created empty in the prep apply; writers/ESMs stay on legacy
|
# Writers/ESMs/alarms point at kebab tables after the freeze cutover.
|
||||||
# until docs/plat-11/cutover-runbook.md Phase 2.
|
|
||||||
|
|
||||||
resource "aws_dynamodb_table" "work_orders" {
|
resource "aws_dynamodb_table" "work_orders" {
|
||||||
name = "WorkOrders"
|
name = "WorkOrders"
|
||||||
|
|
@ -87,10 +86,10 @@ resource "aws_dynamodb_table" "work_order_comments_kebab" {
|
||||||
}
|
}
|
||||||
|
|
||||||
locals {
|
locals {
|
||||||
# Alarms stay on the live writer tables (legacy until cutover).
|
# Alarms follow live writer tables after PLAT-11 cutover.
|
||||||
wo_ddb_alarm_tables = {
|
wo_ddb_alarm_tables = {
|
||||||
"WorkOrders" = aws_dynamodb_table.work_orders.name
|
"work-orders" = aws_dynamodb_table.work_orders_kebab.name
|
||||||
"WorkOrderComments" = aws_dynamodb_table.work_order_comments.name
|
"work-order-comments" = aws_dynamodb_table.work_order_comments_kebab.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ resource "aws_lambda_function" "wo_email_processor" {
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
variables = {
|
variables = {
|
||||||
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders.name
|
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders_kebab.name
|
||||||
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments.name
|
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments_kebab.name
|
||||||
ALLOWED_DKIM_DOMAINS = "seahaven.com"
|
ALLOWED_DKIM_DOMAINS = "seahaven.com"
|
||||||
BEDROCK_MODEL_ID = local.bedrock_model_id
|
BEDROCK_MODEL_ID = local.bedrock_model_id
|
||||||
}
|
}
|
||||||
|
|
@ -68,8 +68,8 @@ resource "aws_lambda_function" "wo_web_ui" {
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
variables = {
|
variables = {
|
||||||
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders.name
|
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders_kebab.name
|
||||||
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments.name
|
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments_kebab.name
|
||||||
WEB_UI_AUTH_TOKEN_SECRET_ARN = var.web_ui_auth_token_secret_arn
|
WEB_UI_AUTH_TOKEN_SECRET_ARN = var.web_ui_auth_token_secret_arn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -293,8 +293,8 @@ resource "aws_lambda_function" "wo_shoc_emitter" {
|
||||||
REJECTED_QUEUE_URL = aws_sqs_queue.shoc_emitter_rejected.url
|
REJECTED_QUEUE_URL = aws_sqs_queue.shoc_emitter_rejected.url
|
||||||
SHOC_WEBHOOK_URL = var.shoc_webhook_url
|
SHOC_WEBHOOK_URL = var.shoc_webhook_url
|
||||||
# Stream ARN classification (PLAT-11); must match ESM source table names.
|
# Stream ARN classification (PLAT-11); must match ESM source table names.
|
||||||
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders.name
|
WORK_ORDERS_TABLE = aws_dynamodb_table.work_orders_kebab.name
|
||||||
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments.name
|
COMMENTS_TABLE = aws_dynamodb_table.work_order_comments_kebab.name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -310,7 +310,7 @@ resource "aws_lambda_function" "wo_shoc_emitter" {
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_lambda_event_source_mapping" "wo_shoc_emitter_work_orders" {
|
resource "aws_lambda_event_source_mapping" "wo_shoc_emitter_work_orders" {
|
||||||
event_source_arn = aws_dynamodb_table.work_orders.stream_arn
|
event_source_arn = aws_dynamodb_table.work_orders_kebab.stream_arn
|
||||||
function_name = aws_lambda_function.wo_shoc_emitter.arn
|
function_name = aws_lambda_function.wo_shoc_emitter.arn
|
||||||
starting_position = "LATEST"
|
starting_position = "LATEST"
|
||||||
batch_size = 10
|
batch_size = 10
|
||||||
|
|
@ -329,7 +329,7 @@ resource "aws_lambda_event_source_mapping" "wo_shoc_emitter_work_orders" {
|
||||||
}
|
}
|
||||||
|
|
||||||
resource "aws_lambda_event_source_mapping" "wo_shoc_emitter_comments" {
|
resource "aws_lambda_event_source_mapping" "wo_shoc_emitter_comments" {
|
||||||
event_source_arn = aws_dynamodb_table.work_order_comments.stream_arn
|
event_source_arn = aws_dynamodb_table.work_order_comments_kebab.stream_arn
|
||||||
function_name = aws_lambda_function.wo_shoc_emitter.arn
|
function_name = aws_lambda_function.wo_shoc_emitter.arn
|
||||||
starting_position = "LATEST"
|
starting_position = "LATEST"
|
||||||
batch_size = 10
|
batch_size = 10
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue