Skip to content

This guide covers deploying customer MPC nodes (Node 2 and Node 3) to Microsoft Azure 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 Azure Confidential VMs, using AMD SEV-SNP based isolation for node execution and Azure Key Vault for node key material and deployment configuration.

What gets deployed

Azure Subscription (Customer)

Resource Group

Virtual Network

Subnet 2

Subnet 1

Confidential VM
MPC Node 3

Confidential VM
MPC Node 2

Deployer Key Vault
MPC Nodes Keys & Deployer config

Premium Key Vault
Contains the enclave contract wrapping key

User-Assigned
Managed Identity

Boot diagnostics and Log Analytics Workspace (LAW)

Storage Account
Terraform State

Azure Subscription (Customer)

Resource Group

Virtual Network

Subnet 2

Subnet 1

Confidential VM
MPC Node 3

Confidential VM
MPC Node 2

Deployer Key Vault
MPC Nodes Keys & Deployer config

Premium Key Vault
Contains the enclave contract wrapping key

User-Assigned
Managed Identity

Boot diagnostics and Log Analytics Workspace (LAW)

Storage Account
Terraform State

Existing VNet support: The deployer supports a mode where networking resources are not created. Use the --no-create-vpc flag if your organization manages Azure networking centrally.

Azure resources

Pre-provisioned resources

Azure deployments require several resources to exist before you run the deployer:

ResourcePurposeNotes
Resource groupDeployment boundary for Azure resourcesRequired
Standard Key VaultStores MPC Nodes Keys & Deployer configMust use RBAC authorization
Premium Key VaultHolds the enclave contract wrapping keyMust contain an RSA-4096 HSM-backed key
User-assigned managed identityAllows Confidential VMs to access Key Vault resourcesMust be created before deployment; grant access yourself or allow the deployer to assign Key Vault roles
Existing VNet and subnetsCustomer-managed networkingRequired only with --no-create-vpc

Ripple can share utility scripts with you to ease the creation of these pre-provisioned resources within your Azure environment.

Resources created by the deployer

ResourceCountPurposeNotes
Virtual Network1Network isolationOptional - use --no-create-vpc to skip
Subnets2MPC node hostingOptional - not created with --no-create-vpc
Confidential VMs2MPC Node 2 and Node 3Required
Network interfaces2VM network attachmentRequired
Network security groups2Network access controlRequired
Storage account/container1Terraform state storage, contract token hashesRequired
Key Vault secrets/configurationMultipleKeys, KEKs, and deployment configurationRequired
Boot diagnostics and Log Analytics Workspace (LAW)2Startup and node troubleshootingRequired or customer-configured

Prerequisites

Azure requirements

Subscription and permissions:

  • Azure subscription dedicated to Ripple MPC Nodes deployment.
  • Permissions allowing the deployer tool to create resources in the Azure subscription.
  • Confidential VM quota and supported VM SKUs in the selected Azure region.

Credentials:

Authenticate to Azure using the method approved by your organization. For service-principal based deployments, provide Azure credentials to the container using the environment variables expected by the deployer and the Terraform Azure provider, for example:

export ARM_SUBSCRIPTION_ID="<subscription-id>"
export ARM_TENANT_ID="<tenant-id>"
export ARM_CLIENT_ID="<service-principal-client-id>"
export ARM_CLIENT_SECRET="<service-principal-client-secret>"

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 required credentials.

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, such as prod or uat
Docker Registry CredentialsAccess to metaco.azurecr.io, where MPC core component images are stored
OpenTelemetry EndpointObservability service configuration
Azure setup scriptsOptional scripts for pre-provisioning required Azure resources

Deployment process

The deployment follows a coordinated process between you and Ripple:

RippleAzure SubscriptionMPC Deployer ToolCustomerRippleAzure SubscriptionMPC Deployer ToolCustomerPhase 0: Azure PrerequisitesPhase 1: Key GenerationPhase 2: Ripple SetupPhase 3: DeploymentPhase 4: VerificationPre-provision Resource Group, Key Vaults, contract wrapping key, Log Analytics Workspace, and Managed IdentityProvide Azure input valuesRun --keygen modeStore keys in Azure Key VaultOutput Node 2 & 3 Peer IDsShare Peer IDsConfigure Nodes 0 & 1Configure Relay ServerProvide Ripple configRun deployment modeProvision infrastructureDeploy Azure Confidential VMsDeployment completeConfirm connectivityRun cluster health check
RippleAzure SubscriptionMPC Deployer ToolCustomerRippleAzure SubscriptionMPC Deployer ToolCustomerPhase 0: Azure PrerequisitesPhase 1: Key GenerationPhase 2: Ripple SetupPhase 3: DeploymentPhase 4: VerificationPre-provision Resource Group, Key Vaults, contract wrapping key, Log Analytics Workspace, and Managed IdentityProvide Azure input valuesRun --keygen modeStore keys in Azure Key VaultOutput Node 2 & 3 Peer IDsShare Peer IDsConfigure Nodes 0 & 1Configure Relay ServerProvide Ripple configRun deployment modeProvision infrastructureDeploy Azure Confidential VMsDeployment completeConfirm connectivityRun cluster health check

Step 1: Pre-provision Azure resources

Before running the deployer, confirm that the following resources exist:

RequirementWhat to verify
Resource groupThe target resource group exists in the primary Azure region
Standard Key VaultRBAC authorization is enabled and the deployer identity can read and write secrets
Premium Key VaultThe vault contains an RSA-4096 HSM-backed wrapping key
User-assigned managed identityThe identity exists and can be assigned to the Confidential VMs
Key Vault accessThe managed identity has access to both Key Vaults, or the deployer identity can create the required role assignments
NetworkEither allow the deployer to create the VNet and subnets, or provide two existing subnets
Outbound connectivitySubnets allow outbound HTTPS and connectivity to the Ripple relay host and port

Step 2: Generate node keys

Create an .env file using the sample provided with your MPC Deployer package. For key generation, include your tenant details, Azure region, and the pre-provisioned Azure resource values.

At minimum, the key-generation configuration includes:

ValueDescription
REGIONPrimary Azure region
TENANT_ALIASYour organization identifier
TENANT_INSTANCE_CODEEnvironment code
AZURE_SUBSCRIPTION_IDAzure subscription ID
AZURE_RESOURCE_GROUPResource group used by the deployment
AZURE_KEY_VAULT_NAMEKey Vault used for node keys, configuration, and contract tokens

Generate cryptographic keys for your MPC nodes:

docker run --rm -it \
  --env-file .env \
  -e ARM_SUBSCRIPTION_ID \
  -e ARM_TENANT_ID \
  -e ARM_CLIENT_ID \
  -e ARM_CLIENT_SECRET \
  -v $(pwd)/output:/app/output \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --provider azure --keygen --output /app/output --non-interactive

The tool stores the private node keys and KEKs in Azure Key Vault. The output includes the public Peer IDs for Node 2 and Node 3:

Key material successfully generated and stored in Azure Key Vault.
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 3: 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/harmonize/mpc-core:1.13.12

Add the following values to your .env file before deployment:

ValueDescription
MPC_DOCKER_IMAGEMPC core Docker image provided by Ripple
MPC_DOCKER_REGISTRY_USERNAMEDocker registry username
MPC_DOCKER_REGISTRY_PASSWORDDocker registry password
MPC_RELAY_HOSTRelay server host
MPC_RELAY_PORTRelay server port
MPC_RELAY_PUBLIC_KEYRelay server public key
MPC_NODE0_PUBLIC_KEYNode 0 public key
MPC_NODE1_PUBLIC_KEYNode 1 public key
AZURE_NSG_RIPPLE_SAAS_CIDRSCIDR blocks allowed by the network security groups for Ripple SaaS connectivity
AZURE_NSG_DOCKER_REGISTRY_CIDRSCIDR blocks allowed by the network security groups for Docker registry access
OTEL_HTTP_ENDPOINTOpenTelemetry endpoint
OTEL_HTTP_USEROpenTelemetry username
OTEL_HTTP_PASSWORDOpenTelemetry password
AZURE_WRAPPING_KEY_VAULT_NAMEPremium Key Vault that holds the contract wrapping key (Azure SKR)
AZURE_KEY_WRAPPING_KEY_NAMEName of the RSA-4096 HSM-backed contract wrapping key
RIPPLE_COSIGN_PUBLIC_KEYCosign public key that verifies mpc-core image signatures at CVM boot

Step 4: Deploy MPC nodes

After Ripple provides the cluster configuration, deploy Node 2 and Node 3 to Azure.

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

docker run --rm -it \
  --env-file .env \
  -e ARM_SUBSCRIPTION_ID \
  -e ARM_TENANT_ID \
  -e ARM_CLIENT_ID \
  -e ARM_CLIENT_SECRET \
  -v $(pwd)/output:/app/output \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --provider azure --output /app/output --non-interactive

Interactive deployment (fallback)

If you prefer to enter configuration interactively:

docker run --rm -it \
  --env-file .env \
  -e ARM_SUBSCRIPTION_ID \
  -e ARM_TENANT_ID \
  -e ARM_CLIENT_ID \
  -e ARM_CLIENT_SECRET \
  -v $(pwd)/output:/app/output \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --provider azure --output /app/output

Deployment into an existing VNet

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

docker run --rm -it \
  --env-file .env \
  -e ARM_SUBSCRIPTION_ID \
  -e ARM_TENANT_ID \
  -e ARM_CLIENT_ID \
  -e ARM_CLIENT_SECRET \
  -v $(pwd)/output:/app/output \
  <RIPPLE_REGISTRY>/mpc-deployer:<VERSION> \
  --provider azure --output /app/output --non-interactive --no-create-vpc

Your .env file must include the existing VNet and subnet values required by your deployer package. The two subnets should be in separate availability zones or fault domains when your Azure region and networking design support it.

ValueDescription
AZURE_PRECONFIGURED_PRIVATE_SUBNET1_IDExisting subnet ID for MPC Node 2
AZURE_PRECONFIGURED_PRIVATE_SUBNET2_IDExisting subnet ID for MPC Node 3

Step 5: Verify deployment

After deployment completes, verify the Azure infrastructure and node startup.

Check Confidential VMs

Verify that both VMs are running:

az vm list \
  --resource-group <RESOURCE_GROUP> \
  --show-details \
  --query "[?contains(name, 'mpc')].{Name:name,PowerState:powerState,Size:hardwareProfile.vmSize}" \
  --output table

What to check: Confirm both MPC VMs show VM running and use the Confidential VM SKU selected for your deployment.

Check managed identity assignment

Confirm that each VM has the expected user-assigned managed identity:

az vm identity show \
  --resource-group <RESOURCE_GROUP> \
  --name <MPC_VM_NAME>

Check boot diagnostics

Retrieve the startup log for each VM:

az vm boot-diagnostics get-boot-log \
  --resource-group <RESOURCE_GROUP> \
  --name <MPC_VM_NAME>

What to check: Look for log entries indicating that the node retrieved its configuration from Key Vault and connected to the relay server.

Verify Key Vault entries

Confirm that deployment secrets exist in the Standard Key Vault:

az keyvault secret list \
  --vault-name <CONFIG_KEY_VAULT_NAME> \
  --query "[?contains(name, '<TENANT_ALIAS>')].name"

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 Azure networking instead of creating a VNet and subnetsfalse
--non-interactiveDisable interactive prompts, recommended for productionfalse
--dry-runSimulate deployment without making changesfalse

Troubleshooting

Common issues

IssueCauseSolution
Azure credentials errorMissing, expired, or unauthorized credentialsRefresh Azure credentials and verify subscription access
Key Vault access deniedManaged identity or deployer identity lacks RBAC permissionsGrant the required Key Vault roles before rerunning
Contract wrapping key not foundPremium Key Vault or RSA-4096 HSM key is missing or misnamedVerify the Premium Key Vault name and key name
Confidential VM launch failedVM SKU unavailable, quota exceeded, or region unsupportedChoose a supported region/SKU or request quota
VM cannot retrieve configurationManaged identity is not assigned or cannot access Key VaultCheck VM identity assignment and Key Vault RBAC
Docker registry auth failedInvalid registry credentialsVerify credentials with Ripple
Relay connection failedNetwork blocks outbound relay trafficConfirm subnet routing, NSG rules, and proxy configuration
Role assignment failedDeployer identity cannot create role assignmentsGrant the required Key Vault role assignments and rerun the deployment

Log files

All deployer 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 Azure credentials, Key Vault access, and managed identity assignment.
  3. Retrieve VM boot diagnostics for Node 2 and Node 3.
  4. Contact your Ripple representative with log files and boot diagnostics.

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.