Use o nome da pilha do CloudFormation como um subdomínio para os nomes de domínio de 3 servidores. Dessa forma, você sabe quais serão os nomes DNS e poderá injetá-los no arquivo de configuração.
"DNSRecordInstance1": {
"Type": "AWS::Route53::RecordSet",
"Properties": {
"HostedZoneName": { "Ref": "HostedZone" },
"Name": {
"Fn::Join": [ ".", [
"server1", { "Ref": "AWS::StackName" }, ".", { "Ref": "HostedZone" }
] ]
},
"Type": "A",
"TTL": "900",
"ResourceRecords": [
{ "Fn::GetAtt": [ "Instance1", "PrivateIp" ] }
]
}
}
Isso criará um registro de DNS server1.<stack-name>.<hosted-zone>
, por exemplo, server1.test-stack.example.com
. Você faz isso nas 3 instâncias.
Em seguida, nos Metadados de cada Instância, você pode criar o arquivo de configuração imediatamente porque sabe quais serão os nomes DNS e não precisa saber quais serão os IPs - o DNS lidará com isso.
"Instance1": {
"Type": "AWS::EC2::Instance",
"Properties": {
[...]
"UserData": {
"Fn::Base64": { "Fn::Join": ["", [
"<script>\n",
"cfn-init.exe -v -s ", { "Ref" : "AWS::StackId" }, " -r Instance1", " --region ", { "Ref" : "AWS::Region" }, "\n",
"</script>"
] ] }
}
},
"Metadata": {
"AWS::CloudFormation::Init": {
"config": {
"files": {
"c:\servers.conf": {
"content": { "Fn::Join": ["", [
"server1.", { "Ref": "AWS::StackName" }, ".", { "Ref": "HostedZone" }, "\n",
"server2.", { "Ref": "AWS::StackName" }, ".", { "Ref": "HostedZone" }, "\n",
"server3.", { "Ref": "AWS::StackName" }, ".", { "Ref": "HostedZone" }, "\n"
]]}
}
}
}
[...]
Isso criará C:\servers.conf
com uma lista de 3 nomes DNS de seus servidores. Novamente, faça isso em cada uma das suas instâncias e pronto:)
Os snippets de modelo acima também devem ajudá-lo a executar os scripts do Cloud Init. Certifique-se de manter as referências de Instâncias corretas, por exemplo, cfn-init.exe -r Instance1
em UserData da Instância1. Atualize para cfn-init.exe -r Instance2
para Instance2, etc. O rótulo por trás de -r
deve ser o nome do recurso em que está definido.
Espero que ajude!