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.
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.
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 deployments require several resources to exist before you run the deployer:
| Resource | Purpose | Notes |
|---|---|---|
| Resource group | Deployment boundary for Azure resources | Required |
| Standard Key Vault | Stores MPC Nodes Keys & Deployer config | Must use RBAC authorization |
| Premium Key Vault | Holds the enclave contract wrapping key | Must contain an RSA-4096 HSM-backed key |
| User-assigned managed identity | Allows Confidential VMs to access Key Vault resources | Must be created before deployment; grant access yourself or allow the deployer to assign Key Vault roles |
| Existing VNet and subnets | Customer-managed networking | Required 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.
| Resource | Count | Purpose | Notes |
|---|---|---|---|
| Virtual Network | 1 | Network isolation | Optional - use --no-create-vpc to skip |
| Subnets | 2 | MPC node hosting | Optional - not created with --no-create-vpc |
| Confidential VMs | 2 | MPC Node 2 and Node 3 | Required |
| Network interfaces | 2 | VM network attachment | Required |
| Network security groups | 2 | Network access control | Required |
| Storage account/container | 1 | Terraform state storage, contract token hashes | Required |
| Key Vault secrets/configuration | Multiple | Keys, KEKs, and deployment configuration | Required |
| Boot diagnostics and Log Analytics Workspace (LAW) | 2 | Startup and node troubleshooting | Required or customer-configured |
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>"- 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.
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, such as prod or uat |
| Docker Registry Credentials | Access to metaco.azurecr.io, where MPC core component images are stored |
| OpenTelemetry Endpoint | Observability service configuration |
| Azure setup scripts | Optional scripts for pre-provisioning required Azure resources |
The deployment follows a coordinated process between you and Ripple:
Before running the deployer, confirm that the following resources exist:
| Requirement | What to verify |
|---|---|
| Resource group | The target resource group exists in the primary Azure region |
| Standard Key Vault | RBAC authorization is enabled and the deployer identity can read and write secrets |
| Premium Key Vault | The vault contains an RSA-4096 HSM-backed wrapping key |
| User-assigned managed identity | The identity exists and can be assigned to the Confidential VMs |
| Key Vault access | The managed identity has access to both Key Vaults, or the deployer identity can create the required role assignments |
| Network | Either allow the deployer to create the VNet and subnets, or provide two existing subnets |
| Outbound connectivity | Subnets allow outbound HTTPS and connectivity to the Ripple relay host and port |
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:
| Value | Description |
|---|---|
REGION | Primary Azure region |
TENANT_ALIAS | Your organization identifier |
TENANT_INSTANCE_CODE | Environment code |
AZURE_SUBSCRIPTION_ID | Azure subscription ID |
AZURE_RESOURCE_GROUP | Resource group used by the deployment |
AZURE_KEY_VAULT_NAME | Key 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-interactiveThe 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.
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/harmonize/mpc-core:1.13.12 |
Add the following values to your .env file before deployment:
| Value | Description |
|---|---|
MPC_DOCKER_IMAGE | MPC core Docker image provided by Ripple |
MPC_DOCKER_REGISTRY_USERNAME | Docker registry username |
MPC_DOCKER_REGISTRY_PASSWORD | Docker registry password |
MPC_RELAY_HOST | Relay server host |
MPC_RELAY_PORT | Relay server port |
MPC_RELAY_PUBLIC_KEY | Relay server public key |
MPC_NODE0_PUBLIC_KEY | Node 0 public key |
MPC_NODE1_PUBLIC_KEY | Node 1 public key |
AZURE_NSG_RIPPLE_SAAS_CIDRS | CIDR blocks allowed by the network security groups for Ripple SaaS connectivity |
AZURE_NSG_DOCKER_REGISTRY_CIDRS | CIDR blocks allowed by the network security groups for Docker registry access |
OTEL_HTTP_ENDPOINT | OpenTelemetry endpoint |
OTEL_HTTP_USER | OpenTelemetry username |
OTEL_HTTP_PASSWORD | OpenTelemetry password |
AZURE_WRAPPING_KEY_VAULT_NAME | Premium Key Vault that holds the contract wrapping key (Azure SKR) |
AZURE_KEY_WRAPPING_KEY_NAME | Name of the RSA-4096 HSM-backed contract wrapping key |
RIPPLE_COSIGN_PUBLIC_KEY | Cosign public key that verifies mpc-core image signatures at CVM boot |
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-interactiveIf 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/outputIf 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-vpcYour .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.
| Value | Description |
|---|---|
AZURE_PRECONFIGURED_PRIVATE_SUBNET1_ID | Existing subnet ID for MPC Node 2 |
AZURE_PRECONFIGURED_PRIVATE_SUBNET2_ID | Existing subnet ID for MPC Node 3 |
After deployment completes, verify the Azure infrastructure and node startup.
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 tableWhat to check: Confirm both MPC VMs show VM running and use the Confidential VM SKU selected for your deployment.
Confirm that each VM has the expected user-assigned managed identity:
az vm identity show \
--resource-group <RESOURCE_GROUP> \
--name <MPC_VM_NAME>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.
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.
| 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 Azure networking instead of creating a VNet and subnets | false |
--non-interactive | Disable interactive prompts, recommended for production | false |
--dry-run | Simulate deployment without making changes | false |
| Issue | Cause | Solution |
|---|---|---|
| Azure credentials error | Missing, expired, or unauthorized credentials | Refresh Azure credentials and verify subscription access |
| Key Vault access denied | Managed identity or deployer identity lacks RBAC permissions | Grant the required Key Vault roles before rerunning |
| Contract wrapping key not found | Premium Key Vault or RSA-4096 HSM key is missing or misnamed | Verify the Premium Key Vault name and key name |
| Confidential VM launch failed | VM SKU unavailable, quota exceeded, or region unsupported | Choose a supported region/SKU or request quota |
| VM cannot retrieve configuration | Managed identity is not assigned or cannot access Key Vault | Check VM identity assignment and Key Vault RBAC |
| Docker registry auth failed | Invalid registry credentials | Verify credentials with Ripple |
| Relay connection failed | Network blocks outbound relay traffic | Confirm subnet routing, NSG rules, and proxy configuration |
| Role assignment failed | Deployer identity cannot create role assignments | Grant the required Key Vault role assignments and rerun the deployment |
All deployer 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 Azure credentials, Key Vault access, and managed identity assignment.
- Retrieve VM boot diagnostics for Node 2 and Node 3.
- Contact your Ripple representative with log files and boot diagnostics.
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.