Generated banner for Storing And Querying Vectors
Generated logo for Storing And Querying Vectors

Storing And Querying Vectors

AWSOfficialPublished by AWS

  • Skill
  • Tool integration
  • Data and AI
  • Apache-2.0
  • No issues found

From the author

Store and query vector embeddings using Amazon S3 Vectors, a cost-effective long-term vector storage service with its own API namespace (s3vectors). Triggers on: create S3 vector bucket, vector index, store embeddings, semantic search, RAG vector storage, similarity search, vector database, migrate from other vector databases. Do NOT use for: querying tabular data (use querying-data-lake), S3 object storage, or hundreds/thousands of sustained QPS (use OpenSearch).
— the description by AWS

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

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/aws/storing-and-querying-vectors/download
  2. Unzip 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.md first, 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:GenerateDataKey and kms:Decrypt to the S3 Vectors service principal indexing.s3vectors.amazonaws.com. You MUST use full KMS key ARN (not alias). See references/limits-and-patterns.md for command example.

3. Create a Vector Index

Every parameter is immutable after creation.

Pre-flight checklist (confirm ALL with user):

  1. Dimension (required, integer 1-4096) -- MUST match embedding model output

  2. Distance metric (required) -- cosine or euclidean. Use embedding model's recommended metric;

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

  4. 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.json

You 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 TooManyRequestsException

  • See references/limits-and-patterns.md for 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-distance

Optional: 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 --filter or --return-metadata requires both s3vectors:QueryVectors AND s3vectors:GetVectors IAM permissions. Without GetVectors, these options return 403.

Troubleshooting

ErrorCauseFix
DimensionMismatchDims don't match indexUse matching model, or delete/recreate index (confirm with user -- destroys all vectors).
403 Forbidden with --filter or --return-metadataMissing s3vectors:GetVectorsAdd s3vectors:GetVectors to IAM policy.
Fewer results than --top-kFew vectors match filterExpected -- filtering is inline. Broaden filter.
429 TooManyRequestsExceptionExceeded per-index rate limitsRetry with backoff. Shard across indexes for sustained throughput. Search AWS docs for "S3 Vectors limitations and restrictions" for current limits.
AccessDeniedExceptionMissing s3vectors:* IAM actionsS3 Vectors uses s3vectors:* namespace, not s3:*. Update IAM policy.
RequestTimeoutException or service unavailableRequest timeout or region not supportedRetry request. For regional availability, search AWS docs for "S3 Vectors limitations and restrictions".

Additional Resources

Files

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_id metadata

  • Simpler 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):

  1. Batch vectors into groups of up to 500 per PutVectors call

  2. Use parallel workers with backoff on ServiceUnavailableException

  3. For sustained throughput beyond per-index limits, shard across multiple indexes

  4. 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.):

  1. Create vector bucket and index matching source dimensions + distance metric

  2. Export vectors from source (with metadata)

  3. Batch PutVectors into S3 Vectors

  4. Verify with QueryVectors using known test vectors

  5. S3 Vectors only supports cosine and euclidean — if source used dotProduct, use cosine on 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