Commit 3da9751
docs: add least-privilege deployment roles and deployment guide (#46)
* docs: add least-privilege deployment roles and deployment guide
Add DEPLOYMENT_ROLES.md with least-privilege IAM policy for the
CloudFormation execution role (IaCRole-ABCA), derived from analysis
of all CDK constructs and handler code in the current single-stack
architecture. Includes optional ECS statements when Fargate is enabled.
Add DEPLOYMENT_GUIDE.md covering compute backend choices (AgentCore
vs opt-in ECS Fargate via ComputeStrategy), scale-to-zero analysis,
and complete AWS services inventory.
Update COST_MODEL.md with scale-to-zero characteristics section,
corrected baseline to ~$85-95/month, and updated references.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): preserve original reference order in COST_MODEL.md
Append new references at the bottom instead of reordering the
existing list.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): restore dual COMPUTE.md references in COST_MODEL.md
The original had COMPUTE.md listed twice intentionally — once for
the network architecture section and once for compute billing. Restore
this pattern instead of merging into one entry.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): consolidate COMPUTE.md references with section anchor
Single entry with anchor link to the network architecture section
instead of listing the same file twice.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): replace iamlive with IAM Access Analyzer recommendation
Use AWS-native IAM Access Analyzer policy generation instead of
third-party tooling for iterative policy tightening.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: remove sub section
* fix(docs): add generated Starlight mirrors for new and modified docs
The sync-starlight.mjs script generates mirror files under
docs/src/content/docs/ from source docs. These generated files were
missing from prior commits, causing the CI mutation check to fail.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: add docs-sync pre-commit hook and strengthen agentic instructions
The PR#46 build failed because Starlight mirror files under
docs/src/content/docs/ were not regenerated after editing source docs.
The pre-commit hooks had no step to catch this locally.
- Add `docs-sync` pre-commit hook that auto-runs sync-starlight.mjs and
stages the generated mirrors when docs sources change
- Strengthen AGENTS.md boundary and common-mistakes sections to
explicitly warn that CI rejects stale mirrors and name the exact
command to regenerate them
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): correct session timeout and concurrency defaults in COST_MODEL
- Session timeout: 8 hours → 9 hours (matches task-orchestrator.ts:173)
- Concurrency limit: 2 → 3 (matches task-orchestrator.ts:163 default)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* chore: gitignore Claude Code plugin artifacts (.mcp.json, .remember/)
Prevents local plugin state from the remember and MCP plugins from
being tracked in version control.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): add X-Ray resource policy prerequisite and build credential notes
On a fresh AWS account, `aws xray update-trace-segment-destination`
fails with AccessDeniedException because X-Ray needs a CloudWatch Logs
resource policy before it can write spans. Added the prerequisite
`aws logs put-resource-policy` command to Quick Start Step 3.
Also documented that `mise run build` requires AWS credentials with
ec2:DescribeAvailabilityZones for CDK synthesis, and added common error
table entries for the X-Ray, build credential, and non-TTY deploy issues.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(plugin): add X-Ray resource policy to /setup and least-privilege ref to /deploy
The /setup skill's Phase 3 only ran `aws xray update-trace-segment-destination`
which fails with AccessDeniedException on fresh accounts. Added the prerequisite
`aws logs put-resource-policy` command.
Added a "Least-Privilege Deployment" section to the /deploy skill linking to
DEPLOYMENT_ROLES.md with the re-bootstrap command for scoped execution policies.
Updated CLAUDE.md to reference the abca-plugin and its available skills so
Claude Code sessions discover the guided workflows without requiring
--plugin-dir.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): replace IaCRole-ABCA with validated 3-way policy split
Replace the single monolithic IAM policy (which exceeded the 6,144-char
IAM managed policy limit) with three validated policies:
- IaCRole-ABCA-Infrastructure (CFN, IAM, VPC, DNS Firewall)
- IaCRole-ABCA-Application (DDB, Lambda, APIGW, Cognito, WAF, EB, SM)
- IaCRole-ABCA-Observability (Bedrock, CW, X-Ray, S3, ECR, KMS, SSM, STS)
All three policies were validated against a live deployment in us-east-1
(create, update, task execution, and destroy). CloudTrail analysis found
36 additional actions beyond the initial code review, and 7 deployment
iterations refined the policies. Key additions:
- KMS (entirely missing from original)
- lambda:InvokeFunction for AwsCustomResource
- bedrock-agentcore:* (CFN handler uses internal action names)
- Legacy CW Logs delivery actions for Route53 Resolver
- Various Describe/List/Get actions for read-only CFN operations
Updated the origin disclaimer, Resource-level permission constraints
table, and ECS section to reference the Application policy.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): note ECS policy fits under IAM size limit
Clarify in the ECS section that adding the ECS statement to
IaCRole-ABCA-Application keeps the combined policy under the
6,144-character IAM managed policy limit (4,212 of 6,144 chars).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): document SecretsManager GetRandomPassword Resource:"*" in constraints table
GetRandomPassword is an account-level API with no secret ARN, so it
requires Resource:"*". Document this in the Resource-level permission
constraints table alongside other services that require "*".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(plugin): update /deploy skill to reference 3-way policy split
The skill referenced a non-existent IaCRole-ABCA-Policy. Update to
the three actual policy names (Infrastructure, Application, Observability)
matching DEPLOYMENT_ROLES.md.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): add DEPLOYMENT_GUIDE.md Starlight mirror and sidebar entry
Add explicit route mapping, mirrorMarkdownFile call, and sidebar entry
so the Deployment Guide renders on the docs site and cross-doc links
from COST_MODEL.md resolve correctly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): split SecretsManager GetRandomPassword into own statement
Isolate the account-level GetRandomPassword action (which requires
Resource:*) from the scoped SecretsManager statement. With ECS the
Application policy is still only ~4K of the 6,144-char IAM limit,
leaving ~2K headroom for future services.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): add PassedToService condition to PassRole and tightening notes
Separate iam:PassRole into its own statement with iam:PassedToService
condition limiting to the 7 services ABCA passes roles to. Add
iterative tightening items for AttachRolePolicy (iam:PolicyARN) and
CreateServiceLinkedRole (iam:AWSServiceName) conditions.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): scope X-Ray resource policy, add KMS tightening, unify placeholders
- Scope X-Ray resource policy Resource from * to arn:aws:logs:*:ACCOUNT_ID:log-group:aws/spans
in QUICK_START.md and setup SKILL.md (item 7)
- Add KMS kms:ResourceAliases tightening recommendation (item 6)
- Unify placeholder to ACCOUNT_ID everywhere with substitution note (item 8)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): correct VPC endpoint cost to ~$102/mo and clarify session timeouts
VPC endpoint cost was ~$50/mo (1 AZ math), actual is ~$102/mo
(7 endpoints x 2 AZs x $0.01/hr x 730 hrs). Update baseline totals
from ~$85-95 to ~$140-150 in COST_MODEL.md and DEPLOYMENT_GUIDE.md.
Clarify the two distinct timeout limits: AgentCore 8-hour service
limit vs orchestrator 9-hour executionTimeout.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): add GitHubTokenSecret to SecretsManager resource scope
CDK generates the GitHub token secret with construct ID hash
(GitHubTokenSecret09BC4210-*), not the backgroundagent- prefix.
Add this pattern to the SecretsManager statement Resource list.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(docs): add vpc-flow-logs and bedrock-agentcore to PassedToService
V3 least-privilege deploy found two missing services in the
iam:PassedToService condition: vpc-flow-logs.amazonaws.com (VPC
Flow Log role) and bedrock-agentcore.amazonaws.com (AgentMemory
service role).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Scott Schreckengaust <345885+scottschreckengaust@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Alain Krok <alkrok@amazon.com>1 parent 808b6a0 commit 3da9751
16 files changed
Lines changed: 1768 additions & 34 deletions
File tree
- docs
- abca-plugin/skills
- deploy
- setup
- design
- guides
- scripts
- src/content/docs
- architecture
- getting-started
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
57 | 65 | | |
58 | 66 | | |
59 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| 41 | + | |
41 | 42 | | |
42 | 43 | | |
43 | 44 | | |
| |||
120 | 121 | | |
121 | 122 | | |
122 | 123 | | |
123 | | - | |
| 124 | + | |
124 | 125 | | |
125 | | - | |
| 126 | + | |
126 | 127 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
| 3 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| 55 | + | |
| 56 | + | |
55 | 57 | | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
56 | 62 | | |
57 | 63 | | |
58 | 64 | | |
59 | | - | |
| 65 | + | |
60 | 66 | | |
61 | 67 | | |
62 | 68 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
| 14 | + | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
20 | 24 | | |
21 | 25 | | |
22 | 26 | | |
| |||
43 | 47 | | |
44 | 48 | | |
45 | 49 | | |
46 | | - | |
| 50 | + | |
47 | 51 | | |
48 | 52 | | |
49 | 53 | | |
50 | 54 | | |
51 | 55 | | |
52 | 56 | | |
53 | 57 | | |
54 | | - | |
55 | | - | |
| 58 | + | |
| 59 | + | |
56 | 60 | | |
57 | 61 | | |
58 | 62 | | |
| |||
72 | 76 | | |
73 | 77 | | |
74 | 78 | | |
75 | | - | |
76 | | - | |
| 79 | + | |
| 80 | + | |
77 | 81 | | |
78 | 82 | | |
79 | 83 | | |
| |||
85 | 89 | | |
86 | 90 | | |
87 | 91 | | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
0 commit comments