Build and push your module container image to Azure Container Registry (ACR) or Docker Hub; note the full image URI including tag.
Compose a deployment manifest JSON that includes the required $edgeAgent and $edgeHub system modules alongside your custom module, specifying the image URI, createOptions (port bindings, environment variables), and restart policy.
Define message routes in the $edgeHub desired properties section to connect module outputs to inputs or to upstream IoT Hub using the FROM /messages/modules/MODULE_NAME/outputs/* INTO $upstream pattern.
Apply the manifest to the target device via the Azure portal (IoT Hub > Devices > Set Modules) or with 'az iot edge set-modules --device-id DEVICE_ID --hub-name HUB_NAME --content manifest.json'.
IoT Edge agent on the device polls IoT Hub for twin changes, pulls updated images, and starts or restarts modules; monitor with 'iotedge list' and 'iotedge logs MODULE_NAME'.
Use layered deployments and IoT Hub automatic deployments for fleet-wide rollouts targeting device twin tags rather than individual device IDs.
Known gotchas
The $edgeAgent and $edgeHub modules are mandatory in every manifest; omitting them or supplying an invalid version causes the deployment to fail silently at the device.
Container registry credentials must be specified in the $edgeAgent desired properties registryCredentials section or the device cannot pull private images.
Module startup order can be controlled via startupOrder integers (available in IoT Edge 1.0.10+); without this, modules may start before their dependencies are ready.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp