我尝试使用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)
Terraform 0.8 中有一个新的数据源,external允许您运行外部命令并提取输出。看data.external
数据源应该仅用于检索某些依赖值,而不是执行npm install,您仍然应该通过null_resource. 由于这是一个 Terraform 数据源,因此它不应该有任何副作用(尽管在这种情况下您可能需要一些副作用,但不确定)。
所以基本上,null_resource依赖关系data.external会获取一些可以依赖于存档的值(例如目录路径),然后data.archive_file执行存档。
这可能最适合使用伪随机目录名称,从而可能使脏检查工作得更干净一些。
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |