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

如何在Terraform中运行data.archive_file zips文件夹之前的命令?,terraform,Terraform,我尝试使用terraform实现aws lambda函数 我只是有null\u资源,它有本地provisioner和resource.archive\u文件,在所有准备工作完成后可以压缩源代码 resource "null_resource" "deps" { triggers = { package_json = "${base64sha256(file("${path.module}/src/package.json"))}" } provisioner "local

我尝试使用terraform实现aws lambda函数

我只是有
null\u资源
,它有本地provisioner和
resource.archive\u文件
,在所有准备工作完成后可以压缩源代码

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" ]
}
最近对Terraform的更改已弃用
资源.archive\u文件
,因此应改用
数据.archive\u文件
。不幸的是,
data
在资源之前执行,所以依赖资源的本地provisioner在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" ]
}
我错过什么了吗?使用最新版本执行此操作的正确方法是什么

地形:v0.7.11
OS:Win10

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

数据源应仅用于检索某些依赖性值,而不是执行
npm安装
,您仍应通过
null\u资源执行该操作。因为这是一个地形数据源,所以它不应该有任何副作用(尽管在这种情况下您可能需要一些副作用,但不确定)

因此,基本上,
null\u resource
执行依赖项,
data.external
获取一些您可以依赖于存档的值(例如目录路径),然后
data.archive\u file
执行存档


这可能最好使用伪随机目录名,以使脏检查更干净。

结果表明Terraform core处理数据资源的方式存在问题。报告了两个问题,一个在中,另一个在中

归档提供程序问题中列出了以下解决方法。请注意,它使用
data.null\u data\u source
位于
null\u资源
data.archive\u文件
之间,这使得它成为显式依赖项,而不是
依赖的隐式依赖项

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"
}

我认为你是对的,仅仅使用地形是不可能的。问题中的例子对我来说很好。您可以使用
working\u dir
选项,而不必在其前面加
cd
。我非常感谢您提供一个基于原始文档的依赖链示例。我刚开始,只是觉得这很有用。谢谢。谢谢,这个解决方案比我之前读过的一些想法要优雅得多,并且解决了我在每次运行时将存档标记为已更改的问题。这使得使用terraform编写go lambdas变得更好。谢谢