我已经用本地exec provisioner创建了一个null资源,该资源运行一个shell脚本来获取lambda源代码所需的文件夹。
resource "null_resource" "lambda-repo" {
triggers = {
#not sure on this
}
provisioner "local-exec" {
command = "bash lambda-repo.sh"
working_dir = "${path.module}"
}
}
data "archive_file" "lambda-repo-file" {
depends_on = [null_resource.lambda-repo]
type = "zip"
source_dir = "${path.module}/lambda_archive/lambda-repo"
output_path = "${path.module}/lambda_archive/lambda-repo.zip"
}
和如下所示的shell脚本
#!/bin/sh
mkdir -p lambda_archive/lambda-repo/lambdasfolder/common
mkdir -p lambda_archive/lambda-repo/lambdasfolder/oob_check_challenge
touch lambda_archive/lambda-repo/lambdasfolder/__init__.py
cp -r ../src/lambdasfolder/common/. lambda_archive/lambda-repo/lambdasfolder/common
cp -r ../src/lambdasfolder/lambda1folder/. lambda_archive/lambda-repo/lambdasfolder/lambda1folder
为了在最初的地形应用中实现这一点,我需要对s3对象中的etag进行注释。
resource "aws_s3_object" "lambda-repo" {
bucket = aws_s3_bucket.lambda-repo.id
key = "lambda-repo.zip"
source = data.archive_file.lambda-repo-file.output_path
#had to comment etag
#etag = filemd5(data.archive_file.lambda-repo-file.output_path)
}
对于第一个terraform应用程序,上面的terraform脚本通过将所需的源代码上传到lambda而运行良好。
现在的问题是,在第一次运行后执行terraform apply时,它没有检测到lambda函数的任何更改。如何在null_resource中编写触发器来检测目录中的任何文件更改?
如果您想始终为每个apply
执行local-exec
,您可以执行以下操作:
resource "null_resource" "lambda-repo" {
triggers = {
always_run = timestamp()
}
provisioner "local-exec" {
command = "bash lambda-repo.sh"
working_dir = "${path.module}"
}
}
但是,如果您想在创建lambda_handler.py
的新版本后运行local-exec
,您可以执行(lambda_handler.py
是示例名称(:
resource "null_resource" "lambda-repo" {
triggers = {
always_run = md5(file("../src/lambdasfolder/common/lambda_handler.py"))
}
provisioner "local-exec" {
command = "bash lambda-repo.sh"
working_dir = "${path.module}"
}
}
lambda_handler.py
应该替换为实际处理程序文件的名称。因此,当其内容改变时,md5
将不同,从而触发local-exec
。