2017-09-26 10 views
1

EC2インスタンスを作成していますが、Route53レコードを追加すると、DNSが複製されて認識されるまでに最大60秒かかります。EC2インスタンスのTerraform Route53レコード遅延

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)}" 
    ] 
} 

問題は、私はその仲間を見つけるために、DNSに依存している私のEC2インスタンスでのサービスを開始するには、リモート-execのプロビジョニングを使用しています、です。

EC2インスタンスを作成する前に、DNSエントリを構成できないようです。

EC2インスタンスを後処理して後でサービスを開始する方法はありますか?または、DNSエントリが存在するまでサービスの開始を遅らせるテクニックがありますか?

+0

'sleep 120'のように、remote-execにラッパースクリプトを追加する必要があります。 – BMW

+0

提案していただきありがとうございますが、動作しません。問題は* aws_route53_record *の相互依存性のようです。それは、そのIPを取得するaws_instanceに依存します。睡眠を追加するだけで、aws_instanceの完了が遅れます。私は何とかバックグラウンドでそれをフォークする必要があると思います。 – Exie

答えて

0

null_resourceを使用してこれをハックすると、プロビジョナをインスタンスリソースから分離できます。

あなたのケースでは、それはのようなものになります。

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 ?" 
    ] 
    } 
} 

を、それは自動スケーリンググループで実行されているようなものに来るとき、それはあなたのオプションを制限するので、私は(かかわらず、ここではDNSの発見に頼るの少し警戒するだろうインスタンスが不足しているため、独自のDNSレコードを作成して起動時にプロビジョニングします)、Zookeeperクラスタ内のサービス検出のための他のオプションを検討することもできます。 This blog postは、S3を使用してすべてのノードのリストを提供できることを示唆していますが、おそらく別の質問をしたいと思っています。

+0

ありがとうございます。心配しないで、私たちがPOCから外に出て、生産や他の環境のためにこれをパッケージ化するときに、これをすべてきちんと整理します。これは本当に助けになり、私たちが前進するのを助けます。乾杯。 – Exie

関連する問題