我有一个Terraform步骤,它调用bash脚本并创建一个目录作为管道的一部分,在该目录中插入一些文件,并成功地将该材料上传到AWS,但这只是第一次。
#!/bin/bash
echo "Executing create_pkg.sh ..."
cd $path_cwd
dir_name=python_dependencies_folder/python
mkdir -p $dir_name
# Put some files in this directory
从Terraform的这一部分调用:
resource "null_resource" "install_python_dependencies" {
provisioner "local-exec" {
command = "cd scripts && chmod +x ./create_pkg.sh && ./create_pkg.sh"
interpreter = ["bash", "-c"]
working_dir = path.module
environment = {
path_module = path.module
path_cwd = path.cwd
}
}
}
它被压缩到这个数据部分:
data "archive_file" "zip_creation" {
depends_on = [null_resource.install_python_dependencies]
type = "zip"
source_dir = "${path.cwd}/python_dependencies_folder"
output_path = var.output_path
}
这个进程第一次运行时,一切都正确执行。但是,如果第二次执行相同的进程,我将在作业日志中看到以下内容:
module.aws_lambda_function.null_resource。python_dependencies_folder[0]:刷新状态…[id = 63624526464556]module.data.archive_file.zip_creation[0]: Reading…
Error: Archive creation Error
与module.data.archive_file.zip_creation [0].terraform/模块/aws_lambda_function/主要。第98行,在data "archive_file"zip_creation"98: data "archive_file"zip_creation"{
创建归档错误:归档目录错误:could not archive丢失的目录:.terraform/模块/aws_lambda_function/python_dependencies_folder
正如我所说,当同一个管道第二次运行时,它几乎就像TF跳过了"null_resource"的执行。由于tfstate文件中的某些条目。
关于如何向Terraform表明"null_resource"必须每次都运行并忽略在tfstate中找到的内容吗?
null_resource
运行标准的资源生命周期。如提供者
null_resource资源实现了标准的资源生命周期,但没有进一步的操作。触发器参数允许指定一组任意值,当这些值被更改时,将导致资源被替换。
也就是说,当您第一次运行TF时,资源将被执行并且其资源状态将保持不变。因此,当你第二次运行null资源时,它不会被执行,因为它知道资源没有任何变化,所以它不会再次运行它。
您的archive_file
数据对象将在每次执行时运行。然而,在第二次执行时,它失败了,因为您的空资源没有再次运行。我在这里做了一个假设,您每次都在docker或某种短暂的环境中运行此操作,在这种环境中,由null资源产生的工件不会被持久化,并且在每次运行您的terraform时都可用。
你可以添加一个triggers
参数到你的空资源,告诉terrtransform什么时候需要重新运行这个空资源。在这种情况下,如果您需要每次都运行null资源,您可以使用时间戳添加触发器标记,该时间戳在每次运行时都不同,因此每次运行都会触发资源。然而,我个人觉得这有点不对,并且会导致你的TF输出总是说它每次都会销毁并添加null资源。
resource "null_resource" "install_python_dependencies" {
provisioner "local-exec" {
command = "cd scripts && chmod +x ./create_pkg.sh && ./create_pkg.sh"
interpreter = ["bash", "-c"]
working_dir = path.module
environment = {
path_module = path.module
path_cwd = path.cwd
}
}
triggers = {
ts = timestamp()
}
}
实际上,听起来您的zip文件应该作为工件创建,并从我们在TF外部创建的工件存储库中持久化和提取。然而,当我为AWS打包python lambda并通过TF上传并试图在TF中完成这一切时,我遇到了完全相同的问题,因此我感到了这种痛苦。实际上,TF并不是所有问题的解决方案。我强烈建议将zip文件作为TF进程之外的工件。