Skip to main content

Secrets Management

Secrets in AWS Secrets Manager

API Config Secrets

Each API has its own config secret containing database credentials, API keys, and service configuration:

Secret IDAppKey Contents
statux/api-configStatux PagesDATABASE_, COGNITO_, SENTRY_DSN
statux/alerts-api-configAlertingDATABASE_, COGNITO_, SENTRY_DSN, SLACK_, TWILIO_
statux/synthetics-api-configSyntheticsDATABASE_, COGNITO_, SENTRY_DSN
statux/insights-api-configInsightsDATABASE_, COGNITO_, SENTRY_DSN, BEDROCK_*
statux/platform-api-configPlatformDATABASE_, COGNITO_, SENTRY_DSN

Other Secrets

Secret IDPurpose
statux/stripe-configStripe API keys and webhook secrets (loaded by Platform API)

Common Keys Across All API Secrets

KeyDescription
DATABASE_HOSTRDS endpoint
DATABASE_PORTPostgreSQL port (5432)
DATABASE_USERNAMEDB user
DATABASE_PASSWORDDB password
DATABASE_NAMEDatabase name (statux)
COGNITO_USER_POOL_IDus-east-1_75Rp4zNBg
COGNITO_CLIENT_ID2u986rkhchk6mur28sgpt0bm8p
COGNITO_REGIONus-east-1
SENTRY_DSNSentry error tracking DSN

How Secrets Are Loaded

Each API loads secrets on startup via loadSecretsConfig() from @app/common:

  1. Fetches the JSON secret from Secrets Manager
  2. Merges with defaults into a config object
  3. Forwards SENTRY_DSN to process.env so initSentry() can read it

Email

Email is sent via AWS SES (not Resend). SES requires no API keys in secrets -- it uses the EC2 instance's IAM role for authentication. The @app/email library handles SES integration directly.

Accessing Secrets

aws secretsmanager get-secret-value \
--secret-id statux/api-config \
--query SecretString --output text

Pipe through jq for readable output:

aws secretsmanager get-secret-value \
--secret-id statux/api-config \
--query SecretString --output text | jq .

Updating Secrets

caution

After updating a secret, you must trigger an ASG instance refresh (or restart the containers) for the API to pick up the new values. Secrets are loaded once on startup.

# Read current values first
aws secretsmanager get-secret-value \
--secret-id statux/api-config \
--query SecretString --output text | jq .

# Update (replaces entire JSON -- include all keys)
aws secretsmanager update-secret \
--secret-id statux/api-config \
--secret-string '{ ... }'