Terraform: So verhindern Sie, dass die ASG ec2-Instanz gestartet wird, bevor das NAT-Gateway erstellt wird

Terraform: So verhindern Sie, dass die ASG ec2-Instanz gestartet wird, bevor das NAT-Gateway erstellt wird

Ich verwende zwei Module. Eines ist ein benutzerdefiniertes VPC-Modul und das andere ist ein Modul zum Starten einer Jenkins EC2-Instanz.

Sie können es nicht depends_onmit Modulen verwenden, aber das Jenkins-Modul ist auf bestimmte Ausgaben des VPC-Moduls angewiesen, wie so ...

  jenkins_elb_subnets_ids                 = ["${module.vpc.public_subnets_ids[0]}", "${module.vpc.public_subnets_ids[1]}"]
  jenkins_instance_subnets_ids            = ["${module.vpc.private_subnets_ids[0]}", "${module.vpc.private_subnets_ids[1]}"]
  vpc_id                                  = "${module.vpc.vpc_id}"
  vpc_cidr                                = "${var.vpc_cidr}"

Dies verhindert jedoch nicht, dass die Jenkins Ec2-Instanz gestartet wird, bevor die NAT-Gateways überhaupt erstellt wurden.

�[0m�[1mmodule.jenkins.aws_launch_configuration.jenkins_lc: Creation complete after 5s (ID: devops-jenkins-lc-20180309131935169800000002)�[0m�[0m
�[0m�[1mmodule.jenkins.aws_autoscaling_group.jenkins_asg: Creating...�[0m
  arn:                            "" => "<computed>"
  default_cooldown:               "" => "<computed>"
  desired_capacity:               "" => "1"
  force_delete:                   "" => "false"
  health_check_grace_period:      "" => "300"
  health_check_type:              "" => "EC2"
  launch_configuration:           "" => "devops-jenkins-lc-20180309131935169800000002"
  load_balancers.#:               "" => "1"
  load_balancers.2235174564:      "" => "devops-jenkins-elb"
  max_size:                       "" => "1"
  metrics_granularity:            "" => "1Minute"
  min_size:                       "" => "1"
  name:                           "" => "devops-jenkins-lc-20180309131935169800000002"
  protect_from_scale_in:          "" => "false"
  tags.#:                         "" => "4"
  tags.0.%:                       "" => "3"
  tags.0.key:                     "" => "Name"
  tags.0.propagate_at_launch:     "" => "1"
  tags.0.value:                   "" => "devops-jenkins"
  tags.1.%:                       "" => "3"
  tags.1.key:                     "" => "BackupDisable"
  tags.1.propagate_at_launch:     "" => "1"
  tags.1.value:                   "" => "No"
  tags.2.%:                       "" => "3"
  tags.2.key:                     "" => "Environment"
  tags.2.propagate_at_launch:     "" => "1"
  tags.2.value:                   "" => "dev"
  tags.3.%:                       "" => "3"
  tags.3.key:                     "" => "AppComponent"
  tags.3.propagate_at_launch:     "" => "1"
  tags.3.value:                   "" => "Jenkins-master"
  target_group_arns.#:            "" => "<computed>"
  vpc_zone_identifier.#:          "" => "2"
  vpc_zone_identifier.3355635847: "" => "subnet-4f13e705"
  vpc_zone_identifier.3554579391: "" => "subnet-8e92b2d3"
  wait_for_capacity_timeout:      "" => "0"�[0m
�[0m�[1mmodule.jenkins.aws_autoscaling_group.jenkins_asg: Creation complete after 1s (ID: devops-jenkins-lc-20180309131935169800000002)�[0m�[0m
�[0m�[1mmodule.vpc.aws_vpn_gateway.transit_vgw: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_route53_zone.main: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_nat_gateway.private_nat_gw.1: Still creating... (10s elapsed)�[0m�[0m
�[0m�[1mmodule.vpc.aws_nat_gateway.private_nat_gw.0: Still creating... (10s elapsed)�[0m�[0m

Dies führt dazu, dass Jenkins nicht richtig gestartet wird.

Cannot find a valid baseurl for repo: amzn-main/latest
Could not retrieve mirrorlist http://repo.us-east-1.amazonaws.com/latest/main/mirror.list error was
12: Timeout on http://repo.us-east-1.amazonaws.com/latest/main/mirror.list: (28, 'Connection timed out after 5001 milliseconds')
Mar 09 13:19:55 cloud-init[2581]: util.py[WARNING]: Failed to install packages: ['git', 'aws-cfn-bootstrap', 'docker', 'jq-libs', 'jq', 'perl-Test-Simple.noarch', 'perl-YAML.noarch', 'gcc', 'amazon-ssm-agent.rpm', 'perl-Switch', 'perl-DateTime', 'perl-Sys-Syslog', 'perl-LWP-Protocol-https', 'perl-Test-Simple.noarch', 'perl-YAML.noarch']

Terraform verfügt nun über ein „offizielles“ VPC-Modul des AWS-Teams. Ich habe mir den Code angesehen und es scheint nichts zu tun, um das Problem zu mildern? Aber bei 90.000 Bereitstellungen und nur 36 Problemen … scheint es kein Problem zu sein, das sie haben. Ich habe es nicht selbst getestet, da die Verwendung keine Option ist, aber es könnte bedeuten, dass das Problem bei meinen Modulen liegt.

Bearbeiten: Das hat nicht funktioniert. @sysadmin1138. Ich habe Folgendes versucht …

resource "aws_autoscaling_group" "jenkins_asg" {
  depends_on                = ["module.vpc.aws_nat_gateway.private_nat_gw.1", "module.vpc.aws_nat_gateway.private_nat_gw.0"]

und habe diesen Fehler bekommen

Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Error: aws_autoscaling_group.jenkins_asg: resource depends on non-existent module 'vpc.aws_nat_gateway.private_nat_gw.1'



Error: aws_autoscaling_group.jenkins_asg: resource depends on non-existent module 'vpc.aws_nat_gateway.private_nat_gw.0'

Bearbeitung2:

Ich habe versucht, eine public_ip-Ausgabe vom NAT-Gateway im VPC-Modul als Eingabe für das Jenkins-Modul hinzuzufügen. In der Hoffnung, dass dies das Jenkins-Modul aufhalten würde, bis das NAT-Gateway eingerichtet und bereit ist. Das hat nicht funktioniert. Was mir bei Terraform und Modulen aufgefallen ist, ist, dass die Variable vollständig ignoriert wird, wenn Sie sie nicht irgendwo verwenden, beispielsweise in den Jenkins-Benutzerdaten. Es reicht nicht aus, sie als Eingabe für das Modul zu haben, es muss eine Eingabe für eine Ressource in diesem Modul sein. Der Nebeneffekt ist, dass als berechneter Wert jedes Mal versucht wird, Ihre Ressource neu zu erstellen.

Antwort1

Danke an jbardinhttps://github.com/hashicorp/terraform/issues/14056

Um dies zu beheben, müssen Sie eine Ausgabe aus Ihrem VPC-Modul verwenden. Sie können das aws_nat_gatewayAttribut verwenden public_ip, aber da ich danach eine Route erstellt hatte, aws_nat_gatewayhabe ich stattdessen diese verwendet. Ich habe dann eine Dummy-Variable und eine Dummy-Ressource in meinem Jenkins-Modul erstellt.

resource "null_resource" "dummy" {
  provisioner "local-exec" {
    command = "echo ${var.dummy}"
  }
}

dummyStellen Sie sicher, dass Sie diese Variable der von Ihnen gewählten Ausgabe zuweisen . Außerdem muss es sich um eine Zeichenfolge handeln.dummy = "${join(",", module.vpc.private_nat_gw_routes)}"

Danach habe ich depends_on = ["null_resource.dummy"]es für meine ASG-Ressource verwendet. Dadurch wartete diese Ressource, bis das NAT-Gateway + die Routen erstellt wurden, aber es hat nicht den unangenehmen Nebeneffekt, dass die Ressource jedes Mal neu erstellt werden muss.

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed

Antwort2

Sie können es möglicherweise nicht auf einem Modul verwenden depends_on, aber ich bin ziemlich sicher, dass Sie es trotzdem auf der tatsächlichen NAT-Gateway-Ressource verwenden können, die das Modul erstellt. Abhängig von Ihrer Terraform-Version kann es so einfach sein, es zu erhalten, wie terraform state listes zu verwenden und zu durchsuchen oder manuell in Ihrer Terraform-Statusdatei danach zu suchen.


Es scheint jedochdiese Unterstützung ist in der 11.x-Serie noch nicht vorhanden. Zukünftige Versionen von Terraform könnten dies tun, da ein Mitglied des HashiCorp-Teams eine Möglichkeit vorschlägt, das bereitzustellen, was hier eindeutig benötigt wird.

Der Kern des Problems besteht darin, dass es depends_onin einer Kompilierungsphase ausgeführt wird, bevor Module in Ressourcen erweitert werden, wodurch sie für die Ausrichtung mit diesem Parameter nicht infrage kommen.

verwandte Informationen