AWS Investigation
AWSOfficialPublished by AWS
- Skill
- Guidelines
- Cloud and DevOps
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
AWS Investigation provides a rigorous framework for troubleshooting and auditing AWS environments. It emphasizes evidence-based reasoning, requiring that all conclusions be derived directly from verifiable sources such as service logs, deployment artifacts, and query results. The skill mandates strict practices for data completeness, including exhaustive pagination, regional scope verification, and precise aggregate counting, while explicitly separating factual evidence from unverified hypotheses.
What it does
- Traces requests across multiple AWS services to identify failure boundaries.
- Analyzes deployment records to determine the actual state of running configurations.
- Performs exact data investigations, including counts, breakdowns, and joins.
- Verifies the scope of incidents to distinguish between entity-specific and fleet-wide issues.
- Ensures search completeness by checking all relevant regions and data partitions.
- Provides a checklist for validating root causes against collected evidence.
When to use it
- When triaging an active alarm, error spike, or failed request.
- When you need to determine the exact configuration or version of a deployed system.
- When investigating why specific records are failing or unmatched in a data pipeline.
- When you need to confirm the scope of an incident across an entire AWS account.
Advantages
- Reduces reliance on assumptions by enforcing strict evidence provenance.
- Ensures high accuracy in reporting through mandatory pagination and aggregate queries.
- Provides a clear, repeatable process for complex multi-service troubleshooting.
- Prevents common errors like partial data reporting or incomplete regional searches.
Usage examples
- “Why are requests failing for user ID 123 in the us-west-2 region?”
- The agent will list relevant log groups, perform an aggregate query to check if the error is isolated to this user or widespread, and provide a root cause based on the logs.
- “Which version of the application is currently running in production?”
- The agent will inspect the actual deployment artifacts and configuration parameters rather than relying on the latest stored version, confirming the exact version in use.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/aws-investigation/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip aws-investigation.zip -d .agents/skills
Documentation by AWS
AWS Investigation
An investigation answers a question about what an AWS account is doing, and every claim in the answer must come from something you read: a deployed artifact, a service's own log record, or a query result. Inference from names, descriptions, the newest stored version or one service's view of another is a lead, never evidence.
Pick the reference
Read the reference that matches the question before you start; most investigations need more than one.
| The question is about | Read |
|---|---|
| What a deployed system currently does, serves or executes: live configuration, feature flags, parameters, which code runs, reproducing a code path's query, or a first data route that is blocked | references/deployed-artifacts.md |
| A request, alarm or incident that spans several services: tracing one request, counting failed requests, deciding where an event was lost | references/multi-service-logs.md |
| Facts in the account's data: finding where data lives, exact counts and breakdowns, filtering, joining or exporting records, the rules behind failed or unmatched records | references/data-investigation.md |
| Whether a finding is complete and a root cause holds: searching every region and scope, paginating before counting, coverage of a date range, one entity vs the whole affected population, consistency of the root cause, whether a runbook fixes the cause, answering the user's own question | references/completeness-and-root-cause.md |
Rules for every investigation
Explore before you give up. Assume the credentials are the intended environment. Treat unfamiliar or internal terms (service nicknames, airport-code regions such as PDX = us-west-2, IAD = us-east-1) as search hints: list resources, log groups and data stores in the likely regions and search for the identifiers in the request before saying something cannot be done.
Separate evidence from inference. Keep a short provenance note per claim (
claim <- artifact, record or query). Label anything you did not read as a hypothesis or UNVERIFIED, with the routes you tried.Count exactly. Use aggregate queries run in the engine, scoped to exactly what was asked, and report unique entities separately from raw records.
Quote, don't paraphrase. Give identifiers, field values, error codes and messages exactly as the source produced them, including
nulland empty values.Finish the task. Produce every requested artifact (files, tables, plans), and state the assumptions you made in the final answer.
Closing checklist
Before submitting your analysis:
Have you searched all relevant regions and scopes?
Have you paginated through all results, and said which part of the requested range has data?
Have you verified the scope of failures (entity-specific vs fleet-wide, the whole affected population)?
Does your root cause fit all the facts you found?
Have you labelled every mechanism you could not confirm as unverified, and reported a missing component as a defect only if it was meant to exist?
Did your claims about live configuration come from the deployed artifact, not the latest stored version (deployed-artifacts.md)?
For a request that crosses services, did you read each service's own logs and place the failure boundary per event (multi-service-logs.md)?
Have you answered the user's specific question directly?
Before you finish, have you reread your conclusion against each piece of evidence you collected and removed any statement that contradicts it?
Have you removed any contradictions between your findings and recommendations, and checked each runbook option against the confirmed cause?
Files
- ATTRIBUTION.mdAdded by AutoGineer899 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md4.9 KiB
- references/completeness-and-root-cause.md8.8 KiB
- references/data-investigation.md5.1 KiB
- references/deployed-artifacts.md7.9 KiB
- references/multi-service-logs.md1.8 KiB
references/deployed-artifacts.md
Read the deployed artifact, don't infer it
A question about what a system currently does is answered only by the artifact that governs runtime. Anything else (the newest stored version, a draft, a tag, a description field, a parameter spec, or your own paraphrase of the code's query) is a proxy. Proxies are allowed as leads, never as evidence.
Core procedure
Name the governing artifact before fetching anything. Ask what the runtime actually consults. Typical answers:
the version a deployment record says is live, not the latest stored version;
the configuration served to clients, not the hosted store;
the code that executes for the question (the implementing function or executor), not the card, schema, wiring or docstring that references it;
the packaged code attached to the live version or alias, not the repository HEAD.
Retrieve that artifact and record where it came from. Keep a provenance note per claim:
claim <- artifact (identifier, version, timestamp).Check the gap between proxy and artifact explicitly. If you also saw a newer version, a description or a spec, state whether it is live, pending or only descriptive.
Reproduce queries verbatim, not from intuition. When code filters, sorts or limits data and you want to check live data, copy the exact predicate set, ordering and limit from the code. Reconcile any difference before concluding.
When a route is blocked, try the alternatives before concluding. Only after every route fails may you report the claim, and then as unverified.
Answer with staged and live separated. Never let an undeployed version, a draft or a descriptive field appear as live behaviour.
Proxy traps and the artifact that replaces them
| Proxy you reached first | Why it is not evidence | Artifact to read instead |
|---|---|---|
| Latest hosted or stored configuration version | Creating a version does not deploy it; deployment is a separate step per environment | The environment's deployment history: the ConfigurationVersion of the most recent COMPLETE deployment, or the configuration actually served to clients |
Repository HEAD, $LATEST or branch code | Clients may invoke a published version or alias that points elsewhere | The package attached to the version or alias actually invoked |
| Source template in a repository | The running stack may differ | The template the stack is running (GetTemplate on the stack) |
| Description, tag, label, schema field, card or wiring definition | Descriptive unless something enforces it | The implementing code that reads and acts on the value |
| Your own rewritten query ("status = X") | Narrower or wider than the code's predicate; a different order and limit change the "first result" and the counts | The code's exact filter set, sort direction and limit |
| One failed data route plus an empty log search | Absence of evidence from one route is not evidence of absence | Other routes (below), or label the claim as unverified |
Reproducing a code path's query
Extract from the code every status or state value in the
INset, every additional predicate (tenant, date range, soft-delete flags), theORDER BYcolumn and direction, and theLIMITor page size.Run exactly that. Do not substitute the "obvious" status, drop the limit or change ascending to descending.
If your count or first row differs from what the code would observe, explain the difference before building a root cause on it. A customer-specific root cause built on the wrong first row is a wrong root cause.
Say "N rows matched the code's query" only after running the code's query; otherwise say "my approximation returned N".
When the first route is blocked
Try these, roughly in order, and record what each returned:
Deployment or release records (which version is live, since when, in what state).
Configuration as served to clients (the data-plane read path, not the control-plane store).
The running stack's template or the packaged artifact of the live version.
Alternative data sources (replicas, exports, metrics, cached responses).
Broader log windows, other log groups, and structured fields instead of free text.
If all fail, mark each dependent conclusion UNVERIFIED with the routes tried. Do not turn "I could not see it" into "it is silently failing".
Answer template
Live behaviour (read from <artifact + identifier>): ...
Staged / pending / undeployed (read from <artifact>): ... <- NOT live
Parameter semantics (read from implementing code at <path/function>): ...
Query reproduced verbatim from <file:line>: <predicates, order, limit> -> N rows; first row = ...
Unverified: <claim> - routes tried: <list>AWS routes to the governing artifact
AWS AppConfig: what is actually being served
Creating a hosted configuration version only uploads it; a separate deployment to an environment makes it live. The newest version number in a profile says nothing about what clients receive.
Control plane, the deployment history of the environment:
ListDeployments(ApplicationId, EnvironmentId)returns deployments in descendingDeploymentNumberorder, each withConfigurationProfileId,ConfigurationVersion,State,PercentageComplete,StartedAtandCompletedAt.GetDeployment(ApplicationId, EnvironmentId, DeploymentNumber)addsEventLogandVersionLabel.Stateis one ofBAKING,VALIDATING,DEPLOYING,COMPLETE,ROLLING_BACK,ROLLED_BACK,REVERTED.
Interpretation:
The live version of a profile in an environment is the
ConfigurationVersionof the most recent deployment of that profile whoseStateisCOMPLETE.DEPLOYING,BAKINGorVALIDATINGmeans a partial rollout: report the prior complete version and the in-flight one, withPercentageComplete.ROLLED_BACKorREVERTEDmeans the targeted version is not live; fall back to the previousCOMPLETEdeployment.A profile with hosted versions but no
COMPLETEdeployment in the environment has nothing live there; say so instead of reporting the newest version's content.Repeat per environment; one environment's history says nothing about another.
Data plane, the configuration as clients receive it: StartConfigurationSession then
GetLatestConfiguration returns the deployed configuration for the application, environment and
profile. It can return empty data when the caller already holds the latest version, so use a fresh
session.
AWS Lambda: which code actually runs
Clients usually invoke an alias that points to a published version, optionally weighted across two versions through
RoutingConfig.$LATESTand the repository HEAD may differ from what the alias serves.GetFunction(FunctionName, Qualifier=<version or alias>)returns that version's configuration andCode.Location, a presigned URL (valid 10 minutes) for the deployment package, orCode.ImageUriandResolvedImageUrifor container images. Read the package behind the invoked qualifier, not the unqualified function.Configuration.CodeSha256tells you whether two versions, or a version and a build, are the same code.
AWS CloudFormation: what the stack is really running
GetTemplate(StackName, TemplateStage=Original|Processed) returns the template the running stack
was created or updated with; Processed, the default, is the post-transform form. It works for
running stacks and, by stack ID, for deleted stacks up to 90 days. Use it instead of a repository
template when you need the deployed definition (inline function code, parameter wiring, resource
properties).
Descriptive fields that are not enforced
Description, VersionLabel, tags and similar fields on AppConfig deployments and hosted versions,
Lambda versions and aliases, and CloudFormation resources are user-authored metadata. They show
intent, not behaviour. Cite them only as "labelled as ...", and read the implementing code or the
deployment record for the actual meaning.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · skills/core-skills/aws-investigation · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- aws/agent-toolkit-for-aws
AutoGineer is not affiliated with or endorsed by AWS or AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-investigation.zip