Deploy on Amazon EKS
Amazon Elastic Kubernetes Service (EKS) is the recommended production path on AWS. An EKS deployment runs the same Migration Assistant engine and workflows as a generic Kubernetes deployment, and the bootstrap script provisions the surrounding AWS infrastructure for you.
EKS deployment components
The bootstrap path prepares AWS infrastructure around the workflow engine, including:
- EKS cluster deployment into a new or existing virtual private cloud (VPC).
- Pod identity for the Migration Console and workflow pods.
- Image mirroring and VPC endpoint support for isolated subnets.
- Default Amazon Simple Storage Service (Amazon S3) bucket and snapshot-role helpers.
- Amazon CloudWatch logging and dashboards.
- AWS-aware storage and node-pool defaults.
If you are migrating to or from Amazon OpenSearch Service, this is usually the shortest path to a working production setup.
Prerequisites
Before you begin, make sure you have the following:
- An AWS account with permissions for AWS CloudFormation, Amazon EKS, AWS Identity and Access Management (IAM), Amazon Elastic Compute Cloud (Amazon EC2), Amazon Elastic Container Registry (Amazon ECR), Amazon S3, Amazon CloudWatch, and related services.
- Either AWS CloudShell or a local terminal with AWS CLI v2,
kubectl, and Helm installed. AWS CloudShell is recommended because it comes preconfigured with the required tools and avoids platform-specific issues (for example, thetaccommand used by the bootstrap script is not available on macOS by default).
Deployment label
Throughout this guide, <STAGE> is a short label such as dev, staging, or prod. It is used in cluster and resource names so you can keep multiple deployments separate.
Step 1: Download the bootstrap script
Download the bootstrap script:
curl -sL -o aws-bootstrap.sh \
"https://github.com/opensearch-project/opensearch-migrations/releases/latest/download/aws-bootstrap.sh" \
&& chmod +x aws-bootstrap.sh
Bootstrap flag reference
The following table lists the most commonly used flags. To see all available options for the version you downloaded, run ./aws-bootstrap.sh --help.
| Group | Flag | Typical use |
|---|---|---|
| Mode | --deploy-create-vpc-cfn | Create a new VPC and EKS cluster |
--deploy-import-vpc-cfn | Reuse an existing VPC with --vpc-id and --subnet-ids | |
--skip-cfn-deploy | Re-bootstrap an existing cluster without rerunning CloudFormation | |
| Identity | --stack-name <name> | Set the CloudFormation stack name for --deploy-*-cfn |
--stage <name> | Set the environment label used in resource names | |
--region <region> | Choose the AWS Region | |
| Networking | --vpc-id <id> | Identify the existing VPC to reuse |
--subnet-ids <id1,id2> | Provide subnets in different Availability Zones | |
| Access | --grant-eks-access-only | Grant access to an existing cluster and exit |
--eks-access-principal-arn <arn> | Specify the IAM principal to grant cluster-admin access | |
| Versioning | --version <tag> | Pin to a specific published release for reproducible deployments. For available tags, see Releases |
Step 2: Deploy into a new or existing VPC
Deploy Migration Assistant into either a new VPC or an existing VPC.
New VPC using the latest published release
To deploy into a new VPC using the latest published release, run the following command:
./aws-bootstrap.sh \
--deploy-create-vpc-cfn \
--stack-name MA \
--stage dev \
--region us-east-2
New VPC pinned to a specific release
To pin the deployment to a specific release version, run the following command:
./aws-bootstrap.sh \
--deploy-create-vpc-cfn \
--stack-name MA \
--stage prod \
--region us-east-2 \
--version 3.2.1
Pinning a version makes the deployment reproducible. If you need to deploy the same artifacts again or deploy through continuous integration (CI), always pass --version.
Existing VPC
To deploy into an existing VPC, run the following command:
./aws-bootstrap.sh \
--deploy-import-vpc-cfn \
--stack-name MA \
--stage dev \
--vpc-id vpc-0abc123 \
--subnet-ids subnet-111,subnet-222 \
--region us-east-2
When the script finishes, it has installed the Helm chart and configured the Migration Console, the Argo workflow controller, and the Argo server.
Step 3: Verify the deployment
First, point kubectl at the new cluster:
aws eks update-kubeconfig --region <REGION> --name migration-eks-cluster-<STAGE>-<REGION>
Then list the pods in the ma namespace:
kubectl get pods -n ma
You should see the Migration Console, the Argo workflow controller, and the Argo server in Running state.
Step 4: Access the Migration Console
Access the Migration Console:
kubectl exec -it migration-console-0 -n ma -- /bin/bash
After you access the console, the migration flow is the same as for any other deployment: verify the version, load the sample configuration, run a pilot migration, validate it, and then run the full migration.
Step 5: Use the AWS resources created by the deployment
The EKS path provides a default snapshot bucket and related configuration so you do not have to build it manually.
Default S3 bucket
The deployment creates a default S3 bucket for migration artifacts and snapshots:
s3://migrations-default-<ACCOUNT_ID>-<STAGE>-<REGION>
Snapshot role output
If your workflow needs a snapshot role Amazon Resource Name (ARN), look it up from the CloudFormation outputs:
aws cloudformation describe-stacks \
--stack-name <YOUR_STACK_NAME> \
--query "Stacks[0].Outputs[?contains(OutputKey,'MigrationsExportString')].OutputValue" \
--output text
Authentication on EKS
Migration Assistant supports the following authentication methods on EKS.
Basic authentication
Basic authentication works the same way as generic Kubernetes: create Kubernetes secrets and reference them in authConfig.basic.secretName.
Authenticate with AWS Signature Version 4
For sources or targets authenticated using AWS Signature Version 4, the EKS stack uses IAM Roles for Service Accounts (IRSA) to assign an AWS identity to two sets of pods:
- The Migration Console pod (
migration-console-0), which runs under themigration-console-access-roleservice account. - The Argo workflow executor pods, which run under the
argo-workflow-executorservice account.
The console and the migration jobs authenticate to Amazon OpenSearch Service and other AWS services without requiring you to distribute long-lived AWS credentials.
Private or isolated networks
If your subnets do not have direct internet access, the bootstrap script mirrors images into private ECR by default and creates the VPC endpoints needed to pull from inside the cluster:
./aws-bootstrap.sh \
--deploy-import-vpc-cfn \
--create-vpc-endpoints \
--stack-name MA-Prod \
--stage prod \
--vpc-id vpc-xxx \
--subnet-ids subnet-aaa,subnet-bbb \
--region us-east-1 \
--version 3.2.1
The mirroring step runs from your machine, which must have internet access, and copies the release images and Helm charts to Amazon ECR. The EKS cluster then pulls everything through VPC endpoints. The script creates endpoints for Amazon S3, Amazon ECR API, Amazon ECR Docker, CloudWatch Logs, and Amazon Elastic File System (Amazon EFS).
If your deployment also requires AWS Security Token Service (AWS STS) or EKS Authentication endpoints (for example, for IRSA or EKS Pod Identity), create those separately before running the bootstrap script.
If you prefer to manage VPC endpoints using another tool, omit --create-vpc-endpoints. The script still mirrors images and uses your existing endpoints.
Grant kubectl access to a CI role or teammate
After the cluster is bootstrapped, run the script in grant-only mode to add a second admin principal:
./aws-bootstrap.sh \
--grant-eks-access-only \
--eks-access-principal-arn arn:aws:iam::123456789012:role/MyCIRole \
--stage dev \
--region us-east-2
The script applies the EKS access entry and policy association for the principal and then exits. It does not redeploy CloudFormation, mirror images, run Helm, or update your kubeconfig, and it skips the jq, kubectl, and helm prerequisite checks.
From the cluster-owning account, verify the access entry and its associated policies:
aws eks list-access-entries \
--cluster-name <CLUSTER_NAME> \
--region <REGION>
aws eks list-associated-access-policies \
--cluster-name <CLUSTER_NAME> \
--principal-arn arn:aws:iam::123456789012:role/MyCIRole \
--region <REGION>
Recovery if bootstrap fails
If CloudFormation fails, verify the stack status:
aws cloudformation describe-stacks --stack-name <STACK_NAME> --query "Stacks[0].StackStatus"
If the stack is stuck in ROLLBACK_COMPLETE or CREATE_FAILED, delete it and rerun the bootstrap script:
aws cloudformation delete-stack --stack-name <STACK_NAME>
aws cloudformation wait stack-delete-complete --stack-name <STACK_NAME>
If CloudFormation succeeded but the Helm portion failed, rerun only the bootstrap’s cluster-side steps:
./aws-bootstrap.sh --skip-cfn-deploy --stage <STAGE> --region <REGION>
Removal
To remove Migration Assistant from EKS, run the following commands:
helm uninstall -n ma ma
kubectl -n ma delete pvc --all
aws cloudformation delete-stack --stack-name <STACK_NAME>
aws cloudformation wait stack-delete-complete --stack-name <STACK_NAME>
Next steps
- Open the Migration Console and run
console --version. - Load the sample workflow with
workflow configure sample --load. - Run
console clusters connection-check. - Continue with Using the Workflow CLI.