AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a unified framework for interacting with Amazon OpenSearch Service (AOS) and OpenSearch Serverless (AOSS). It covers the full lifecycle of OpenSearch operations, including migration from legacy systems like Solr or Elasticsearch, infrastructure provisioning, advanced search implementation (including vector and RAG), and observability through log and trace analytics. It also features an Agentic AI Assistant for natural language data exploration and incident investigation, ensuring users can navigate complex cluster management and data analysis tasks without manual query crafting.
What it does
- Guides migration workflows from Solr, Elasticsearch, or self-managed OpenSearch to AOS/AOSS.
- Assists with provisioning, lifecycle management, and monitoring of domains and collections.
- Facilitates implementation of vector, semantic, and hybrid search, including RAG with Bedrock.
- Supports log and trace analytics using PPL, OpenTelemetry, and anomaly detection.
- Provides an Agentic AI Assistant for natural language querying and automated incident root cause analysis.
- Enforces operational best practices for sharding, storage tiering, and security configurations.
When to use it
- When planning a migration from legacy search engines to Amazon OpenSearch Service.
- When setting up or optimizing search capabilities, including vector search and RAG.
- When troubleshooting cluster health, performance, or shard allocation issues.
- When performing log or trace analysis to investigate system incidents.
- When you need to generate optimized PPL or DSL queries using natural language.
Advantages
- Centralizes complex operational knowledge across six distinct OpenSearch capabilities.
- Reduces manual query complexity by leveraging the Agentic AI Assistant.
- Provides clear, actionable guidance on production failure modes and migration blockers.
- Standardizes interactions through consistent CLI and data-plane patterns.
- Promotes architectural best practices for scaling and cost-effective storage tiering.
Usage examples
- “How do I migrate my existing Solr index to Amazon OpenSearch Service?”
- The agent identifies the migration capability, explains that Solr to OpenSearch is a refactor migration, and guides you through using the Migration Assistant for data backfill.
- “Why is my cluster status yellow and how can I fix it?”
- The agent uses the AI Assistant capability to analyze cluster health, check shard allocation, and provide specific commands or steps to resolve unassigned shards.
- “Help me set up a RAG pipeline using Bedrock and my OpenSearch domain.”
- The agent routes to the search capability, providing instructions on configuring Bedrock connectors and vector index mappings for semantic retrieval.
- “Find the root cause of the 503 errors in my application logs from the last hour.”
- The agent utilizes the AI Assistant to query logs, perform time-series analysis, and correlate findings to identify the likely root cause of the errors.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/amazon-opensearch-service/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip amazon-opensearch-service.zip -d .agents/skills
Documentation by AWS
Amazon OpenSearch Service — the unified skill
This skill answers anything about Amazon OpenSearch Service or Serverless across six capabilities. Step 0 below routes the question to ONE capability and points at that capability's entry-point reference. Everything else — when to dispatch, sub-references, capability-specific facts, cross-capability links — lives in the entry-point reference for that capability.
AWS MCP server is recommended, not required. Capability references show standard AWS CLI commands as the primary syntax (e.g.,
aws opensearch describe-domain,aws opensearchserverless create-collection). Where the AWS MCP server is available, itscall_awstool offers a streamlined alternative — but every operation in this skill MUST work via the AWS CLI alone. Data-plane HTTP calls against AOS / AOSS useawscurlfor SigV4-signed requests; this works in both contexts.
Step 0: detect the capability — first thing you do
Pick one of the six capabilities below. State the detected capability in your first sentence (e.g., "Detected capability: SEARCH — semantic search setup with Bedrock embeddings."). Then load the entry-point reference; that file describes when to dispatch, indexes the rest of the capability's files, and routes you to the next step.
| Capability | Entry-point reference |
|---|---|
| migration — Solr / Elasticsearch / self-managed OpenSearch into AOS or AOSS. Schema/query translation, sizing, cutover. | references/assessment-workflow.md |
| provisioning — Provisioning and managing AOS domains and AOSS collections. Lifecycle, upgrades, storage tiers, FGAC, monitoring. | references/provisioning-reference.md |
| search — Vector / semantic / hybrid / sparse / dense / RAG retrieval. Bedrock connectors, FAISS HNSW vs Lucene. | references/search-semantic-search-guide.md |
| log-analytics — Log search, observability, PPL, OSI ingestion, anomaly detection, OpenSearch Dashboards. Splunk/Datadog/ELK alternatives. | references/log-analytics-guide.md |
| trace-analytics — Distributed traces with OpenTelemetry. Span queries, service maps, Data Prepper. | references/trace-analytics-trace-queries.md |
| ai-assistant — Agentic AI Assistant: auto-discovers indices, generates optimized PPL/DSL queries, summarizes results, and investigates incidents end-to-end. No manual query crafting needed. | references/ai-assistant.md |
If a prompt spans capabilities (e.g., "migrate from Solr AND set up RAG on the new domain"), pick the dominant capability for the response and close with a one-line handoff to the other capability's entry-point ref.
Universal rules (apply to ALL capabilities)
These rules apply to every response, regardless of capability. Capability-specific rules (sizing math, shape detection, Migration Assistant for Amazon OpenSearch Service capability matrix, k-NN engine selection) live in the entry-point references, not here.
Report header (every multi-section response). Begin every multi-section response with a single fenced metadata block:
> Generated: <ISO 8601 timestamp> | Skill: amazon-opensearch-service v<N>. Get the time by calling thecurrent_timetool (returns ISO 8601 in UTC). Read the skill version from this file's frontmatterversion:field. For one-line answers (terse FOCUSED_OPERATIONAL replies, anti-pattern refusals) the header is optional; for any multi-section deliverable it is REQUIRED. Place it immediately after the report title and before the first##heading.No dollar estimates (HARD CONSTRAINT). Never produce
$X/month,~$1,500, or any dollar figure. Route every cost question to https://calculator.aws and stop. If a sub-reference contains dollar figures, treat them as informational context only and do NOT pass them through to the user.No credential leakage (HARD CONSTRAINT). Never include master usernames, KMS key ARNs, VPC endpoint URLs, instance IPs, or account IDs in generated output.
Pick one for every A-vs-B decision. Name a primary recommendation in one line with a one-sentence reason. A "go with B if..." caveat is allowed AFTER the primary; never lead with conditional-only guidance.
Source restatement. The first 2–3 sentences must restate the source (engine + version + scale) when known, or restate the customer's question in concrete terms. The very first text the user sees must NOT be tool narration, meta-commentary, the report title, or simply restating the question verbatim.
No marketing tone. Do NOT use "seamless", "robust", "best-in-class", "production-hardened", "enterprise-grade", "world-class", "cleanly", "elegant". Do NOT stack 3+ vague hedges ("typically", "generally", "usually", "in most cases") in a single recommendation — be specific about when it does and does not apply.
Cross-capability handoff. When a user prompt spans capabilities (e.g., "migrate from Solr AND set up RAG on the new domain"), pick the dominant capability for the response, then close with a one-line handoff: "For <other capability>, see
references/<other-capability>-<entry>.md."
Cross-cutting references (used across multiple capabilities)
These references are not capability-prefixed because they apply across capabilities. Capability entry-point references load them when relevant; SKILL.md never loads them directly.
references/sizing.md— sizing math, instance family details, OR1 trade-offs, watermarks, JVM heap rules.references/vector-knn.md— k-NN engines, memory math, RAG ingestion patterns, ELSER alternatives.references/observability.md— log analytics patterns, ISM, UltraWarm/Cold tiering, Splunk/Datadog migration playbooks.references/security.md— FGAC, encryption, VPC patterns, audit logs, compliance posture.references/personas.md— communication style per persona.references/assessment-gotchas.md— production gotcha catalog (cite by number in Migration specifics or Risks/blockers tables; each gotcha carries aCategory:tag that determines its lane).references/assessment-knowledge-retrieval.md— topic → tool → URL recipe for batched verification.
Assets (assets/): report templates for FULL_ASSESSMENT renderings (Solr-source, ES-source, executive summary).
What this skill does NOT do
Estimate dollar costs. Pricing changes monthly and account-specific (RI, Savings Plan, EDP) discount math is outside this skill's reliable scope. Use https://calculator.aws.
Move data. Use Migration Assistant for Amazon OpenSearch Service (Historical Data Migration for backfill, Live Traffic Migration for live cutover).
Build embedding models. Use Amazon Bedrock or SageMaker.
Replace Splunk SPL or Datadog APM 1:1. Some queries / detectors / dashboards need rewriting.
Tune relevance for a specific catalog. Use OpenSearch Benchmark
big5workload + your own judgment list.
Guardrail — where this skill's own files live (MCP vs local install)
This skill can be loaded two ways, and they resolve the skill's own bundled files from different places. Determine how the skill was loaded before reading a reference or running a script:
Loaded through the AWS MCP server's
retrieve_skilltool: The skill is not installed on the local filesystem. You MUST fetch each reference or script viaretrieve_skillwith thefileparameter (e.g.file="references/architecture.md"orfile="scripts/deploy.py"), and run the script from the returned content. Do NOTfile_readthese paths locally — they do not exist on disk.Installed locally (e.g.
.kiro/skills/your-skill/or~/.claude/skills/your-skill/): Read and run files from the local skill directory using relative paths.
This distinction applies only to the skill's own packaged files. User data and
session artifacts are always read from and written to the user's working
directory. Never fetch or write customer data through retrieve_skill.
Files
- ATTRIBUTION.mdAdded by AutoGineer930 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md9.2 KiB
- assets/elasticsearch-gap-register.md5.1 KiB
- assets/elasticsearch-index-template-skeleton.md4.2 KiB
- assets/elasticsearch-report-template.md7.8 KiB
- assets/executive-summary-template.md3.0 KiB
- assets/report-template.md12.9 KiB
- assets/solr-gap-register.md3.8 KiB
- assets/solr-index-template-skeleton.md3.7 KiB
- assets/solr-report-template.md5.9 KiB
- assets/tech-deepdive-template.md6.2 KiB
- references/ai-assistant.md18.0 KiB
- references/assessment-gotchas.md17.1 KiB
- references/assessment-knowledge-retrieval.md9.3 KiB
- references/assessment-shape-anti-pattern-pushback.md10.4 KiB
- references/assessment-shape-comparative-decision.md12.9 KiB
- references/assessment-shape-focused-operational.md9.9 KiB
- references/assessment-shape-full-assessment.md20.7 KiB
- references/assessment-shape-overview.md12.1 KiB
- references/assessment-shape-schema-conversion.md8.9 KiB
- references/assessment-shape-sizing-only.md9.4 KiB
- references/assessment-shape-translation.md12.3 KiB
- references/assessment-workflow.md48.4 KiB
- references/compatibility-rubric.md5.9 KiB
- references/log-analytics-guide.md18.0 KiB
- references/log-analytics-osi-pipelines.md8.6 KiB
- references/log-analytics-troubleshooting.md1.6 KiB
- references/observability-ppl-reference.md15.1 KiB
- references/observability.md14.5 KiB
- references/personas.md10.4 KiB
- references/provisioning-agentic-setup.md4.8 KiB
- references/provisioning-domain-deploy-search.md2.2 KiB
- references/provisioning-domain-provision.md3.4 KiB
- references/provisioning-monitoring.md3.4 KiB
- references/provisioning-reference.md6.8 KiB
- references/provisioning-serverless-agentic-setup.md14.9 KiB
- references/provisioning-serverless-deploy-search.md6.7 KiB
- references/provisioning-serverless-deprovision.md4.0 KiB
- references/provisioning-serverless-provision.md8.8 KiB
- references/provisioning-storage-tiers.md2.1 KiB
- references/provisioning-troubleshooting.md8.0 KiB
- references/provisioning-upgrades.md5.4 KiB
- references/readiness-rubric.md3.4 KiB
- references/search-bedrock-connectors.md3.8 KiB
- references/search-dense-vector-models.md5.5 KiB
- references/search-document-processing-guide.md7.7 KiB
- references/search-evaluation-guide.md5.3 KiB
- references/search-index-config.md2.4 KiB
- references/search-recipes.md12.9 KiB
- references/search-semantic-search-guide.md18.2 KiB
- references/search-sparse-vector-models.md4.9 KiB
- references/search-troubleshooting.md1.9 KiB
- references/security.md9.3 KiB
- references/sizing.md12.2 KiB
- references/source-elasticsearch.md6.7 KiB
- references/source-opensearch.md4.8 KiB
- references/trace-analytics-trace-ingestion.md3.3 KiB
- references/trace-analytics-trace-queries.md13.9 KiB
- references/trace-analytics-troubleshooting.md1.6 KiB
- references/vector-knn.md12.9 KiB
references/observability-ppl-reference.md
PPL language reference (observability)
The AWS MCP server is recommended for executing these commands but is not required — all steps use standard
awscurl/ AWS CLI syntax.
Shared PPL reference for the log-analytics and trace-analytics capabilities.
Queries follow pipe-delimited syntax: source=<index> | command1 | command2 ....
Grammar is sourced from opensearch-project/sql under docs/user/ppl/.
Loaded from: log-analytics-guide.md, trace-analytics-trace-queries.md.
Query discipline (MUST follow)
Unknown command or function — you MUST consult the upstream grammar before answering. If a command, function, or parameter is not in this reference, you MUST fetch the raw markdown from
opensearch-project/sql(URLs below). You MUST NOT invent PPL syntax and you MUST NOT claim a command does not exist without checking first, because OpenSearch PPL includes many commands (for examplegraphLookup,explain,append,join) that do not exist in other query systems.You MUST verify emitted queries when a cluster endpoint is reachable. When the AOS domain or AOSS collection endpoint is available, every emitted PPL query MUST be validated with a best-effort cascade before you return it:
Execute it against
_plugins/_ppland capture the row count and any error.If it succeeds but returns 0 rows, run
_plugins/_ppl/_explainto confirm the plan parses and resolves field references, then surface the empty-result observation.If
_plugins/_pplerrors, fix the query (consult the upstream grammar as needed) and re-validate. When no endpoint is reachable, you MUST state explicitly that the query is unverified, because an untested PPL query can silently reference a non-existent field or use version-specific syntax.
Field name escaping
Dotted field names MUST be backtick-quoted, because an unquoted dot is parsed as a path separator and
fails: `attributes.gen_ai.operation.name`, `status.code`,
`resource.attributes.service.name`.
Field names beginning with a special character (e.g. the @-prefixed `@timestamp`) must also be
backtick-quoted, because the leading character is not a valid bare identifier.
API endpoints
Query (AOS uses --service es; AOSS uses --service aoss):
The endpoint URL MUST use HTTPS (not HTTP). awscurl will not upgrade an HTTP URL to HTTPS, so verify
$OPENSEARCH_ENDPOINT starts with https:// before executing any command below, because an
unencrypted data-plane request exposes the query and results in transit.
Source the SigV4 signing credentials from an IAM role (instance profile, ECS task role, or SSO session) rather than static access keys, because static access keys are a standing exfiltration risk.
awscurl --service es --region $AWS_REGION \
-X POST "$OPENSEARCH_ENDPOINT/_plugins/_ppl" \
-H 'Content-Type: application/json' \
-d '{"query": "source=otel-v1-apm-span-* | stats count() by serviceName"}'Explain (query-plan debugging):
awscurl --service es --region $AWS_REGION \
-X POST "$OPENSEARCH_ENDPOINT/_plugins/_ppl/_explain" \
-H 'Content-Type: application/json' \
-d '{"query": "source=otel-v1-apm-span-* | where `status.code` = 2 | stats count() by serviceName"}'_explain accepts an optional mode (standard / simple / cost / extended). simple, cost,
and extended require the v3 engine (plugins.calcite.enabled=true); standard works on v2 and v3.
Engine requirements are version-specific — verify whether the v3 engine is available and enabled on the
target domain/collection by checking GET _cluster/settings for plugins.calcite.enabled, or consult the
upstream opensearch-project/sql docs rather than assuming these constraints are fixed.
Core commands
| Command | Syntax | Description |
|---|---|---|
source | source=<index> | Start query from index pattern |
search | search source=<index> [<expr>] | Alternative first command; search-expression syntax (field=value, AND/OR/NOT, time modifiers) |
where | where <condition> | Filter rows |
regex | regex <field> = '<pattern>' (or !=) | Filter rows by Java regex on a field |
fields | fields [+|-] <list> | Select / exclude fields |
table | table [+|-] <list> | Alias for fields |
stats | stats <agg>... [by <field>] | Aggregate data |
sort | sort [+|-] <field> | Order results (+ asc, - desc) |
reverse | reverse | Reverse result order (no-op without a preceding sort/@timestamp; collation-destroying ops such as stats/join make it a no-op) |
head | head [N] | Limit results (default 10) |
tail | tail [N] | Return the last N results (default 10) |
eval | eval <new> = <expr> | Compute new fields |
fieldformat | fieldformat <field>=[(prefix).]<expr>[.(suffix)] | eval alias with prefix/suffix string concat for display |
dedup | dedup [N] <field> | Remove duplicates |
rename | rename <old> AS <new> | Rename fields |
replace | replace '<pat>' WITH '<repl>' IN <field> | Literal/wildcard string replace (supports *) |
convert | convert <fn>(<field>) [AS <field>] | Type-coerce (auto(), num(), mktime(), ctime(), dur2sec(), mstime(), memk(), rmcomma(), rmunit(), none()) |
top | top [N] <field> | Most frequent values |
rare | rare <field> | Least frequent values |
Time-series commands
| Command | Syntax | Description |
|---|---|---|
bin | bin <field> [span=<int>] [bins=<n>] [minspan=<int>] [aligntime=...] [start=<v>] [end=<v>] | Bucket numeric/time values (bins= on timestamps requires plugins.calcite.pushdown.enabled=true and the binned field inside a stats aggregation; otherwise use span=; verify v3 engine availability on the target domain/collection before relying on this flag) |
timechart | timechart span=<interval> <agg> [by <field>] | Time-bucketed aggregation |
chart | chart <agg> [by <row> <col>] | [over <row> [by <col>]] [limit=topN] [useother=<bool>] [usenull=<bool>] | Aggregate + pivot for 2D charts |
span() | span(<field>, <interval>) | Bucket numeric/date values |
trendline | trendline sort <field> sma(<N>, <field>) | Moving average |
streamstats | streamstats <agg> [by <field>] | Running statistics (memory-intensive) |
eventstats | eventstats <agg> [by <field>] | Add agg as field without collapsing rows (memory-intensive) |
Span time units: ms, s, m, h, d, w, M, q, y (bin also accepts us, cs, ds and
longhand forms). Timechart rate functions: per_second(), per_minute(), per_hour(), per_day().
Parse / extract commands
| Command | Syntax | Description |
|---|---|---|
parse | parse <field> '<regex>' | Regex extraction (may drop fields on some versions) |
grok | grok <field> '<pattern>' | Grok pattern extraction (memory-intensive) |
rex | rex field=<field> '<regex>' | Named capture groups |
patterns | patterns <field> | Auto-discover log patterns |
spath | spath input=<field> [output=<field>] [path=<path>] | Extract from structured JSON (runs on the coordinator node; prefer indexing fields directly on large datasets) |
Join / lookup / set commands
| Command | Syntax | Description |
|---|---|---|
join | join left=a right=b ON a.f = b.f <index> | Cross-index join |
lookup | lookup <index> <field> [OUTPUT <fields>] | Enrich from another index |
subquery | where <f> IN [source=<idx> | ... | fields <f>] | Nested query filter |
union | union [maxout=<n>] <ds1> <ds2> [...] | UNION ALL across datasets; auto type-coerces conflicting schemas |
multisearch | multisearch [<sub1>] [<sub2>] [...] | Run + merge subsearches; supports timestamp interleaving |
append | append [source=<idx> | ...] | Append results from another query |
appendcol | appendcol [override=<bool>] [<subsearch>] | Append subsearch result as additional columns |
appendpipe | appendpipe [<subpipeline>] | Append subpipeline results (runs lazily) |
graphLookup | graphLookup <idx> start=<expr> edge=<from><op><to> [maxDepth=<n>] ... as <out> | (Experimental) recursive BFS graph traversal |
Cross-index join reliability varies by engine version, so you MUST test the join on the target
domain/collection (per the query-discipline cascade above) rather than assuming it works. If it returns 0 rows
unexpectedly, fall back to separate queries correlated by traceId.
Transform commands
| Command | Description |
|---|---|
fillnull | Replace nulls (backtick fields not supported in field list) |
flatten | Flatten nested fields to top level |
expand | Expand arrays into separate rows |
mvexpand | mvexpand <field> [limit=<n>] — expand each multivalue element into its own row |
mvcombine | Combine a target field into a multivalue array across otherwise-identical rows |
nomv | Convert a multivalue field to a single string (joined by \n) |
transpose | Pivot rows into columns |
addtotals | addtotals [field-list] [row=<bool>] [col=<bool>] [label=<s>] [labelfield=<f>] [fieldname=<f>] — row/column totals (numeric only) |
addcoltotals | Column-only totals; equivalent to addtotals row=false col=true |
Function families
Aggregation:
count(),sum(f),avg(f),max(f)/min(f),distinct_count(f),percentile(f, pct),var_samp(f)/stddev_samp(f),earliest(f)/latest(f),values(f).Statistical (eval-context, scalar):
MAX(x, y, ...),MIN(x, y, ...)— these return a single value across their arguments and do NOT aggregate across rows, because they are scalar; use aggregatemax(field)/min(field)insidestatsinstead.Condition:
isnull(f)/isnotnull(f),if(cond, t, f),case(c1, v1, ..., else),coalesce(v1, v2, ...),like/in/between.Conversion:
cast(f AS type),tostring(),toint(),tolong(),tofloat(),todouble()(types: STRING, INT, LONG, FLOAT, DOUBLE, BOOLEAN, DATE, TIMESTAMP).Datetime:
now(),date_format(date, fmt),date_add(date, INTERVAL n unit),date_sub(date, INTERVAL n unit),datediff(d1, d2),day()/month()/year()/hour()/minute()/second().String:
concat(),length()/lower()/upper()/trim(),substring(s, start, len),replace(s, from, to),regexp_extract(s, pat, grp),regexp_replace(s, pat, repl).Relevance:
match(field, query),match_phrase(field, phrase),multi_match([f1, f2], query),query_string([f1, f2], query),wildcard_query(field, pattern).Math:
abs(),ceil(),floor(),round(val, decimals),sqrt(),pow(),mod(),log(),log10(),exp().Collection (multivalue):
array(...),array_length(arr),mvjoin(arr, sep),mvfilter(expr),mvindex(arr, start [, end]),mvappend(...).JSON (path notation
<key>{<idx>}...;{}= all elements):json(value),json_extract(json, path),json_array(...),json_object(...),json_keys(json).IP:
cidrmatch(ip, cidr),geoip(ip).Cryptographic:
md5(str),sha1(str),sha2(str, bits)(hex-encoded STRING digests).System:
typeof(expr).
Operators
Arithmetic: +, -, *, /, %; use parentheses for precedence. Division behavior depends on the
cluster setting plugins.ppl.syntax.legacy.preferred: when true integer/integer is truncated; when
false operands are promoted to floating point. Do not assume a default — read the effective value on
the target domain/collection with GET _cluster/settings?include_defaults=true (inspect
defaults.plugins.ppl.syntax.legacy.preferred unless overridden under persistent/transient) before
relying on the division semantics. Division by zero returns NULL, not an error. Modulo (%) is
integer-only and raises a type error on floats, because the operator has no float overload.
ML commands
| Command | Description |
|---|---|
ad | Anomaly detection (auto-detects input fields from the pipeline) |
kmeans | K-means clustering (operates on all numeric fields) |
ml action=rcf support varies by cluster version — prefer the ad command directly, and if you need
ml action=rcf, verify it against the target domain/collection (test the command) or the upstream
opensearch-project/sql docs for that version rather than assuming a fixed constraint.
System / inspection commands
| Command | Description |
|---|---|
describe <index> | Inspect index mapping and field types (use a concrete index name, not a wildcard) |
show datasources | List configured data sources |
explain [<mode>] <query> | Display the execution plan (MUST be the first command); mode ∈ standard (default) / simple / cost / extended; non-standard modes require the v3 engine |
Looking up PPL documentation
When a command/function is missing here, a query fails with a syntax error, or the user's cluster
version may differ, you MUST fetch the canonical grammar from opensearch-project/sql:
Commands:
https://raw.githubusercontent.com/opensearch-project/sql/main/docs/user/ppl/cmd/<command>.mdFunctions:
https://raw.githubusercontent.com/opensearch-project/sql/main/docs/user/ppl/functions/<category>.md(categories:aggregations,collection,condition,conversion,cryptographic,datetime,expressions,ip,json,math,relevance,statistical,string,system)
Prefer the opensearch-project/sql source over opensearch.org documentation pages, because the docs
site MAY trail the SQL repository by one or more releases.
Security Considerations
Authenticate every query with SigV4 (IAM auth), never open access. PPL queries hit the data plane (
_plugins/_ppl), so requests MUST be SigV4-signed — AOS uses--service es, AOSS uses--service aoss. Do NOT rely on public/unauthenticated endpoints, because an open data plane exposes all indexed data.PPL results can expose sensitive data. A query returns whatever fields the caller's index-level permissions allow. Callers MUST have appropriately scoped access via FGAC (AOS domains) or the collection's data access policy (AOSS), because a broad grant lets a query surface PII or other restricted fields.
Enable audit logging. Turn on CloudTrail for the management-plane API calls and OpenSearch audit logs for data-plane access so you can attribute who ran which queries, because an unaudited data plane makes misuse undetectable.
Do not log full query results to CloudWatch if they may contain PII unless the log group is encrypted with a customer-managed KMS key, because query output can carry sensitive document fields into logs.
Rate-limit, time-bound, and monitor the PPL endpoint. Enforce rate limits on
_plugins/_ppltraffic (via a fronting API gateway/proxy or AWS WAF rate-based rules) and set query timeouts so a runaway aggregation orjoincannot exhaust cluster resources; alarm on CloudWatch_plugins/_pplcall volume and error rates to catch abuse. This matters most for agentic search, where each query invokes a Bedrock model — an unthrottled path there drives both resource exhaustion and unbounded per-call cost.
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.
Needs: Needs an MCP server
Security
What our scanner noticed· Low risk
- Instructions that use the network
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 · plugins/aws-data-analytics/skills/amazon-opensearch-service · 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 amazon-opensearch-service.zip