概要
Lambdaをterraformからdeployする際にnull_resource
でbuildして結果をapplyするようにしていたが、buildが動いてないことに後から気がついた(厳密にいうと初回だけ動いていてそれ以降動いていなかった)
Lambdaのdeployについては以下を参考にした(この記事にもtriggerの注意点があります)
https://dev.classmethod.jp/articles/deploy-typescript-lambda-function-with-terraform/
今回やりたいこと
Goをビルドして、Lambda関数としてdeployする
ディレクトリ構成
terragrunt
|--modules
|--lambda
|--testlambda
|--test.go
|--go.mod
|--go.sum
|--main.go
ハマったところ
以下のnull_resoure
にbuildコマンドを書くのだが、triggers
をちゃんとセットしておかないと、初回はapplyされるのに、次からはapplyされないというのでハマりやすい。localには、ずっと初回のbuildファイルが残っているので気が付かないとそのbuildファイルがdeployされ続ける。。
resource "aws_lambda_function" "testlambda" {
~ 省略
}
resource "null_resource" "build_lambda" {
# ここがないとハマることに・・・!
triggers = {
# null_resourceは基本的にapply後は実行されない。
# 必要な時にbuildが実行されるようにmodules配下の全ファイルのハッシュをトリガーに設定
dir_sha1 = sha1(join("", [for f in fileset("${path.module}/testlambda", "**") : filesha1("${path.module}/testlambda/${f}")]))
}
provisioner "local-exec" {
command = <<EOT
# Set the target OS and architecture
cd ${path.module}/testlambda
GOOS=linux GOARCH=amd64 go build -o bootstrap main.go test.go
# Check if the build was successful
if [ $? -ne 0 ]; then
echo "Go build failed!"
exit 1
fi
EOT
}
}
data "archive_file" "lambda" {
type = "zip"
source_dir = "${path.module}/testlambda"
output_path = "${path.module}/lambda_function.zip"
depends_on = [null_resource.build_lambda]
}
teragruntの場合は、実行するhclファイルがある箇所に teragrunt-cache
があるのでterragrunt applyをしながら、今回でいうと terragrunt-cache/testlambda/
にbuildされたファイルがあることを確認しながらやると良い。必要に応じてterragrunt-cache
のディレクトリごと削除して確認すると良い。
以上です。