# Migration Assistant for Amazon OpenSearch Service

Workflow-driven migration for Elasticsearch, OpenSearch, and Apache Solr workloads with manual and AI-assisted operation

- **Version**: [See releases](/solutions/latest/migration-assistant-for-amazon-opensearch-service/revisions.html)
- **Author**: AWS
- **Est. deployment time**: 15-60 mins
- **Estimated cost**: [See details](/solutions/latest/migration-assistant-for-amazon-opensearch-service/cost.html)

## Overview

Migration Assistant for Amazon OpenSearch Service assists you in migrating or upgrading your Solr, Elasticsearch and OpenSearch workloads to Amazon OpenSearch Service Service or Amazon OpenSearch Service Serverless. This AWS Solution automates manual tasks with a low-risk and prescriptive migration path for existing and live data. It also includes advanced features, such as a metadata migration tool and capture and replay comparison tooling to help you identify potential migration and upgrade issues earlier. The migration process is streamlined, performance and behavioral comparisons based on real customer workloads are enabled, and the pre-migration, migration, and validation phases are accelerated. This solution prescribes a systematic migration workflow to upgrade, migrate, recover, and modify an OpenSearch Service cluster. The workflow includes a migration console command line interface (CLI) for management, a dedicated scaling group for existing data backfill, and a replayer to synchronize live traffic between source and target clusters. Users can pause or abort the migration without affecting production traffic, thereby reducing risk. Additionally, the backfill functionality minimizes further risk by retrieving data from a snapshot, leaving the source cluster unaffected, and supporting multi-hop migrations, which decreases the overall number of migrations required. Migration Assistant also includes an AI-powered agent that guides you through assessing, deploying, and running migrations from Elasticsearch, OpenSearch, or Apache Solr to Amazon OpenSearch Service. The agent operates through an interactive command-line session where you describe your migration goal, and the agent proposes and executes the steps while pausing at approval gates for your review.

## Benefits

### Simplified management experience

Transfer data from an originating (source) cluster to a designated target (OpenSearch Service cluster).


### Adaptable, low-risk migration

Safely capture and replay traffic on source and target clusters to identify optimal performance while reducing migration risk through abort capabilities, comparison tools, source preservation, and multi-hop support.


### Centralized location for data analysis

Record requests and responses between the source and destination clusters for comparison, then forward the latency metrics and response codes to an analytics hub. You can analyze the data essential for transitioning your traffic from a legacy system to a new OpenSearch Service destination.


## How it works

You can automatically deploy this architecture using the implementation guide and the accompanying AWS CloudFormation template.

[Open implementation guide](/solutions/latest/migration-assistant-for-amazon-opensearch-service/solution-overview.html)

![Architecture diagram](/images/solutions/migration-assistant-for-amazon-opensearch-service/images/migration-assistant-for-opensearch-3.0.svg)

1. **Step 1**: Client traffic is directed to the existing cluster.
1. **Step 2**: An Network Load Balancer is positioned in front of the traffic capture proxy to route traffic as needed. The Network Load Balancer forwards traffic to the capture proxy, which then relays it to the source while simultaneously replicating the traffic to Apache Kafka.
1. **Step 3**: With continuous traffic capture in place, a Reindex-from-Snapshot (RFS) is initiated by the user through the Migration Management Console.
1. **Step 4**: After a backfill has been completed, the captured traffic is replayed by the user with a Traffic Replayer.
1. **Step 5**: The performance and behavior of traffic routed to the source and target clusters are analyzed by reviewing relevant logs and metrics.
1. **Step 6**: After confirming the target cluster’s functionality meets expectations, the user redirects clients to the new target. Additionally, the user can retire and discard the old cluster’s infrastructure.
## Get started

Install Migration Assistant once, then choose how you want to run the migration. Use the Workflow CLI for direct control, or use AI-assisted mode to generate configuration, run workflows, monitor progress, and troubleshoot with approval gates.

- **Install Migration Assistant and choose a migration path**: Install Migration Assistant once. The same installer provides the manual Workflow CLI and AI-assisted migration mode. **Workflow CLI** gives you direct control over workflow configuration, pilot runs, approval gates, validation, and cutover. **AI-assisted migration** uses the same installed tool to interpret your migration goals, generate configuration, run workflows, monitor progress, and troubleshoot failures while pausing at approval gates for your review. /* Theme tokens */ :root { --ma-text: #16191f; --ma-text-muted: #5f6b7a; --ma-link: #006ce0; --ma-link-bg-hover: rgba(0, 108, 224, 0.08); --ma-link-br-hover: rgba(0, 108, 224, 0.25); --ma-success: #037f0c; --ma-code-bg: #f4f4f4; --ma-code-border: #b6bec9; --ma-intro-bg: #f6fafd; --ma-intro-border: #006ce0; --ma-toast-bg: #16191f; --ma-toast-text: #ffffff; } .awsui-polaris-dark-mode, .awsui-dark-mode { --ma-text: #d1d5db; --ma-text-muted: #95a5b8; --ma-link: #44b9ff; --ma-link-bg-hover: rgba(68, 185, 255, 0.12); --ma-link-br-hover: rgba(68, 185, 255, 0.35); --ma-success: #29ad32; --ma-code-bg: #1f2329; --ma-code-border: #414750; --ma-intro-bg: #1a2733; --ma-intro-border: #44b9ff; --ma-toast-bg: #f4f4f4; --ma-toast-text: #16191f; } @media (prefers-color-scheme: dark) { :root { --ma-text: #d1d5db; --ma-text-muted: #95a5b8; --ma-link: #44b9ff; --ma-link-bg-hover: rgba(68, 185, 255, 0.12); --ma-link-br-hover: rgba(68, 185, 255, 0.35); --ma-success: #29ad32; --ma-code-bg: #1f2329; --ma-code-border: #414750; --ma-intro-bg: #1a2733; --ma-intro-border: #44b9ff; --ma-toast-bg: #f4f4f4; --ma-toast-text: #16191f; } } .awsui-polaris-light-mode, .awsui-light-mode { --ma-text: #16191f; --ma-text-muted: #5f6b7a; --ma-link: #006ce0; --ma-link-bg-hover: rgba(0, 108, 224, 0.08); --ma-link-br-hover: rgba(0, 108, 224, 0.25); --ma-success: #037f0c; --ma-code-bg: #f4f4f4; --ma-code-border: #b6bec9; --ma-intro-bg: #f6fafd; --ma-intro-border: #006ce0; --ma-toast-bg: #16191f; --ma-toast-text: #ffffff; } .ma-snippets { margin: 16px 0 4px; display: flex; flex-direction: column; gap: 18px; } .ma-snippets ~ * { margin-top: 0 !important; padding-top: 2px !important; border-top: none !important; min-height: 0 !important; } .ma-snippets ~ * * { min-height: 0 !important; } [class*="content-inner"][class*="with-paddings"]:has(+ .ma-snippets), [class*="content-inner"][class*="with-paddings"]:has(.ma-snippets) { padding-bottom: 0 !important; } .ma-snippets-intro { border-left: 3px solid var(--ma-intro-border); background: var(--ma-intro-bg); padding: 12px 14px; border-radius: 4px; font-size: 14px; line-height: 22px; color: var(--ma-text); } .ma-snippets-intro p { margin: 0; } .ma-snippets-intro p + p { margin-top: 6px; } .ma-snippet-step { display: flex; flex-direction: column; gap: 6px; } .ma-snippet-step-label { font-weight: 700; font-size: 14px; line-height: 20px; color: var(--ma-text); margin: 0; } .ma-snippet-step-label .ma-snippet-step-hint { font-weight: 400; color: var(--ma-text-muted); margin-left: 6px; } .ma-snippet-box { position: relative; border: 1px solid var(--ma-code-border); border-radius: 8px; background: var(--ma-code-bg); } .ma-snippet-code { display: block; padding: 12px 44px 12px 16px; margin: 0; font-family: Monaco, Menlo, Consolas, "Courier Prime", Courier, "Courier New", monospace; font-size: 13.5px; line-height: 22px; color: var(--ma-text); white-space: pre-wrap; word-break: break-word; background: transparent; } .ma-snippet-box.no-copy .ma-snippet-code { padding-right: 16px; } .ma-snippet-copy { position: absolute; top: 6px; right: 6px; width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; background: transparent; color: var(--ma-link); border: 1px solid transparent; border-radius: 4px; cursor: pointer; padding: 0; transition: background 80ms ease, border-color 80ms ease, color 80ms ease; } .ma-snippet-copy:hover { background: var(--ma-link-bg-hover); border-color: var(--ma-link-br-hover); } .ma-snippet-copy:focus-visible { outline: 2px solid var(--ma-link); outline-offset: 2px; } .ma-snippet-copy svg { width: 16px; height: 16px; display: block; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } .ma-snippet-copy.copied { color: var(--ma-success); } .ma-snippet-toast { position: absolute; top: 10px; right: 46px; padding: 4px 8px; background: var(--ma-toast-bg); color: var(--ma-toast-text); font-size: 12px; line-height: 16px; border-radius: 4px; opacity: 0; transform: translateY(-2px); transition: opacity 120ms ease, transform 120ms ease; pointer-events: none; white-space: nowrap; } .ma-snippet-toast.visible { opacity: 1; transform: translateY(0); } (function () { var SNIPPETS = [ { label: "Install the CLI", hint: "Installs Migration Assistant and starts the setup flow", command: "curl -fsSL https://solutions-reference.s3.amazonaws.com/migration-assistant-for-amazon-opensearch-service/latest/install.sh | bash" } ]; var COPY_ICON_SVG = '<svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">' + '<rect x="5.5" y="5.5" width="9" height="9" rx="1.5"/>' + '<path d="M3.5 10.5 V2.5 a1 1 0 0 1 1 -1 H10.5"/>' + '</svg>'; function buildOneSnippet(s) { var wrap = document.createElement("div"); wrap.className = "ma-snippet-step"; if (s.label) { var label = document.createElement("div"); label.className = "ma-snippet-step-label"; label.textContent = s.label; if (s.hint) { var hint = document.createElement("span"); hint.className = "ma-snippet-step-hint"; hint.textContent = " — " + s.hint; label.appendChild(hint); } wrap.appendChild(label); } var box = document.createElement("div"); box.className = "ma-snippet-box" + (s.noCopy ? " no-copy" : ""); var code = document.createElement("pre"); code.className = "ma-snippet-code"; code.textContent = s.command; box.appendChild(code); if (!s.noCopy) { var btn = document.createElement("button"); btn.type = "button"; btn.className = "ma-snippet-copy"; btn.setAttribute("aria-label", "Copy command to clipboard"); btn.title = "Copy to clipboard"; btn.innerHTML = COPY_ICON_SVG; var toast = document.createElement("span"); toast.className = "ma-snippet-toast"; toast.textContent = "Copied"; toast.setAttribute("role", "status"); toast.setAttribute("aria-live", "polite"); btn.addEventListener("click", function () { var done = function () { btn.classList.add("copied"); toast.classList.add("visible"); setTimeout(function () { btn.classList.remove("copied"); toast.classList.remove("visible"); }, 1500); }; if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(s.command).then(done, function () { fallbackCopy(s.command); done(); }); } else { fallbackCopy(s.command); done(); } }); box.appendChild(btn); box.appendChild(toast); } wrap.appendChild(box); return wrap; } function buildIntro() { var el = document.createElement("div"); el.className = "ma-snippets-intro"; el.innerHTML = '<p>Run this command from your <strong>local terminal</strong>, or from ' + '<strong>AWS CloudShell</strong> — a free, browser-based shell with the AWS CLI ' + 'pre-configured and signed in to your account.</p>' + '<p>To use CloudShell, click <strong>Launch CloudShell</strong> at the bottom of this ' + 'card and sign in if prompted.</p>'; return el; } function buildSnippets() { var container = document.createElement("div"); container.className = "ma-snippets"; container.dataset.maSnippet = "1"; container.appendChild(buildIntro()); SNIPPETS.forEach(function (s) { container.appendChild(buildOneSnippet(s)); }); return container; } function fallbackCopy(text) { var ta = document.createElement("textarea"); ta.value = text; ta.setAttribute("readonly", ""); ta.style.position = "absolute"; ta.style.left = "-9999px"; document.body.appendChild(ta); ta.select(); try { document.execCommand("copy"); } catch (e) {} document.body.removeChild(ta); } function findCardFooter(card) { var all = card.querySelectorAll("*"); for (var i = 0; i < all.length; i++) { var cls = all[i].className && all[i].className.toString ? all[i].className.toString() : ""; if (/awsui_footer_/.test(cls) || /awsdocs-card-footer/.test(cls)) return all[i]; } var link = card.querySelector('a[href*="cloudshell"]'); if (link) { var p = link; while (p && p.parentElement && p.parentElement !== card) p = p.parentElement; return p; } return null; } function tightenFooter(footer) { if (!footer) return; var node = footer, hops = 0; while (node && hops < 6) { node.style.setProperty("margin-top", "0", "important"); node.style.setProperty("padding-top", "0", "important"); node.style.setProperty("border-top", "none", "important"); node.style.setProperty("min-height", "0", "important"); if (node.previousElementSibling && node.previousElementSibling.classList && node.previousElementSibling.classList.contains("ma-snippets")) break; node = node.parentElement; hops++; } } function tightenContentInner(snippets) { if (!snippets) return; var node = snippets.previousElementSibling; if (node) { var cls = node.className && node.className.toString ? node.className.toString() : ""; if (/content-inner/.test(cls) && /with-paddings/.test(cls)) { node.style.setProperty("padding-bottom", "0", "important"); return; } } var parent = snippets.parentElement, hops = 0; while (parent && hops < 8) { var cls = parent.className && parent.className.toString ? parent.className.toString() : ""; if (/content-inner/.test(cls) && /with-paddings/.test(cls)) { parent.style.setProperty("padding-bottom", "0", "important"); return; } parent = parent.parentElement; hops++; } } function inject() { var titles = document.querySelectorAll("h3.awsdocs-card-title, .awsdocs-card-title, h3"); for (var i = 0; i < titles.length; i++) { var t = titles[i]; if (t.textContent && t.textContent.indexOf("Install Migration Assistant") !== -1) { var card = t.closest("article, .awsdocs-card") || t.parentElement; if (!card || card.querySelector("[data-ma-snippet]")) return false; var footer = findCardFooter(card); var snippets = buildSnippets(); if (footer && footer.parentNode) { footer.parentNode.insertBefore(snippets, footer); tightenFooter(footer); } else { card.appendChild(snippets); } tightenContentInner(snippets); return true; } } return false; } var tries = 0; function tick() { tries++; if (inject()) return; if (tries > 100) return; setTimeout(tick, 100); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", tick); } else { tick(); } var mo = new MutationObserver(function () { inject(); var existing = document.querySelector(".ma-snippets"); if (existing) { var card = existing.closest("article, .awsdocs-card"); if (card) tightenFooter(findCardFooter(card)); tightenContentInner(existing); } }); mo.observe(document.body, { childList: true, subtree: true }); })();

[Launch CloudShell](https://us-east-1.console.aws.amazon.com/cloudshell/home?region=us-east-1)
[Workflow CLI guide](/solutions/latest/migration-assistant-for-amazon-opensearch-service/use-the-solution.html)
[AI-assisted migration guide](/solutions/latest/migration-assistant-for-amazon-opensearch-service/agent-assisted-migration.html)


## Customers

**AllCloud** "Our work using Migration Assistant for Amazon OpenSearch Service reflects AllCloud’s commitment to customer success." **Peter Nebel, Chief Strategy Officer** [Read the case study](https://aws.amazon.com/solutions/case-studies/allcloud-case-study/)

---

## AWS Support

- [Get support for this AWS Solution](/solutions/latest/migration-assistant-for-amazon-opensearch-service/contact-aws-support.html)

## RSS Feed

- [Subscribe now to get updates on the latest release.](https://solutions-reference.s3.us-east-1.amazonaws.com/migration-assistant-for-amazon-opensearch-service/latest/rss.xml)

