Generated banner for AWS Investigation
Generated logo for AWS Investigation

AWS Investigation

AWSOfficialPublished by AWS

  • Skill
  • Guidelines
  • Cloud and DevOps
  • Apache-2.0
  • No issues found

From the author

Investigates what is happening in an AWS account from evidence already recorded there. Not for capturing new data from running code (snapshots of function arguments on a live service, Dynamic Instrumentation), questions answered from the CloudWatch Omni context graph or Application Signals service map, or building or changing infrastructure. Covers reading deployment records instead of the newest stored version (completed AppConfig deployments, the version an alias points to, a stack's current template), following a request through every service's own logs (exact per-layer fields, unique failed requests in an alarm's breach window, failure boundary per event), and answering questions from the account's data (exact counts and breakdowns, coverage of the requested range, exact filters and joins, the rule behind failed or unmatched records, verbatim values). Use to triage an alarm, error spike or failed request, trace a request across services, or count, break down, extract or join records.
— the description by AWS

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

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/aws/aws-investigation/download
  2. Unzip 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 aboutRead
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 blockedreferences/deployed-artifacts.md
A request, alarm or incident that spans several services: tracing one request, counting failed requests, deciding where an event was lostreferences/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 recordsreferences/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 questionreferences/completeness-and-root-cause.md

Rules for every investigation

  1. 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.

  2. 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.

  3. Count exactly. Use aggregate queries run in the engine, scoped to exactly what was asked, and report unique entities separately from raw records.

  4. Quote, don't paraphrase. Give identifiers, field values, error codes and messages exactly as the source produced them, including null and empty values.

  5. 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:

  1. Have you searched all relevant regions and scopes?

  2. Have you paginated through all results, and said which part of the requested range has data?

  3. Have you verified the scope of failures (entity-specific vs fleet-wide, the whole affected population)?

  4. Does your root cause fit all the facts you found?

  5. 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?

  6. Did your claims about live configuration come from the deployed artifact, not the latest stored version (deployed-artifacts.md)?

  7. 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)?

  8. Have you answered the user's specific question directly?

  9. Before you finish, have you reread your conclusion against each piece of evidence you collected and removed any statement that contradicts it?

  10. Have you removed any contradictions between your findings and recommendations, and checked each runbook option against the confirmed cause?

Files

references/data-investigation.md

Data investigation

Use this when the answer is in the account's data, logs or configuration: counts, breakdowns, extracts, joins, or why records are failed or unmatched. Whether a finding is complete (pagination, range coverage, the whole affected population) and whether a root cause holds is in completeness-and-root-cause.md.

Missing or ambiguous parameters

If a parameter is ambiguous or missing (end of a date range, number of iterations, grouping convention), discover it from the live environment first: query the available partitions or the latest dates in the data, list existing resources, and choose the most natural default (for example consecutive fixed-size windows from the stated start date up to the latest available data). State the choice in the answer.

Finding the data source

If a request names data, fields or values without saying where they are stored, find the source before doing anything else:

  1. List likely stores in the account and region: DynamoDB tables, S3 buckets and prefixes, Glue and Athena databases and tables, RDS and Redshift, OpenSearch, Bedrock knowledge bases.

  2. Look for names that match the request's terms.

  3. Sample items, describe schemas or scan with filters to confirm which attributes hold the values the user mentioned.

Configuration plus data: failed, unmatched or exception records

When asked why records are in an exception, unmatched or failed state, investigate the configuration as well as the data:

  1. Find the rules first. Search every reachable store: S3 configuration or rule objects outside the data prefixes, DynamoDB tables, SSM parameters, Secrets Manager and AppConfig, Lambda, Step Functions and Glue job definitions and environment variables, and rule tables in the catalog.

  2. For each category and subcategory involved, check whether a matching or processing rule exists and is enabled. Report any category without a rule as a candidate root cause.

  3. Break the largest contributors down by category and subcategory, outcome or status, and secondary dimensions such as currency, with exact counts for each breakdown, not only totals.

Counting

  • Exact aggregates. Get numbers with aggregate queries (COUNT or SUM with GROUP BY) run in the query engine. Do not pull raw rows and estimate, and never describe counts as approximate patterns.

  • Alarms and requests. Scoping counts to an alarm's dimensions and counting unique failed requests are in multi-service-logs.md; widening from one failed record to the whole affected population is in completeness-and-root-cause.md.

Extracting and filtering records

  1. Split the conditions. Break the request into separate filters (reason or category, current state, subset of a reference list).

  2. Map each to the source data. List the distinct category values, read the registry's own category definitions, and check how the current state is recorded (latest event per item, reinstatement records).

  3. Use exactly the subsets the user named, and leave out neighbouring categories they did not ask for.

  4. Re-derive, don't copy. Do not copy filters or row sets from earlier output files without deriving them again from the source.

  5. Verify before delivering. Confirm that a sample of included rows meets every condition, look for rows wrongly left out (case or spacing differences, items with several records), and report the count after each filtering step.

Joining tables for complete rows

When the user names one table as the authority for which records count:

  1. Use that table to decide which rows are included.

  2. If it lacks a requested field, inspect the schemas of related tables, find the shared keys (IDs, source identifiers, batch or group IDs, array columns that need unnesting) and join to get it.

  3. Never output "N/A" or "could not be derived" for a requested field until you have tried those joins.

  4. Do not collapse rows that share a key: if several entities map to one identifier, list each.

  5. Copy identifier values from query results instead of retyping them, and check that every row has every requested field before writing the answer.

Output

  • Literal values. When the user asks for records, logs or query results rather than an analysis, give every value (timestamps, identifiers, URLs, codes, headers) exactly as the source produced it, never as categories, prefixes, inferred buckets or paraphrases. If the output is too large, write the complete raw rows to a CSV or JSON file and point to it. Collapse only rows that are identical on every selected field, showing the full values and a count. Summaries come in addition to the raw values, never instead of them.

  • Exact error evidence. Quote the status code and the error code and message from the failing response payload word for word, not a summary such as "HTTP 500".

  • Every requested artifact. Produce every file or plan asked for (Excel workbooks, CSV files, EXPLAIN plans), run every step, and assume any role or credentials you were told to use.

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.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download aws-investigation.zip