Na verdade, descobri uma maneira de fazer isso apenas com modelos de formação em nuvem usando o ElasticIPs.
Eu criei um ElasticIP (você não pode atribuí-lo diretamente a uma instância neste caso!)
"ServerEIP" : {
"Type" : "AWS::EC2::EIP",
"Properties" : {
}
},
Em seguida, faço referência a esse IP no UserData
"Client" : {
...
"UserData" : {
{ "Fn::Join" : [ "=", [ "Server", { "Ref" : "ServerEIP" } ] ] }
O servidor pode referenciar diretamente o cliente
"Server" : {
"Type" : "AWS::EC2::Instance",
...
"UserData" : {
...
{ "Fn::Join" : [ "=", [ "Client", { "Fn::GetAtt" : [ "Client" , "PrivateIp"] } ] ] },
Mais tarde, associo o Elastic ao servidor real para que o Cloud Formation manipule as dependências corretamente:
"ServerIPAssoc" : {
"Type" : "AWS::EC2::EIPAssociation",
"Properties" : {
"InstanceId" : { "Ref" : "Server" },
"EIP" : { "Ref" : "ServerEIP" }
}
},
Feito! Agora tenho duas instâncias que conhecem o endereço IP do outro nó.
A única desvantagem é que o tráfego agora é feito através de um endereço IP público, incorrendo em custos de tráfego e sendo provavelmente menos seguro.
Atualização: agora me deparo com o problema descrito aqui , não tenho certeza se posso resolver este problema aqui.