
Estoy usando 2 módulos. Uno es un módulo VPC personalizado y el otro es un módulo para abrir una instancia jenkins ec2.
No se puede usar depends_on
con módulos, pero el módulo Jenkins depende de ciertas salidas del módulo VPC, así...
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}"
Esto todavía no impide que la instancia jenkins Ec2 se inicie incluso antes de que se creen las puertas de enlace NAT.
�[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
Lo que da como resultado que Jenkins no funcione correctamente.
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']
Ahora Terraform tiene un módulo VPC "oficial" del equipo de AWS. He mirado su código y no parece hacer nada para mitigar esto. Pero con 90.000 implementaciones y solo 36 problemas... no parece que sea un problema que tengan. No lo he probado yo mismo porque usarlo no es una opción, pero podría significar que el problema está en mis módulos.
Editar: Eso no funcionó @ sysadmin1138 Intenté esto...
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"]
y obtuve este error
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'
Editar2:
Intenté agregar una salida public_ip desde NAT Gatway en el módulo VPC como entrada al módulo Jenkins. Con la esperanza de que detenga el módulo Jenkins hasta que la puerta de enlace NAT esté activa y lista. Esto no funcionó. Lo que he observado con Terraform y los módulos es que, a menos que use la variable en algún lugar, como en los datos de usuario de Jenkins, la variable se ignora por completo. No basta con tenerlo como entrada para el módulo, tiene que ser una entrada para un recurso en ese módulo. El efecto secundario es que, como valor calculado, intentará recrear su recurso cada vez.
Respuesta1
gracias a jbardinhttps://github.com/hashicorp/terraform/issues/14056
Para solucionar este problema, necesita utilizar una salida de su módulo VPC. Puede usar el aws_nat_gateway
atributo public_ip
, pero como tenía una ruta creada después, aws_nat_gateway
la usé en su lugar. Luego creé una variable ficticia y un recurso ficticio en mi módulo Jenkins.
resource "null_resource" "dummy" {
provisioner "local-exec" {
command = "echo ${var.dummy}"
}
}
Asegúrese de asignar esa dummy
variable a la salida que ha elegido. También tiene que ser una cuerda.dummy = "${join(",", module.vpc.private_nat_gw_routes)}"
Después de eso lo usé depends_on = ["null_resource.dummy"]
en mi recurso ASG. Esto hizo que ese recurso esperara hasta que se crearan las rutas NAT Gateway +, pero no tiene el efecto secundario desagradable de volver a crear el recurso cada vez.
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
Respuesta2
Es posible que no pueda usarlo depends_on
en un módulo, pero estoy bastante seguro de que aún puede usarlo en el recurso de puerta de enlace NAT real que crea el módulo. Dependiendo de su versión de Terraform, obtenerla puede ser tan simple como usarla terraform state list
y buscarla, o buscarla manualmente en su archivo de estado de Terraform.
Sin embargo, pareceese soporte aún no existe a partir de la serie 11.x. Las versiones futuras de Terraform pueden hacerlo, ya que un miembro del equipo de HashiCorp sugiere una forma de proporcionar lo que claramente se necesita aquí.
El núcleo del problema es que depends_on
se ejecuta en una etapa de compilación antes de que los módulos se expandan a recursos, lo que los hace no elegibles para apuntar con ese parámetro.