Dependencies Terraform:在其他模块之前调用null_资源(本地exec)

Dependencies Terraform:在其他模块之前调用null_资源(本地exec),dependencies,terraform,Dependencies,Terraform,我有一个python脚本,它为我使用terraform创建的每个AWS EC2实例生成定制的cloud init脚本。但是现在我无法调用terraformapply,因为cloudinit的文件当时不存在,我得到了一个错误。所以现在我正在做terraformapply-target=null\u resource.pynit\u lite来生成文件,然后terraformapply来创建基础设施 我想要的是先执行null_资源,然后执行其余的,以便在创建ec2资源时存在cloud init文件,

我有一个python脚本,它为我使用terraform创建的每个AWS EC2实例生成定制的cloud init脚本。但是现在我无法调用
terraformapply
,因为cloudinit的文件当时不存在,我得到了一个错误。所以现在我正在做
terraformapply-target=null\u resource.pynit\u lite
来生成文件,然后
terraformapply
来创建基础设施

我想要的是先执行null_资源,然后执行其余的,以便在创建ec2资源时存在cloud init文件,这样我就可以对
terraform apply
执行单个调用

我想我需要实现某种“dependens_-on”,以便EC2模块等待null_资源完成,但这不是terraform中的特性

我的代码如下所示:

provider "aws" {
  region = var.region
  profile = var.profile
}

resource "null_resource" "pynit_lite" {
  provisioner "local-exec" {
    command = "python3 pynit_lite.py"
  }
}

data "aws_vpc" "devvpc" {
  id = var.vpc_id
}

data "aws_subnet_ids" "devsubs" {
  vpc_id = var.vpc_id
}

module "EC2" {
  source = "../../../Modules/EC2"

  name = var.instanceNames
  DSKsize = var.DSKsize
  root_volume_size = var.root_volume_size
  ami = var.ami
  instance_count = length(var.instanceNames)
  instance_type = var.instance_type
  key_name = var.key_name
  ec2_security_group_ids = var.ec2_security_group_ids
  script = var.scripts

  subnet = var.subnet
  vpc = var.vpc_id
}

output "EIP-public" {
  value = module.EC2.EIPAddress
}
output "EIP-internal" {
  value = module.EC2.InternalIps
}
我看过这个问题,但它没有提供解决方案:

这是非阻塞的,但肯定很烦人,所以任何帮助都将不胜感激

谢谢。

因为最近(terraform 13),模块还支持资源已经可以使用的
依赖功能。有一篇非常棒的文章介绍了如何实现这种结构。在您的情况下,这将是:

resource "null_resource" "pynit_lite" {
  provisioner "local-exec" {
    command = "python3 pynit_lite.py"
  }
}

module "EC2" {
  # ...
   depends_on = [null_resource.pynit_lite]
}
另一个不太可行的方法是使用terragrunt的前钩子,这是一个围绕terraform的薄包装。在此之前的钩子中,您还可以运行您的命令。你可以阅读更多关于这方面的内容。例如:

terraform {
  before_hook "before_hook" {
    commands     = ["apply", "plan"]
    execute      = ["python3", "pynit_lite.py"]
  }
}

谢谢,我一定会试试的。