如何在Terraform中的data.archive_file zips文件夹之前运行命令?

Mik*_*liy 8 terraform

我尝试使用Terraform实现AWS Lambda函数。

我只是拥有null_resource本地供应商,并且resource.archive_file在所有准备工作完成后都压缩了源代码。

resource "null_resource" "deps" {

  triggers = {
    package_json = "${base64sha256(file("${path.module}/src/package.json"))}"
  }

  provisioner "local-exec" {
    command = "cd ${path.module}/src && npm install"
  }
}

resource "archive_file" "function" {
    type = "zip"
    source_dir = "${path.module}/src"
    output_path = "${path.module}/function.zip"

    depends_on = [ "null_resource.deps" ]
}
Run Code Online (Sandbox Code Playgroud)

最近对Terraform的更改已弃用resource.archive_file,因此data.archive_file应改用。不幸的是,它data在资源之前执行,因此从依赖资源中创建本地预配器在创建zip之后就被称为。因此,下面的代码不再发出警告,但是根本不起作用。

resource "null_resource" "deps" {

  triggers = {
    package_json = "${base64sha256(file("${path.module}/src/package.json"))}"
  }

  provisioner "local-exec" {
    command = "cd ${path.module}/src && npm install"
  }
}

data "archive_file" "function" {
    type = "zip"
    source_dir = "${path.module}/src"
    output_path = "${path.module}/function.zip"

    depends_on = [ "null_resource.deps" ]
}
Run Code Online (Sandbox Code Playgroud)

我想念什么吗?用最新版本执行此操作的正确方法是什么。

地形:v0.7.11操作系统:Win10

Yep*_*_Me 10

事实证明,Terraform 核心处理depends_on数据资源的方式存在问题。报告了几个问题,一个在存档提供程序中,另一个在核心中

存档提供程序问题中列出了以下解决方法。请注意,它使用 adata.null_data_source位于null_resource和之间,data.archive_file这使其成为显式依赖项,而不是与 的隐式依赖项depends_on

resource "null_resource" "lambda_exporter" {
  # (some local-exec provisioner blocks, presumably...)

  triggers = {
    index = "${base64sha256(file("${path.module}/lambda-files/index.js"))}"
  }
}

data "null_data_source" "wait_for_lambda_exporter" {
  inputs = {
    # This ensures that this data resource will not be evaluated until
    # after the null_resource has been created.
    lambda_exporter_id = "${null_resource.lambda_exporter.id}"

    # This value gives us something to implicitly depend on
    # in the archive_file below.
    source_dir = "${path.module}/lambda-files/"
  }
}

data "archive_file" "lambda_exporter" {
  output_path = "${path.module}/lambda-files.zip"
  source_dir  = "${data.null_data_source.wait_for_lambda_exporter.outputs["source_dir"]}"
  type        = "zip"
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*yng 3

Terraform 0.8 中有一个新的数据源,external允许您运行外部命令并提取输出。看data.external

数据源应该用于检索某些依赖值,而不是执行npm install,您仍然应该通过null_resource. 由于这是一个 Terraform 数据源,因此它不应该有任何副作用(尽管在这种情况下您可能需要一些副作用,但不确定)。

所以基本上,null_resource依赖关系data.external会获取一些可以依赖于存档的值(例如目录路径),然后data.archive_file执行存档。

这可能最适合使用伪随机目录名称,从而可能使脏检查工作得更干净一些。

  • 我真的很感激这个基于原始版本的依赖链的示例。我正在开始使用,发现这非常有用。谢谢。 (2认同)