2017-01-13 2 views
2

Angenommen, ich habe einen öffentlich gehosteten Zonennamen example.com.. Ich verwende den folgenden Teil von Terraform-Code, um die gehostete Zonen-ID basierend auf dem Namen gemäß the docs dynamisch abzurufen."keine übereinstimmende Route53Zone gefunden": Die Route53-Datenquelle von Terraform erkennt den Namen der gehosteten Zone nicht.

data "aws_route53_zone" "main" { 
    name = "example.com." # Notice the dot!!! 
    private_zone = false 
} 

Während terraform plan kommt es mit diesem Fehler auf:

Error refreshing state: 1 error(s) occurred: 

* data.aws_route53_zone.main: no matching Route53Zone found 

Gibt es einen Fehler, dass ich berichten sollte oder ich etwas fehle?

+1

Sie brauchen den Punkt eigentlich nicht, die Datenquelle fügt ihn hinzu, wenn er nicht vorhanden ist. Können Sie die Zone mit etwas wie 'aws route53 list-gehostete-zonen-by-name --query' HostedZones [*]. {Name: Name, PrivateZone: Config.PrivateZone} '' mit den Krediten, die Terraform verwendet? – ydaetskcoR

+1

Auch wenn Sie im obigen Beispiel keinen 'vpc_id'-Parameter angeben, beachten Sie, dass die Datenquelle implizit davon ausgeht, dass Sie eine private Zone haben wollen, selbst wenn Sie 'private_zone = false' setzen. Ich habe vor kurzem eine Pull-Anfrage erhoben, um dieses Verhalten [hier] zu ändern (https://github.com/hashicorp/terraform/pull/11160) – ydaetskcoR

+0

ooh, alle infra, die ich versuche einzurichten ist in einer VPC! Aber die gehostete Zone ist öffentlich. Erzeugt es einen Konflikt? –

Antwort

2

Die aws_route53_zone data source wird alle gehosteten Zonen in dem Konto auflisten, für das Terraform die Berechtigungen zum Anzeigen hat.

Wenn Sie versuchen, auf eine Zone in einem anderen Konto zu verweisen, können Sie dies tun, indem Sie eine Rolle/Benutzer in dem Konto mit der Zone erstellen, die über die Berechtigungen zum Auflisten aller Zonen verfügt (route53:ListHostedZones*,route53:GetHostedZone*) und dann einen zweiten Anbieter hat "für diese Datenquelle verwendet werden.

So könnten Sie so etwas wie dieses:

provider "aws" { 
    # ... access keys etc/assume role block 
} 

# DNS account 
provider "aws" { 
    alias = "dns_zones" 
    # ... access keys etc/assume role block 
} 

data "aws_route53_zone" "main" { 
    provider = "aws.dns_zones" 
    name = "example.com." # Notice the dot!!! 
    private_zone = false 
} 

resource "aws_route53_record" "www" { 
    zone_id = "${data.aws_route53_zone.main.zone_id}" 
    name = "www.${data.aws_route53_zone.main.name}" 
    ... 
} 
+0

Ich habe eine Account-übergreifende Rolle mit vollem Zugriff auf R53 im ersten Account erstellt. Ich habe es manuell mit einem Benutzer aus dem zweiten Konto (nach dem Hinzufügen der Inline-Richtlinie) getestet und alles ist in Ordnung. Ich kann die Rolle übernehmen und R53 verwalten. Ich habe auch die Änderungen vorgenommen, die du gepostet hast. Muss ich in einen der beiden Provider-Blöcke einen Parameter assume_role? –

+0

Solange das für dich funktioniert, ist das okay. Wir haben das vor einiger Zeit ausprobiert, konnten Terraform aber nicht korrekt Cross-Account-Rollen übernehmen, obwohl dies möglicherweise darauf zurückzuführen war, dass die Instanzrolle eine Cross-Account-Rolle übernahm. – ydaetskcoR

1

Mit der zone_id anstelle des name hat es für mich.

data "aws_route53_zone" "api2" { 
    # name = "example.com." 
    zone_id = "REPLACEWITHYOURID" 
    vpc_id = "${var.vpc_id}" 
} 
Verwandte Themen