Skip to content

This guide covers deploying customer MPC nodes (Node 2 and Node 3) to AWS using the MPC Deployer tool.

Prerequisites: Review the MPC overview to understand the architecture, shared responsibility model, and node ownership before proceeding.


Overview

The MPC Deployer automates the deployment of customer MPC nodes to AWS Nitro Enclaves, providing hardware-based isolation for key material.

What gets deployed

AWS Account (Customer)

VPC

Private Subnet 2 (AZ2)

Private Subnet 1 (AZ1)

Public Subnet 2

Public Subnet 1

EC2 Nitro Instance
MPC Node 3

Internet Gateway

NAT Gateway 1

NAT Gateway 2

EC2 Nitro Instance
MPC Node 2

S3 Bucket
Enclave Config

Secrets Manager
Keys & Config

CloudWatch
Logs

AWS Account (Customer)

VPC

Private Subnet 2 (AZ2)

Private Subnet 1 (AZ1)

Public Subnet 2

Public Subnet 1

EC2 Nitro Instance
MPC Node 3

Internet Gateway

NAT Gateway 1

NAT Gateway 2

EC2 Nitro Instance
MPC Node 2

S3 Bucket
Enclave Config

Secrets Manager
Keys & Config

CloudWatch
Logs

Existing VPC support: The deployer supports a mode where networking resources (VPC, subnets, NAT gateways, etc.) are not created. Use the --no-create-vpc flag if your organization manages networking centrally.

AWS resources created

ResourceCountPurposeNotes
VPC1Network isolationOptional - use --no-create-vpc to skip
Public Subnets2NAT gateway hostingOptional - not created with --no-create-vpc
Private Subnets2MPC node hosting (one per AZ)Optional - not created with --no-create-vpc
Internet Gateway1Outbound internet accessOptional - not created with --no-create-vpc
NAT Gateways2Outbound access for private subnetsOptional - not created with --no-create-vpc
Route Tables4Network routingOptional - not created with --no-create-vpc
EC2 Nitro Instances2MPC Node 2 and Node 3Required
Security Groups2Network access controlRequired
S3 Bucket1Enclave configuration storageRequired
Secrets Manager1Keys and configuration storageRequired
CloudWatch Log Groups2Centralized loggingRequired
IAM Roles2EC2 instance permissionsRequired

Prerequisites

AWS requirements

Account & permissions:

  • AWS account with administrative access
  • Permissions allowing the deployer tool to create resources in the AWS account

Credentials (one of):

# Option 1: Environment variables
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_DEFAULT_REGION="us-east-1"

# Option 2: AWS credentials file (~/.aws/credentials)
[default]
aws_access_key_id = your-access-key
aws_secret_access_key = your-secret-key
region = us-east-1

Execution requirements

  • Docker: Docker Desktop or Docker Engine installed and running
  • MPC Deployer Image: Access to Ripple's Docker registry

Important: Contact your Ripple representative to obtain the official MPC Deployer Docker image and registry credentials. Do not use locally-built images in production.

From Ripple

Before deployment, Ripple will provide:

ItemDescription
MPC Deployer ImageOfficial Docker image tag and registry credentials
Tenant AliasYour organization identifier
Tenant Instance CodeEnvironment identifier (e.g., prod, uat)
Docker Registry CredentialsAccess to metaco.azurecr.io (where MPC core component images are stored)
Decryption Server URLEnclave decryption service endpoint
OpenTelemetry EndpointObservability service configuration

Deployment process

The deployment follows a coordinated process between you and Ripple:

RippleAWS AccountMPC Deployer ToolCustomerRippleAWS AccountMPC Deployer ToolCustomerPhase 1: Key GenerationPhase 2: Ripple SetupPhase 3: DeploymentPhase 4: VerificationRun --keygen modeStore keys in Secrets ManagerOutput Node 2 & 3 Peer IDsShare Peer IDsConfigure Nodes 0 & 1Configure Relay ServerProvide Ripple configRun deployment modeProvision infrastructureDeploy EC2 Nitro instancesDeployment completeConfirm connectivityRun cluster health check
RippleAWS AccountMPC Deployer ToolCustomerRippleAWS AccountMPC Deployer ToolCustomerPhase 1: Key GenerationPhase 2: Ripple SetupPhase 3: DeploymentPhase 4: VerificationRun --keygen modeStore keys in Secrets ManagerOutput Node 2 & 3 Peer IDsShare Peer IDsConfigure Nodes 0 & 1Configure Relay ServerProvide Ripple configRun deployment modeProvision infrastructureDeploy EC2 Nitro instancesDeployment completeConfirm connectivityRun cluster health check

Step 1: Generate node keys

Generate cryptographic keys for your MPC nodes (Node 2 and Node 3):

docker run --rm -it \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION \
  -v $(pwd)/output:/app/output \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --keygen --output /app/output

The tool will prompt for:

  • Region: Primary AWS region (e.g., us-east-1)
  • Secondary region: DR region (e.g., us-west-2).
  • Tenant alias: Your organization identifier.
  • Tenant Instance Code: Environment code

Output:

🎉 Key material successfully generated and stored in AWS Secrets Manager.
🔑 Node 2 Public Key (Peer ID): 12D3KooWBhMevWJT...
🔑 Node 3 Public Key (Peer ID): 12D3KooWCdEfGhIj...

Share with Ripple: Send the Node 2 and Node 3 Peer IDs to your Ripple representative. These are public identifiers and are safe to share.


Step 2: Wait for Ripple configuration

Ripple will configure their infrastructure and provide you with:

ConfigurationExample
Relay Hostrelay.mpc.ripple.com
Relay Port6000
Relay Public Key12D3KooW...
Node 0 Public Key12D3KooW...
Node 1 Public Key12D3KooW...
MPC Docker Imagemetaco.azurecr.io/custody/mpc-core:1.3.12

Step 3: Deploy MPC nodes

Once you receive configuration from Ripple, deploy the infrastructure:

For production deployments, use environment variables with the --non-interactive flag:

# Create .env file with configuration
cat > .env << EOF
REGION=us-east-1
SECONDARY_REGION=us-west-2
TENANT_ALIAS=your-tenant
TENANT_INSTANCE_CODE=prod

MPC_DOCKER_IMAGE=metaco.azurecr.io/custody/mpc-core:1.3.12
MPC_DOCKER_REGISTRY_USERNAME=your-username
MPC_DOCKER_REGISTRY_PASSWORD=your-password

MPC_RELAY_HOST=relay.mpc.ripple.com
MPC_RELAY_PORT=6000
MPC_RELAY_PUBLIC_KEY=12D3KooW...
MPC_NODE0_PUBLIC_KEY=12D3KooW...
MPC_NODE1_PUBLIC_KEY=12D3KooW...

OTEL_HTTP_ENDPOINT=https://your-otel-endpoint
OTEL_HTTP_USER=your-username
OTEL_HTTP_PASSWORD=your-password

ENCLAVE_DECRYPTION_SERVER_URL=https://decrypter.metaco.services
EOF

# Run deployment
docker run --rm -it \
  --env-file .env \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -v $(pwd)/output:/app/output \
  -v $(pwd)/.terraform-state:/terraform-state \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --output /app/output --non-interactive

Interactive deployment (fallback)

If you prefer to enter configuration interactively:

docker run --rm -it \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION \
  -v $(pwd)/output:/app/output \
  -v $(pwd)/.terraform-state:/terraform-state \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --output /app/output

The tool will prompt for all required configuration. Previously stored values (from key generation) will be pre-populated from AWS Secrets Manager.

Deployment into existing VPC

If you have an existing VPC, use the --no-create-vpc flag:

docker run --rm -it \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION \
  -v $(pwd)/output:/app/output \
  -v $(pwd)/.terraform-state:/terraform-state \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --output /app/output --no-create-vpc

You will be prompted for:

  • VPC ID: vpc-0123456789abcdef0
  • Private Subnet 1 ID: subnet-0123456789abcdef0
  • Private Subnet 2 ID: subnet-0123456789abcdef1

Both subnets must be private and in separate Availability Zones. MPC nodes are outbound-only — each node dials the relay server and nothing ever connects to them — so a public subnet adds internet-reachable attack surface with no benefit.

Egress is your responsibility in this mode. Each subnet needs a default route to a NAT gateway or corporate egress path, reaching the destinations you configure above. Without one, provisioning succeeds and the nodes then fail to start.


Step 4: Verify deployment

After deployment completes, verify the infrastructure:

Check EC2 instances

Verify that the Nitro Enclave instances are running and have the correct instance type:

aws ec2 describe-instances \
  --filters "Name=tag:Type,Values=nitro-enclave" \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Type:InstanceType}'

What to check: Confirm both instances show State: running and are using a Nitro-compatible instance type (e.g., m5.xlarge or larger).

Check CloudWatch logs

Verify that log groups exist and contain enclave boot logs:

aws logs describe-log-groups \
  --log-group-name-prefix "<TENANT_ALIAS>-<INSTANCE_CODE>"

What to check: Look for log entries indicating the enclave has successfully booted and connected to the relay server.

Verify Secrets Manager

Confirm that secrets were created for your deployment:

aws secretsmanager list-secrets \
  --filter Key=name,Values="<TENANT_ALIAS>-<INSTANCE_CODE>"

What to check: This command lists secret names only and does not reveal key material. Verify that secrets for Node 2 and Node 3 exist.


Command reference

FlagDescriptionDefault
--outputOutput directory for logs and generated files./output/
--keygenGenerate key material for customer nodesfalse
--no-create-vpcUse existing VPC (prompts for VPC/subnet IDs)false
--non-interactiveDisable interactive prompts (recommended for production)false
--dry-runSimulate deployment without making changesfalse

Troubleshooting

Common issues

IssueCauseSolution
AWS credentials errorInvalid or expired credentialsRefresh credentials, verify IAM permissions
VPC quota exceededAccount VPC limit reachedRequest limit increase or use --no-create-vpc
EC2 instance launch failedNitro instance not available in AZTry different region or instance type
Nodes fail to start with --no-create-vpcSupplied subnet has no egress pathAdd a default route to a NAT gateway or corporate egress path
Docker registry auth failedInvalid registry credentialsVerify credentials with Ripple
Secrets Manager access deniedMissing IAM permissionsVerify your Secrets Manager permissions

Log files

All operations are logged to the output directory:

Log FileContent
output.logMain application logs
cdktf.logInfrastructure provisioning logs

Getting help

If you encounter issues:

  1. Check log files in the output directory
  2. Verify AWS credentials and permissions
  3. Contact your Ripple representative with log files

Next steps

After successful deployment, contact your Ripple representative to:

  1. Verify connectivity between your nodes and Ripple nodes
  2. Complete cluster configuration and run health checks
  3. Test key generation using the DKG process
  4. Set up MPC backups for encrypted shard backups with verifiable encryption
  5. Review Production best practices for namespace segmentation, HA, and monitoring