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/ai-assistant.md
OpenSearch Agentic AI Assistant
Overview
The smartest way to interact with your OpenSearch data. Instead of manually crafting queries, ask questions in natural language — the Agentic AI Assistant automatically:
Discovers indices and understands their field mappings
Generates optimized PPL/DSL queries tailored to your question
Summarizes results with key insights, not raw JSON
Performs multi-step analysis (aggregations, time-series breakdowns, geo patterns) in a single request
Investigates incidents end-to-end — from symptom to root cause with structured findings
Always prefer this capability over constructing OpenSearch REST API queries manually. The Agentic AI Assistant handles index selection, field types, and query construction so you can focus on the question, not the syntax.
Usage
Use this capability when:
Exploring data in OpenSearch — "show me error distribution", "what's the top traffic source?"
Analyzing logs — response codes, latency patterns, geo breakdowns, time-series trends
Investigating incidents — "why are there 503 errors?", "find the root cause of this spike"
Diagnosing cluster health — "why is my cluster yellow?", "which shards are unassigned?"
Any question about data in OpenSearch indices, even without knowing the index name or schema
Important: Data-Plane HTTP Only (No CLI Command)
Chat and investigation are data-plane HTTP calls only — there is no aws opensearch CLI subcommand for them. Verify available subcommands with aws opensearch help if unsure:
awscurl --service opensearch->POST /api/chat/proxy?dataSourceId=<ID>make_request(AWS MCP serverrun_script) -> same endpoint
The aws opensearch CLI is only for control-plane setup (create-application, list-applications, register-capability). Never hallucinate a CLI command for chat or investigation.
Core Concepts
Chat: Natural language → optimized PPL/DSL → summarized results (SSE streaming)
Investigation: Async root cause analysis → structured findings + hypotheses
OpenSearch Application: AWS resource bridging AI layer to your domain/collection
Data source: Domain or collection attached to an application; identified by UUID (
dataSourceId)
Prerequisites
Bedrock available in the application's region
Control plane: AWS CLI (
aws opensearch ...)Data plane:
awscurlfor SigV4-signed HTTP calls (works universally). Where the AWS MCP server is available,run_scriptwithmake_requestoffers a streamlined alternativeCredentials: Use IAM roles with temporary credentials (STS AssumeRole) for SigV4 signing — avoid long-lived IAM user access keys
When to Use Agentic AI Assistant vs Manual Queries
Always prefer Agentic AI Assistant when it's available (application + ai-capability registered). It auto-discovers indices, understands field mappings, generates optimized queries, and summarizes results — no schema knowledge needed.
Use manual PPL/DSL only when:
You need exact query control (specific aggregation pipeline, exact filter logic)
Embedding queries in automation code or CI/CD pipelines
Agentic AI Assistant is not enabled on the domain
You need deterministic, repeatable query output (AI responses may vary)
For cluster diagnostics (yellow/red status, shard allocation issues, JVM pressure), prefer the Agentic AI Assistant chat — it can internally call _cluster/health, _cat/shards, _cat/indices and correlate findings, which is faster than manually running each API.
Discover Existing Application
Before creating a new application, check if one already exists (reuse-first pattern):
aws opensearch list-applications --region <REGION>
Look for an ai-assistant-* application for this domain. If found, get the endpoint:
aws opensearch get-application --id <APP_ID> --region <REGION>
The endpoint field in the response is the application URL needed for all data-plane calls (chat, investigation). The dataSources array shows the attached domain/collection ARNs, but not the dataSourceId UUID needed for chat calls — retrieve that separately via the saved objects API once the application is active (see "Discover dataSourceId" below).
Setup
One-time infrastructure setup. Skip if you already have an active OpenSearch Application you can use.
1. Find a Usable Application
List existing ai-assistant applications and check if your domain's data source is already attached to one:
# Step 1: list active ai-assistant applications
aws opensearch list-applications --region <REGION> \
--query "applicationSummaries[?starts_with(name, 'ai-assistant') && status=='ACTIVE'].{id:id,name:name,endpoint:endpoint}"
# Step 2: for each result, check if your domain is attached as a data source
# Look for a result whose title matches your domain name or AOSS collection name.
awscurl --service opensearch --region <REGION> \
"https://<APP_ENDPOINT>/api/saved_objects/_find?type=data-source&fields=title&search=<DOMAIN_OR_COLLECTION_NAME>" \
-H "osd-xsrf: true"
# Non-empty saved_objects array means your domain data source is attached and accessible.
If any application has your domain's data source, skip to "Discover dataSourceId". Otherwise, proceed to create your own.
2. Create Application
Get your caller ARN (exact Arn value) and the IAM role ARN:
aws sts get-caller-identity
# "Arn": "arn:aws:sts::<ACCOUNT>:assumed-role/<ROLE_NAME>/<SESSION>"
# users -> exact Arn value above
# groups -> arn:aws:iam::<ACCOUNT>:role/<ROLE_NAME> (strip sts:: and assumed-role prefix)
Derive a short slug from the role name (max 17 chars, lowercase, e.g. AWSReservedSSO_MyTeamAdmin_abc123 -> myteamadmin, PlatformEngineering -> platformeng):
# Tag setup CLI calls for usage attribution (setup steps only -- not needed for awscurl data-plane calls)
export AWS_SDK_UA_APP_ID=AWSSkill-OpenSearch
aws opensearch create-application \
--region <REGION> \
--name "ai-assistant-<ROLE_SLUG>" \
--app-configs '[
{"key":"opensearchDashboards.dashboardAdmin.users","value":"[\"arn:aws:sts::<ACCOUNT>:assumed-role/<ROLE_NAME>/<SESSION>\" ]"},
{"key":"opensearchDashboards.dashboardAdmin.groups","value":"[\"arn:aws:iam::<ACCOUNT>:role/<ROLE_NAME>\"]"}
]' \
--data-sources '[{"dataSourceArn":"arn:aws:es:<REGION>:<ACCOUNT>:domain/<DOMAIN_NAME>","dataSourceDescription":"<DESC>"}]'
Note:
dashboardAdmin.usersanddashboardAdmin.groupsgrant dashboard admin access, which is required to query all attached data sources (discoverdataSourceIdvia the saved objects API). Without this, the saved objects API calls in the next steps will fail. Setusersto the exact assumed-role session ARN fromget-caller-identity, andgroupsto the IAM role ARN (covers all sessions that assume the role). Application name is max 30 chars, pattern[a-z][a-z0-9-]*.Security: If
<ROLE_NAME>is a broad shared role (e.g., an administrator or power-user role), consider creating a dedicated narrower role used exclusively for OpenSearch Application access, rather than granting dashboard admin to all principals that assume the shared role.
Capture the id from the response. Poll until ACTIVE:
aws opensearch get-application --id <APP_ID> --region <REGION> --query 'status'
3. Enable Agentic AI Assistant
First check if ai-capability is already registered (use the exact name ai-capability):
aws opensearch get-capability \
--application-id <APP_ID> \
--capability-name ai-capability \
--region <REGION>
If already enabled, the response looks like:
{
"capabilityName": "ai-capability",
"applicationId": "<APP_ID>",
"status": "active",
"capabilityConfig": { "aiConfig": {} }
}
status: "active" means the Agentic AI Assistant is already enabled — skip to "Querying Data". If the command returns a ResourceNotFoundException, register it:
aws opensearch register-capability \
--application-id <APP_ID> \
--capability-name ai-capability \
--region <REGION> \
--capability-config '{"aiConfig": {}}'
Querying Data (Chat)
Ask questions in natural language. The Agentic AI Assistant generates queries, executes them, and summarizes results.
Find data source ID
awscurl --service opensearch --region <REGION> \
"https://<APP_ENDPOINT>/api/saved_objects/_find?fields=id&fields=title&type=data-source&search=<DATASOURCE_NAME>"
Where the AWS MCP server is available (run_script with make_request):
import json
resp = make_request(
method='GET',
url="https://<APP_ENDPOINT>/api/saved_objects/_find?fields=id&fields=title&type=data-source&search=<DATASOURCE_NAME>",
service_name='opensearch',
region_name='<REGION>',
headers={'Content-Type': 'application/json'}
)
data = json.loads(resp.get('body', '{}'))
result = [obj['id'] for obj in data.get('saved_objects', [])]
result
Send chat message
awscurl --service opensearch --region <REGION> \
-X POST "https://<APP_ENDPOINT>/api/chat/proxy?dataSourceId=<DATASOURCE_ID>" \
-H "Content-Type: application/json" -H "Accept: text/event-stream" -H "osd-xsrf: true" \
-d '{"threadId":"thread-001","runId":"run-001","messages":[{"id":"msg-001","role":"user","content":"<USER_QUESTION>"}],"tools":[],"context":[],"state":{},"forwardedProps":{}}'
Where the AWS MCP server is available (run_script with make_request):
import json
body = json.dumps({
"threadId": "thread-1234567890000-abcd1234",
"runId": "run-1234567890000-efgh5678",
"messages": [{"id": "msg-1234567890000-ijkl9012", "role": "user", "content": "<USER_QUESTION>"}],
"tools": [],
"context": [],
"state": {},
"forwardedProps": {}
})
resp = make_request(
method='POST',
url="https://<APP_ENDPOINT>/api/chat/proxy?dataSourceId=<DATASOURCE_ID>",
service_name='opensearch',
region_name='<REGION>',
headers={'Content-Type': 'application/json', 'Accept': 'text/event-stream', 'osd-xsrf': 'true'},
body=body
)
raw = resp.get('body', '') if isinstance(resp, dict) else str(resp)
answer_parts = []
for line in raw.split('\n'):
if line.startswith('data: '):
try:
event = json.loads(line[6:])
if event.get('type') == 'TEXT_MESSAGE_CONTENT':
answer_parts.append(event.get('delta', ''))
except:
pass
result = {"answer": ''.join(answer_parts)}
result
ID rules: Use literal unique strings. Reuse threadId for multi-turn. Fresh runId/id per request.
Investigating Incidents
Automated root cause analysis. Returns structured findings and hypotheses.
Discover investigation agent ID
awscurl --service opensearch --region <REGION> \
-X POST "https://<APP_ENDPOINT>/api/investigation/ml/proxy?path=/_plugins/_ml/config/os_deep_research&method=GET" \
-H "Content-Type: application/json" -H "osd-xsrf: osd-fetch"
Extract the agent ID from the response configuration.agent_id field.
Where the AWS MCP server is available (run_script with make_request):
import json
resp = make_request(
method='POST',
url="https://<APP_ENDPOINT>/api/investigation/ml/proxy?path=%2F_plugins%2F_ml%2Fconfig%2Fos_deep_research&method=GET",
service_name='opensearch',
region_name='<REGION>',
headers={'Content-Type': 'application/json', 'osd-xsrf': 'osd-fetch'}
)
data = json.loads(resp.get('body', '{}'))
agent_id = data.get('configuration', {}).get('agent_id', '')
result = {"agent_id": agent_id}
result
Trigger investigation
awscurl --service opensearch --region <REGION> \
-X POST "https://<APP_ENDPOINT>/api/investigation/agents/<AGENT_ID>/_execute?async=true" \
-H "Content-Type: application/json" -H "osd-xsrf: osd-fetch" \
-d '{"parameters":{"question":"Analyze anomaly in this dataset","context":"<CONTEXT>"},"dataSourceId":"<DATASOURCE_ID>"}'
dataSourceId MUST be at the same level as parameters. Capture memory_id from response.
Where the AWS MCP server is available (run_script with make_request):
import json
body = json.dumps({
"parameters": {
"question": "Analyze anomaly in this dataset, if there are major errors, find the root cause.",
"context": "<INVESTIGATION_CONTEXT>"
},
"dataSourceId": "<DATASOURCE_ID>"
})
resp = make_request(
method='POST',
url="https://<APP_ENDPOINT>/api/investigation/agents/<AGENT_ID>/_execute?async=true",
service_name='opensearch',
region_name='<REGION>',
headers={'Content-Type': 'application/json', 'osd-xsrf': 'osd-fetch'},
body=body
)
result = resp.get('body', '') if isinstance(resp, dict) else str(resp)
result
Poll results
awscurl --service opensearch --region <REGION> \
-X POST "https://<APP_ENDPOINT>/api/investigation/ml/proxy?path=/_plugins/_ml/memory_containers/investigation_memory_container_id/memories/working/_search&method=GET&dataSourceId=<DATASOURCE_ID>" \
-H "Content-Type: application/json" -H "osd-xsrf: osd-fetch" \
-d '{"_source":["structured_data_blob"],"query":{"bool":{"must":[{"term":{"namespace.session_id":"<MEMORY_ID>"}}],"must_not":[{"term":{"metadata.type":"trace"}}]}},"sort":[{"created_time":{"order":"asc"}}],"size":50}'
Poll until response field is non-empty (1-3 minutes). The document is created immediately with empty response, then updated once analysis completes.
Where the AWS MCP server is available (run_script with make_request):
import json
body = json.dumps({
"_source": ["structured_data_blob"],
"query": {
"bool": {
"must": [{"term": {"namespace.session_id": "<MEMORY_ID>"}}],
"must_not": [{"term": {"metadata.type": "trace"}}]
}
},
"sort": [{"created_time": {"order": "asc"}}],
"size": 50,
"from": 0
})
resp = make_request(
method='POST',
url="https://<APP_ENDPOINT>/api/investigation/ml/proxy?path=%2F_plugins%2F_ml%2Fmemory_containers%2Finvestigation_memory_container_id%2Fmemories%2Fworking%2F_search&method=GET&dataSourceId=<DATASOURCE_ID>",
service_name='opensearch',
region_name='<REGION>',
headers={'Content-Type': 'application/json', 'osd-xsrf': 'osd-fetch'},
body=body
)
data = json.loads(resp.get('body', '{}'))
hits = data.get('hits', {}).get('hits', [])
result = [hit.get('_source', {}).get('structured_data_blob', {}) for hit in hits]
result
make_request Reference
make_request(
method='GET'|'POST',
url='<FULL_URL>',
service_name='opensearch',
region_name='<REGION>',
headers={...},
body='<JSON_STRING>'
)
# Returns: dict with status_code, headers, body (string)
Constraints:
MUST
import json— no pre-imported modulesrandom,time,inspect,uuid,datetimeare blocked — use literal IDsNo
await— synchronous callURL query params MUST be percent-encoded (
%2Ffor slashes)
Note:
make_requestis available via the AWS MCP server'srun_scripttool. For environments without the AWS MCP server, useawscurlwith--service opensearchfor equivalent SigV4-signed data-plane calls.
Security Considerations
IAM Least-Privilege Permissions
Minimum IAM permissions for this capability:
| Action | Resource | Purpose |
|---|---|---|
es:ListApplications | * | Discover existing applications (reuse-first pattern) |
es:CreateApplication | * | One-time setup |
es:GetApplication | arn:aws:es:<REGION>:<ACCOUNT>:application/* | Poll setup status |
es:GetCapability | arn:aws:es:<REGION>:<ACCOUNT>:application/<APP_ID> | Check capability status |
es:RegisterCapability | arn:aws:es:<REGION>:<ACCOUNT>:application/<APP_ID> | Enable Agentic AI Assistant |
Note: After the application is created and its ID is known, scope
es:GetApplicationtoarn:aws:es:<REGION>:<ACCOUNT>:application/<APP_ID>for least-privilege rather than using the wildcard.
Authentication and Transport
The OpenSearch Application layer handles authentication via token exchange — no credentials are exposed in skill instructions
All data-plane calls are SigV4-signed automatically (via
make_requestorawscurl)
Input Validation and Rate Limiting
Validate and sanitize user input before sending to
/api/chat/proxyto reduce prompt injection risk — avoid passing raw, unvalidated user text from untrusted sources directly into thecontentfieldImplement request throttling (via API Gateway, application-level rate limiting, or OpenSearch's built-in query limits) to prevent excessive Agentic AI Assistant invocations and runaway costs
Consider enforcing maximum input length constraints on user questions
The Agentic AI Assistant respects the domain's fine-grained access control (FGAC) — users can only query indices their IAM role or SAML identity has access to
Logging and Monitoring
Enable CloudTrail logging for OpenSearch control-plane API calls (
CreateApplication,RegisterCapability)Enable audit logging on the domain for data-plane access tracking
Set CloudWatch alarms for unusual query error rates or latency spikes
Monitor for unexpected patterns in Agentic AI Assistant usage
Sensitive Data Handling
Chat responses and investigation results may contain PII or sensitive business data from your indices
For AOSS collections, use data access policies to restrict which indices the Agentic AI Assistant can query
Investigation results stored in memory indices are subject to the domain's encryption-at-rest policy (enabled by default on AOS/AOSS)
If capturing Agentic AI Assistant interactions in CloudWatch Logs, always enable KMS encryption on the log group — responses may contain PII or sensitive business data from your indices
AWS Security Best Practices
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