4

We would like to create a template for a fairly standard stack in AWS. We need three layers.

  1. Layer: Elastic Load Balancer

  2. Layer: several web servers which are created / destroyed according to alarms triggered by the demand on the site

  3. Layer: a database server

Instances on Layer 2 should know the host name of the database instance. Ideally I would like to get hold of the private IP of the database instance and pass it through user-data to the web servers.

Fn::GetAtt does not support the private ip (only the public)

I suppose an alternative would be to build the stack and afterwards to set manually the db private ip. It does though make our setup a bit less clean. We would ideally like everything to be described in the template. (even if this involves running a script through user-data)

Any suggestions?

Steffen Opel
  • 5,560
  • 35
  • 55
Dimitris
  • 656
  • 5
  • 6
  • http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html is the correct link to the doc for GetAtt - and it _does_ in fact support the Private IP (nowadays at least) – erik258 Jul 07 '15 at 16:43

1 Answers1

6

I do this now to add new nodes to my puppet master. For example, I grab the private IP of the puppet master instance in the UserData section of my new node:

"echo ", { "Fn::GetAtt" : [ "MasterOfPuppets", "PrivateIp" ] }, " ", 
         { "Fn::GetAtt" : [ "MasterOfPuppets", "PrivateDnsName" ] } ," puppet 
    >> /etc/hosts\n","\n",

See page 119 of the CloudFormation User guide.

Alternatively you could use the instance MetaData:

curl http://169.254.169.254/latest/meta-data/local-ipv4/
upbeat.linux
  • 275
  • 4
  • 12