NGINX stream module with dynamic upstreams

NGINX has had support for dynamic upstream modules for a while in the community distribution and examples abund. I think this is probably one of the clearest I could find.

Finding a similar config for stream proxies turned out to be surprisingly hard, so here I'm sharing my solution in the hope that it can be useful to somebody. Or someone more experienced can point out a better alternative.
In my case my upstream is an ELB which can and will change ip address often so using the static DNS name was not an option.


Without further ado, here is the fully formed solution:

stream {
    resolver 8.8.8.8;

    map $remote_addr $upstream {
        default your-elb.eu-west-1.elb.amazonaws.com;
    }

    server {
        listen 443;
        proxy_pass $upstream:443;
    }
}

Explanation

Apparently using set is not allowed in the stream module (set is an http directive) so I had to introduce the odd $upstream map as a workaround.
The map tricks nginx into resolving the default value with the configured resolver. I ran a few tests and it appears nginx refreshes the DNS lookup consistently with the TTL set by Amazon (60 seconds). Success!