Add a standalone ci workflow so handbook changes get an automated gate. The job is named literally "ci / ci" to emit the exact status context the org main-branch-protection ruleset requires. - markdownlint-cli2 (.markdownlint-cli2.jsonc): MD013/MD060/MD040 relaxed as noisy docs-style rules; fixed 3 MD032 blank-line-around-list issues. - lychee link check (lychee.toml): internal + external links, tolerates 429.
3 KiB
AWS Infrastructure
IaC Strategy
- SAM is the default for new serverless stacks (Lambda + API Gateway + DynamoDB)
- CDK only for complex infrastructure (ECS, VPCs, multi-service compositions)
- Every deployed resource should be managed by CloudFormation
- No manually-created Lambdas, roles, or other resources outside of IaC
Lambda Defaults
These apply to every Lambda in every project. Verify, don't assume.
| Setting | Value |
|---|---|
| Runtime | Python 3.12 or Node 24.x |
| Architecture | arm64 |
| Log retention | 60 days (explicit in IaC template) |
| Naming | kebab-case, matching the stack name prefix |
Never rely on the CloudWatch default for log retention. Always set RetentionInDays explicitly in the template.
CDK Version Policy
Pin aws-cdk-lib to an exact version (no ^, ~, or >=) and let Dependabot keep it current. There is no static "blessed version" — the org standard is the latest release that passes the gates below. Do not add blanket dependabot.yml ignore entries for aws-cdk-lib; that is how pins rot into carrying known vulnerabilities.
Why exact + automated: the exact pin plus the lockfile gives reproducible builds; weekly Dependabot version updates keep the pin moving; CI (npm ci + cdk synth) and the dependency-review check reject a bad release at the PR. A release with broken bundled-dep metadata (e.g. 2.254.0) fails npm ci on its own bump PR; a release bundling a vulnerable transitive dep fails dependency review. Either way, a bad release never merges — the gates do the vetting, not a frozen number in this document.
aws-cdk-lib bundles transitive dependencies (inBundle: true) that npm overrides cannot patch. When a bundled dep has a vulnerability, the only fix is advancing to a release that bundles the patched version — treat the alert as a prompt to merge the next Dependabot bump, never as something to dismiss indefinitely.
If a specific release is known-bad, ignore that version only (ignore: - dependency-name: aws-cdk-lib, versions: ["2.254.0"]) with a comment explaining why, and remove the entry once a fixed release ships.
When upgrading, verify on a branch first:
- Update
package.jsonto the new version - Run
rm -rf node_modules package-lock.json && npm install - Run
npm ci— if it fails, the version is not safe - Run
npx cdk synth— if it fails, the version is not safe
CloudFormation Outputs
Every stack should export:
- Function ARNs
- Any externally-consumable URLs (API Gateway endpoints, etc.)
S3
- Every non-CloudFormation bucket must have
PurposeandManagedBytags - Define lifecycle policies in the IaC template
- Use Glacier Deep Archive for archival data
README
Every repo must have a README that accurately describes:
- Project architecture
- Lambdas and services
- Data flow
- Configuration requirements
Update the README in the same commit where functionality changes. If a README is missing or outdated when you start working on a project, fix it as part of the current work.