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.
The MPC Deployer automates the deployment of customer MPC nodes to AWS Nitro Enclaves, providing hardware-based isolation for key material.
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.
| Resource | Count | Purpose | Notes |
|---|---|---|---|
| VPC | 1 | Network isolation | Optional - use --no-create-vpc to skip |
| Public Subnets | 2 | NAT gateway hosting | Optional - not created with --no-create-vpc |
| Private Subnets | 2 | MPC node hosting (one per AZ) | Optional - not created with --no-create-vpc |
| Internet Gateway | 1 | Outbound internet access | Optional - not created with --no-create-vpc |
| NAT Gateways | 2 | Outbound access for private subnets | Optional - not created with --no-create-vpc |
| Route Tables | 4 | Network routing | Optional - not created with --no-create-vpc |
| EC2 Nitro Instances | 2 | MPC Node 2 and Node 3 | Required |
| Security Groups | 2 | Network access control | Required |
| S3 Bucket | 1 | Enclave configuration storage | Required |
| Secrets Manager | 1 | Keys and configuration storage | Required |
| CloudWatch Log Groups | 2 | Centralized logging | Required |
| IAM Roles | 2 | EC2 instance permissions | Required |
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- 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.
Before deployment, Ripple will provide:
| Item | Description |
|---|---|
| MPC Deployer Image | Official Docker image tag and registry credentials |
| Tenant Alias | Your organization identifier |
| Tenant Instance Code | Environment identifier (e.g., prod, uat) |
| Docker Registry Credentials | Access to metaco.azurecr.io (where MPC core component images are stored) |
| Decryption Server URL | Enclave decryption service endpoint |
| OpenTelemetry Endpoint | Observability service configuration |
The deployment follows a coordinated process between you and Ripple:
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/outputThe 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.
Ripple will configure their infrastructure and provide you with:
| Configuration | Example |
|---|---|
| Relay Host | relay.mpc.ripple.com |
| Relay Port | 6000 |
| Relay Public Key | 12D3KooW... |
| Node 0 Public Key | 12D3KooW... |
| Node 1 Public Key | 12D3KooW... |
| MPC Docker Image | metaco.azurecr.io/custody/mpc-core:1.3.12 |
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-interactiveIf 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/outputThe tool will prompt for all required configuration. Previously stored values (from key generation) will be pre-populated from AWS Secrets Manager.
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-vpcYou 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.
After deployment completes, verify the infrastructure:
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).
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.
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.
| Flag | Description | Default |
|---|---|---|
--output | Output directory for logs and generated files | ./output/ |
--keygen | Generate key material for customer nodes | false |
--no-create-vpc | Use existing VPC (prompts for VPC/subnet IDs) | false |
--non-interactive | Disable interactive prompts (recommended for production) | false |
--dry-run | Simulate deployment without making changes | false |
| Issue | Cause | Solution |
|---|---|---|
| AWS credentials error | Invalid or expired credentials | Refresh credentials, verify IAM permissions |
| VPC quota exceeded | Account VPC limit reached | Request limit increase or use --no-create-vpc |
| EC2 instance launch failed | Nitro instance not available in AZ | Try different region or instance type |
Nodes fail to start with --no-create-vpc | Supplied subnet has no egress path | Add a default route to a NAT gateway or corporate egress path |
| Docker registry auth failed | Invalid registry credentials | Verify credentials with Ripple |
| Secrets Manager access denied | Missing IAM permissions | Verify your Secrets Manager permissions |
All operations are logged to the output directory:
| Log File | Content |
|---|---|
output.log | Main application logs |
cdktf.log | Infrastructure provisioning logs |
If you encounter issues:
- Check log files in the output directory
- Verify AWS credentials and permissions
- Contact your Ripple representative with log files
After successful deployment, contact your Ripple representative to:
- Verify connectivity between your nodes and Ripple nodes
- Complete cluster configuration and run health checks
- Test key generation using the DKG process
- Set up MPC backups for encrypted shard backups with verifiable encryption
- Review Production best practices for namespace segmentation, HA, and monitoring