2017-09-26 16 views
1

Je crée des instances EC2 mais lorsque j'ajoute un enregistrement Route53, il faut jusqu'à 60 secondes pour que le DNS se reproduise et soit reconnu.Retard d'enregistrement Terraform Route53 pour l'instance EC2

resource "aws_instance" "zk-host" { 
    ami    = "ami-30041c53" # Amazon Linux Image 
    count    = "${var.count}" 
    associate_public_ip_address = false 

    connection { 
    user = "ec2-user" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     ... install things here... 
     #"sudo service zookeeper-server start ... after some delay ?" 
    ] 
    } 
} 

// Make a DNS entry for each host while we're here. 
resource "aws_route53_record" "route53-record-zk" { 
    zone_id = "${var.route53-zone-id}" 
    count = "${var.count}" 
    name = "${var.host-name-prefix}${count.index}.dwh.local" 
    type = "A" 
    ttl  = "30" 

    records = [ 
    "${element(aws_instance.zk-host.*.private_ip, count.index)}" 
    ] 
} 

Le problème est, je me sers de la approvisionneur à distance exec pour lancer des services dans mon instance EC2 qui se fondent sur le DNS pour trouver ses pairs.

Je ne semble pas pouvoir configurer l'entrée DNS avant de créer l'instance EC2.

Y a-t-il un moyen de post-traiter mon instance EC2 et de démarrer les services plus tard? Ou existe-t-il une technique pour retarder le démarrage du service jusqu'à ce que les entrées DNS existent?

+0

Vous devez ajouter le script wrapper dans remote-exec, par exemple 'sleep 120'. – BMW

+0

Merci pour la suggestion, mais ne fonctionne pas. Le problème semble être l'interdépendance sur * aws_route53_record *. Cela dépend de l'aws_instance pour obtenir son adresse IP. Ajouter un sommeil retarde juste l'achèvement de l'aws_instance. Je pense que je devrais le fourchonner en arrière-plan en quelque sorte. – Exie

Répondre

0

Vous pouvez utiliser le null_resource pour contourner ce problème afin de séparer le provisionneur de la ressource d'instance.

Dans votre cas, il ressemblerait à quelque chose comme:

resource "aws_instance" "zk-host" { 
    ami    = "ami-30041c53" # Amazon Linux Image 
    count    = "${var.count}" 
    associate_public_ip_address = false 
} 

// Make a DNS entry for each host while we're here. 
resource "aws_route53_record" "route53-record-zk" { 
    zone_id = "${var.route53-zone-id}" 
    count = "${var.count}" 
    name = "${var.host-name-prefix}${count.index}.dwh.local" 
    type = "A" 
    ttl  = "30" 

    records = [ 
    "${element(aws_instance.zk-host.*.private_ip, count.index)}" 
    ] 
} 

resource "null_resource" "zk-host_provisioning" { 
    count = "${var.count}" 

    connection { 
    user = "ec2-user" 
    host = "${element(aws_instance.zk-host.*.public_ip, count.index)}" 
    } 

    provisioner "remote-exec" { 
    inline = [ 
     ... install things here... 
     #"sudo service zookeeper-server start ... after some delay ?" 
    ] 
    } 
} 

Je serais un peu méfiant de compter sur la découverte DNS ici bien car il limite vos options en matière de choses comme la course dans un groupe autoscaling (en deçà des instances qui travaillent sur leur propre enregistrement DNS et le provisionnent au démarrage), vous pouvez donc envisager d'autres options pour la découverte de services dans le cluster Zookeeper. This blog post suggère que vous pouvez utiliser S3 pour fournir une liste de tous les nœuds, mais vous voulez probablement poser une autre question à ce sujet.

+0

Merci pour cela. Ne vous inquiétez pas, nous allons tout régler correctement lorsque nous quittons un POC et emballer cela pour la production et d'autres environnements. Ceci est vraiment utile et nous aide à avancer. À votre santé. – Exie