Search code examples
amazon-web-servicesterraform

How to get private ip of EC2 instances spin up by ASG using Terraform


I have tried following code in order to obtain ip's from ASG, which has been created using Terraform? Is this a good practice or a bad one? But i got the correct ouput as i expected.

data "aws_instances" "test" {
instance_tags {
Environment = "${var.environment}",
instance    = "${var.db_instance_name}"
}

instance_state_names = ["running"]


depends_on = ["aws_sqs_queue.ansible", "aws_autoscaling_group.sample"]
}

output.tf

output "privateips" {
  value = "${data.aws_instances.test.private_ips}"
}

Solution

  • When creating the ASG, add a local provisioner at the end to execute a local script that interacts with AWS using the cli, so that you can query the ASG IPs:

    resource "aws_autoscaling_group" "artifactory" {
      name_prefix          = "${var.env}-Application-ASG-"
      vpc_zone_identifier  = ["${var.app_subnets}"]
      max_size             = "${var.asg_max}"
      min_size             = "${var.asg_min}"
      desired_capacity     = "${var.asg_desired}"
      force_delete         = true
      launch_configuration = "${aws_launch_configuration.application.name}"
      target_group_arns    = ["${aws_alb_target_group.application.arn}"]
    
      provisioner "local-exec" {
        command = "./getips.sh"
      }
    }
    

    script:

    ips=""
    ids=""
    while [ "$ids" = "" ]; do
      ids=$(aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names $ASG --region $REGION --query AutoScalingGroups[].Instances[].InstanceId --output text)
      sleep 1
    done
    for ID in $ids;
    do
        IP=$(aws ec2 describe-instances --instance-ids $ID --region $REGION --query Reservations[].Instances[].PrivateIpAddress --output text)
        ips="$ips,$IP"
    done