Forwarding webhook requests from a single endpoint, to multiple ‘upstream’ endpoints could be useful in many scenarios. A lot of applications that dispatch webhooks only allow one url, however, which can be a bit of a limitation.
This pattern also simplifies maintenance. For instance, you can whitelist the relay IP while keeping your upstream endpoints on a separate network. Additionally, you could use a CNAME for the relay. This way, if you need to change the upstream endpoints, no modifications to the software sending the webhooks are necessary.
I created a simple repo containing some example config of how we could do this using nginx with the ngx_http_mirror_module.
The full nginx config is below
events {} http { # Main server block server { listen 80; server_name localhost; location / { mirror /v1; mirror /v2; # this 'hack' needed so we can just return ok without a 'main' mirror proxy_pass http://localhost/accepted; } location /v1 { proxy_pass https://ensfbwkxlowrl.x.pipedream.net/; } location /v2 { proxy_pass https://en5qyv1bfk8u.x.pipedream.net/; } location /accepted { return 202; } } }
It’s fairly self explanatory: the root `/` location mirrors requests to `/v1` and `/v2`
The /v1 and /v2 locations both proxy_pass to the upstreams
Finally, we have a `/accepted` location that simply returns 202
This is because the mirror module is designed to be used to simply mirror requests to *another* location – we need the default to return 202, while forwarding requests to v1 and v2.
Full repo:
https://github.com/alexjamesbrown/nginx-webhook-relay
Leave a Reply