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://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/limits-and-patterns.md
Patterns for S3 Vectors at Scale
For current limits: search AWS docs for "S3 Vectors limitations and restrictions"
When to Use S3 Vectors
Use S3 Vectors for large, long-term vector data that doesn't require the high-throughput performance of in-memory vector databases. S3 Vectors provides a cost-optimized data foundation with query performance optimized for long-term storage and infrequent access of data. You also benefit from a storage architecture with strong consistency guarantees, ensuring subsequent queries always include your most recently added data.
S3 Vectors delivers subsecond latency for infrequent queries and as low as 100ms for more frequent queries.
Multi-Tenant Patterns
Per-tenant index (recommended for isolation):
Each tenant gets their own index within a shared vector bucket
Queries naturally scoped to one tenant
Easy to delete a tenant's data (delete the index)
Use when: tenants need strict isolation, different schemas, or independent scaling
Single index with metadata filtering (simpler):
All tenants share one index, filter by
tenant_idmetadataSimpler to manage, single query endpoint
Use when: tenants have identical schemas and moderate scale
Risk: noisy neighbor if one tenant dominates the index
Batch Ingestion Pattern
For large-scale ingestion (millions of vectors):
Batch vectors into groups of up to 500 per PutVectors call
Use parallel workers with backoff on
ServiceUnavailableExceptionFor sustained throughput beyond per-index limits, shard across multiple indexes
Search AWS docs for
"S3 Vectors limitations and restrictions"for current per-call and per-second limits
SSE-KMS Encryption
To create a vector bucket with SSE-KMS:
aws s3vectors create-vector-bucket \
--vector-bucket-name <BUCKET_NAME> \
--encryption-configuration '{"sseType":"aws:kms","kmsKeyArn":"arn:aws:kms:<REGION>:<ACCOUNT>:key/<KEY_ID>"}'You MUST use the full KMS key ARN (not alias or key ID). The KMS key policy MUST grant
kms:GenerateDataKey and kms:Decrypt to the S3 Vectors service principal indexing.s3vectors.amazonaws.com.
Encryption cannot be changed after bucket or index creation.
For full KMS policy examples, search AWS docs for "S3 Vectors data encryption KMS".
Migration Pattern
When migrating from another vector DB (pgVector, AOSS, etc.):
Create vector bucket and index matching source dimensions + distance metric
Export vectors from source (with metadata)
Batch PutVectors into S3 Vectors
Verify with QueryVectors using known test vectors
S3 Vectors only supports
cosineandeuclidean— if source used dotProduct, usecosineon normalized vectors as equivalent
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 or AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download storing-and-querying-vectors.zip