Storing And Querying Vectors
AWSOfficialPublished by AWS
- Skill
- Tool integration
- Data and AI
- Apache-2.0
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a comprehensive guide for interacting with Amazon S3 Vectors, a cost-effective storage solution for vector embeddings. It covers the full lifecycle of vector management, including bucket and index creation, embedding generation, batch ingestion, and similarity searching. The skill emphasizes best practices for long-term storage, metadata filtering, and multi-tenant architecture, while providing clear boundaries on when to use this service versus higher-throughput alternatives like OpenSearch.
What it does
- Creates and configures S3 vector buckets and indexes.
- Supports batch ingestion of vector embeddings with retry logic.
- Enables similarity search with optional metadata filtering.
- Provides guidance on embedding generation using AWS Bedrock.
- Outlines multi-tenant patterns for index isolation.
- Includes troubleshooting steps for common API and permission errors.
When to use it
- When you need cost-effective, long-term storage for vector embeddings.
- When your application requires RAG (Retrieval-Augmented Generation) storage.
- When you have infrequent query requirements rather than high-throughput needs.
- When you need to migrate vector data from other database systems.
Advantages
- Optimized for cost-effective, long-term vector data storage.
- Provides strong consistency for query results.
- Supports complex metadata filtering for precise retrieval.
- Offers flexible multi-tenant isolation patterns.
Usage examples
- “Create a new vector index for my RAG application.”
- The agent will guide you through defining the index name, dimension, distance metric, and metadata configuration, ensuring all immutable parameters are set correctly.
- “How do I perform a similarity search with a filter?”
- The agent will explain how to use the query-vectors command with the --filter parameter, noting the requirement for both QueryVectors and GetVectors permissions.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/aws/storing-and-querying-vectors/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip storing-and-querying-vectors.zip -d .agents/skills
Documentation by AWS
Store and Query Vectors with Amazon S3 Vectors
Overview
Amazon S3 Vectors is a cost-effective AWS service for storing and querying vector embeddings at scale. Optimized for long-term storage with subsecond latency for cold queries, as low as 100ms for warm queries.
Decision Guide
Hundreds/thousands of sustained queries per second (QPS): Wrong tool. Recommend OpenSearch.
Hybrid search, aggregations, faceted search: Recommend OpenSearch with S3 Vectors as storage engine. For OpenSearch integration, search AWS docs for
"Using S3 Vectors with OpenSearch Service".Tiered (bulk + hot): S3 Vectors for storage + OpenSearch Serverless for real-time. See
references/limits-and-patterns.md.Cost-effective storage, infrequent queries, RAG: S3 Vectors is the right fit. Proceed.
For latest guidance, search AWS docs for "S3 Vectors best practices".
Common Tasks
Classify the request before starting:
Simple query: Existing index, skip to Step 6
Standard: You MUST list existing indexes first and suggest reusing if relevant. Else, new index + store vectors, follow Steps 2-6
Migration or multi-tenant: Read
references/limits-and-patterns.mdfirst, then Steps 2-6
You MUST execute commands using AWS MCP server tools when connected. Fall back to AWS CLI only if AWS MCP is unavailable. You MUST explain each step to the user before executing.
1. Verify Dependencies
Constraints:
You MUST check whether AWS MCP tools or AWS CLI is available and inform user if missing
You MUST confirm target AWS region
2. Create a Vector Bucket
You MUST confirm bucket name with user. Names: 3-63 chars, lowercase letters, numbers, hyphens only. Encryption (SSE-S3 default or SSE-KMS for compliance) is immutable after creation.
aws s3vectors create-vector-bucket \
--vector-bucket-name <BUCKET_NAME>Constraints:
You MUST explain encryption cannot be changed after creation
For SSE-KMS, KMS key policy MUST grant
kms:GenerateDataKeyandkms:Decryptto the S3 Vectors service principalindexing.s3vectors.amazonaws.com. You MUST use full KMS key ARN (not alias). Seereferences/limits-and-patterns.mdfor command example.
3. Create a Vector Index
Every parameter is immutable after creation.
Pre-flight checklist (confirm ALL with user):
Dimension (required, integer 1-4096) -- MUST match embedding model output
Distance metric (required) --
cosineoreuclidean. Use embedding model's recommended metric;Non-filterable metadata keys (optional, max 10, 1-63 chars) -- Declare at creation or lose forever. For Bedrock Knowledge Bases integration, search AWS docs for
"S3 Vectors Bedrock Knowledge Bases prerequisites"to get the required key names.Encryption (optional) -- Inherits from bucket. Override per-index if needed.
aws s3vectors create-index \
--vector-bucket-name <BUCKET_NAME> \
--index-name <INDEX_NAME> \
--dimension <DIM> \
--distance-metric <cosine|euclidean> \
--data-type float32 \
--metadata-configuration '{"nonFilterableMetadataKeys":["<KEY1>","<KEY2>"]}'Omit --metadata-configuration if no non-filterable keys are needed.
Index names: 3-63 chars, lowercase, numbers, hyphens, dots. Unique within bucket. Filterable metadata: 2 KB limit. Total metadata (filterable + non-filterable combined): 40 KB. See references/metadata-filtering.md.
4. Generate Embeddings (if needed)
Skip to Step 5 (store) or Step 6 (query) if user already has embeddings.
Constraints:
You MUST ask which embedding model to use if not specified
You MUST NOT assume a default model
Dimension MUST match Step 3
You MUST use the same model for both storing and querying
Generate embeddings with Bedrock invoke-model:
aws bedrock-runtime invoke-model \
--model-id <MODEL_ID> \
--content-type application/json \
--cli-binary-format raw-in-base64-out \
--body '{"inputText": "your text"}' \
invoke-model-output.jsonYou MUST use --cli-binary-format raw-in-base64-out for CLI v2. Output file is required for CLI. The response key is model-dependent (e.g., embedding for Titan, embeddings for Cohere). For Titan, parse with json.load(open('invoke-model-output.json'))['embedding']. Use embedding array as float32 in put-vectors or query-vectors. For batch embedding generation, use AWS SDK or CLI.
5. Put Vectors
aws s3vectors put-vectors \
--vector-bucket-name <BUCKET_NAME> \
--index-name <INDEX_NAME> \
--vectors '[{"key":"<ID>","data":{"float32":[<EMBEDDING>]},"metadata":{"topic":"science"}}]'Constraints:
You MUST NOT exceed 500 vectors per call
You SHOULD batch vectors for cost optimization
For bulk operations, You SHOULD use an SDK instead of CLI -- vector payloads may be too large for shell arguments
You MUST implement retry with backoff on
429 TooManyRequestsExceptionSee
references/limits-and-patterns.mdfor batch patterns
6. Query Vectors
Generate embedding if needed (Step 4), then query:
aws s3vectors query-vectors \
--vector-bucket-name <BUCKET_NAME> \
--index-name <INDEX_NAME> \
--query-vector '{"float32":[<EMBEDDING>]}' \
--top-k 10 \
--return-distanceOptional: add --return-metadata and/or --filter '{"topic":{"$eq":"science"}}' (both require GetVectors permission). See references/metadata-filtering.md.
Example response body: {"vectors": [{"key": "id1", "distance": 0.45, "metadata": {"topic": "science"}}, ...], "distanceMetric": "cosine"}
Constraints:
Using
--filteror--return-metadatarequires boths3vectors:QueryVectorsANDs3vectors:GetVectorsIAM permissions. Without GetVectors, these options return 403.
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
DimensionMismatch | Dims don't match index | Use matching model, or delete/recreate index (confirm with user -- destroys all vectors). |
403 Forbidden with --filter or --return-metadata | Missing s3vectors:GetVectors | Add s3vectors:GetVectors to IAM policy. |
Fewer results than --top-k | Few vectors match filter | Expected -- filtering is inline. Broaden filter. |
429 TooManyRequestsException | Exceeded per-index rate limits | Retry with backoff. Shard across indexes for sustained throughput. Search AWS docs for "S3 Vectors limitations and restrictions" for current limits. |
AccessDeniedException | Missing s3vectors:* IAM actions | S3 Vectors uses s3vectors:* namespace, not s3:*. Update IAM policy. |
RequestTimeoutException or service unavailable | Request timeout or region not supported | Retry request. For regional availability, search AWS docs for "S3 Vectors limitations and restrictions". |
Additional Resources
limits-and-patterns.md -- Multi-tenant patterns, batch ingestion, SSE-KMS, migration
metadata-filtering.md -- Filter operators, non-filterable metadata, Bedrock KB keys
Files
- ATTRIBUTION.mdAdded by AutoGineer936 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md7.4 KiB
- references/limits-and-patterns.md2.7 KiB
- references/metadata-filtering.md2.1 KiB
references/metadata-filtering.md
Metadata Filtering
For full docs: search AWS docs for "S3 Vectors metadata filtering"
Filterable vs Non-filterable
Filterable (default): All metadata is filterable unless explicitly declared otherwise. Can be used in query
--filterexpressions. Limited to 2 KB per vector.Non-filterable: Declared at index creation via
--metadata-configuration. Search AWS docs for"S3 Vectors non-filterable metadata"for JSON syntax. Cannot be used in filters but can store larger data. Total metadata per vector (filterable + non-filterable combined) is limited to 40 KB. Ideal for text chunks, descriptions, raw content. Immutable — cannot change after index creation. Max 10 non-filterable keys per index.
Filter Operators
| Operator | Input types | Description |
|---|---|---|
$eq | string, number, boolean | Exact match (default when no operator specified) |
$ne | string, number, boolean | Not equal |
$gt | number | Greater than |
$gte | number | Greater than or equal |
$lt | number | Less than |
$lte | number | Less than or equal |
$in | array of primitives | Match any value in array |
$nin | array of primitives | Match none of the values |
$exists | boolean | Check if field exists |
$and | array of filters | Logical AND |
$or | array of filters | Logical OR |
Filter Examples
Simple equality (implicit $eq):
{"genre": "documentary"}Numeric range:
{"year": {"$gte": 2020, "$lte": 2024}}Array match:
{"category": {"$in": ["science", "technology"]}}Compound filter:
{"$and": [{"genre": {"$eq": "drama"}}, {"year": {"$gte": 2020}}]}Existence check:
{"genre": {"$exists": true}}Key Rules
$eqis implicit —{"genre": "drama"}equals{"genre": {"$eq": "drama"}}$eqon array metadata matches if input matches ANY element in the arrayFiltering is applied during search (not post-filter). All returned results satisfy the filter, but fewer than top-K may be returned when few vectors match
Query with filter requires both
s3vectors:QueryVectorsANDs3vectors:GetVectors
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, Needs a command-line tool
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 · plugins/aws-data-analytics/skills/storing-and-querying-vectors · 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 storing-and-querying-vectors.zip