2016-11-22 92 views
2

我尝试使用terraform实现aws lambda函数。如何在data.archive_file之前运行命令zip文件夹在Terraform中?

我只是有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" ] 
} 

最近发生的变化对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" ] 
} 

我错过了什么吗?用最新版本做这件事的正确方法是什么?

Terraform:v0.7.11 OS:Win10

+0

我认为你是对的,不可能只使用Terraform。 –

回答

1

有一个在Terraform 0.8,external一个新的数据源,其可以运行外部命令并提取输出。见data.external

数据源应用于一些depedency值的检索,而不是npm install的执行,你还是应该做到这一点通过null_resource。由于这是一个Terraform数据源,它不应该有任何副作用(尽管在这种情况下你可能需要一些,不确定)。

因此,基本上,null_resource会执行相关操作,data.external会抓取一些您可以依赖的归档文件(例如目录路径),然后data.archive_file执行归档操作。

这可能最适合伪随机目录名称,可能会使肮脏的检查工作变得更简洁。

相关问题