nodefinder: Strategies for automatic node discovery in Erlang

April 8, 2018 ยท View on GitHub

Description

All strategies have been combined into this Erlang application after being refactored.

(The source code is a fork of http://code.google.com/p/nodefinder/)

EC2 tags and groups selection are selected with the following syntax (if a tuple doesn't make the boolean expression explicitly AND or OR the list is implicitly an OR):

[Entry... |
 {'AND', [Entry...]} |
 {'OR', [Entry...]}]
 
  tags: Entry == "key" |
                 ["key1", "key2"] |
                 {"key3", "value3"} |
                 {["key4", "key5"], "value4"} |
                 {"key6", ["value6", "value7"]} |
                 {["key8", "key9"], ["value9", "value8"]}
 
groups: Entry == "security_group_name"

Build

rebar compile

Example

LAN multicast (requires that ntpd is running)

$ erl -sname foo1@localhost -pz ebin/
(foo1@localhost)1> application:ensure_all_started(nodefinder).
{ok,[inets,xmerl,crypto,asn1,public_key,ssl,nodefinder]}
(foo1@localhost)2> nodes(). 
[]
(foo1@localhost)3> nodefinder:multicast_start().
{ok,<0.52.0>}
(foo1@localhost)4> nodes().
[foo2@localhost]
(foo1@localhost)5> nodefinder:multicast_discover(5000).
ok
(foo1@localhost)6> nodes().
[foo2@localhost]
(foo1@localhost)7> nodefinder:multicast_stop().
ok
(foo1@localhost)8> nodefinder:multicast_stop().
{error,not_found}

$ erl -sname foo2@localhost -pz ebin/
(foo2@localhost)1> application:ensure_all_started(nodefinder).
{ok,[inets,xmerl,crypto,asn1,public_key,ssl,nodefinder]}
(foo2@localhost)2> nodes(). 
[]
(foo2@localhost)3> nodefinder:multicast_start().
{ok,<0.52.0>}
(foo2@localhost)4> nodes().
[foo1@localhost]
(foo2@localhost)5> nodefinder:multicast_discover(5000).
ok
(foo2@localhost)6> nodes().
[foo1@localhost]
(foo2@localhost)7> nodefinder:multicast_stop().
ok

EC2

Functionality details:

  • The same Erlang distributed node name is used (separate Erlang VMs must be on separate EC2 instances)
  • Connections between regions are not supported due to the high latency

Add security group TCP rules for:

Example:

$ cat << EOF > sys.config
[{kernel, [
    {inet_dist_listen_min, 4374},
    {inet_dist_listen_max, 4474}]}].
EOF
$ erl -name test -config sys.config -pz ebin/
> application:ensure_all_started(nodefinder).
> nodes().
> Host = "ec2.amazonaws.com".
> Key = "".
> SecretKey = "".
> nodefinder:ec2_start(Key, SecretKey, Host, ["www"], []).
> nodefinder:ec2_stop().
> nodes().
> [net_kernel:disconnect(N) || N <- nodes()].
> nodefinder:ec2_start(Key, SecretKey, Host, [], [{"Tag1", "Value1"}]).
> nodefinder:ec2_stop().
> nodes().
> [net_kernel:disconnect(N) || N <- nodes()].
> nodefinder:ec2_start(Key, SecretKey, Host, [], ["Tag1"]).
> nodefinder:ec2_stop().
> nodes().
> [net_kernel:disconnect(N) || N <- nodes()].
  • First, connect to all EC2 instances in the "www" security group that are running with a 'test' node name
  • Second, connect to all EC2 instances with a tag Tag1=Value1 that are running with a 'test' node name
  • Third, connect to all EC2 instances with a tag Tag1 that are running with a 'test' node name

Tests

rebar compile
rebar eunit skip_deps=true

License

MIT License