
Estou usando 2 módulos. Um é um módulo VPC personalizado e o outro é um módulo para abrir uma instância jenkins ec2.
Você não pode usar depends_on
módulos, mas o módulo Jenkins depende de certas saídas do módulo VPC assim ...
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}"
Isso ainda não impede que a instância Jenkins Ec2 seja iniciada antes mesmo de os gateways NAT serem criados.
�[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
O que faz com que o Jenkins não apareça corretamente.
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']
Agora o Terraform possui um módulo VPC "oficial" da equipe AWS. Eu olhei seu código e ele não parece fazer nada para atenuar isso? Mas com 90 mil implantações e apenas 36 problemas... não parece que seja um problema que eles tenham. Eu não testei porque usá-lo não é uma opção, mas pode significar que o problema está nos meus módulos.
Editar: Isso não funcionou @sysadmin1138 eu tentei isso ...
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"]
e recebi esse erro
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:
Tentei adicionar uma saída public_ip do NAT Gatway no módulo VPC como uma entrada para o módulo Jenkins. Esperando que isso segurasse o módulo Jenkins até que o gateway NAT estivesse instalado e pronto. Isso não funcionou. O que observei com o Terraform e os módulos é que, a menos que você use a variável em algum lugar, como nos dados do usuário do Jenkins, a variável será completamente ignorada. Não basta tê-lo como entrada para o módulo, é necessário que seja uma entrada para um recurso desse módulo. O efeito colateral é que, como valor computado, ele tentará recriar seu recurso todas as vezes.
Responder1
Obrigado a jbardinhttps://github.com/hashicorp/terraform/issues/14056
Para corrigir isso, você precisa usar uma saída do seu módulo VPC. Você pode usar o aws_nat_gateway
atributo public_ip
, mas como eu criei uma rota depois, aws_nat_gateway
usei-a. Em seguida, criei uma variável fictícia e um recurso fictício em meu módulo Jenkins.
resource "null_resource" "dummy" {
provisioner "local-exec" {
command = "echo ${var.dummy}"
}
}
Certifique-se de atribuir essa dummy
variável à saída escolhida. Também precisa ser uma string.dummy = "${join(",", module.vpc.private_nat_gw_routes)}"
Depois disso usei depends_on = ["null_resource.dummy"]
no meu recurso ASG. Isso fez com que o recurso esperasse até que as rotas NAT Gateway + fossem criadas, mas não tinha o efeito colateral desagradável de recriar o recurso todas as vezes.
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
Responder2
Talvez você não consiga usá-lo depends_on
em um módulo, mas tenho certeza de que ainda poderá usá-lo no recurso real do gateway NAT que o módulo cria. Dependendo da versão do seu terraform, obtê-lo pode ser tão simples quanto usá- terraform state list
lo e vasculhá-lo ou pesquisá-lo manualmente em seu arquivo de estado do terraform.
No entanto, pareceesse suporte ainda não existe na série 11.x. Versões futuras do Terraform podem, já que um membro da equipe da HashiCorp está sugerindo uma maneira de fornecer o que é claramente necessário aqui.
O cerne do problema é que ele depends_on
é executado em um estágio de compilação antes que os módulos sejam expandidos em recursos, o que os torna inelegíveis para direcionamento com esse parâmetro.