2 min read | by Jordi Prats
If we are using the archive_file datasource to zip some Lambda function to be able to push it to AWS, we need to se the source_code_hash with it's hash to make sure the function gets updated when it changes:
If we try to use the filebase64sha256 function like this:
data "archive_file" "demo_lambda_zip" { type = "zip" source_dir = "${path.module}/src/demo_lambda" output_path = "${path.module}/zip/demo_lambda.zip" } resource "aws_lambda_function" "demo_lambda" { filename = data.archive_file.demo_lambda_zip.output_path source_code_hash = filebase64sha256(data.archive_file.demo_lambda_zip.output_path) role = aws_iam_role.demo_lambda.arn function_name = "demo_lambda" handler = "handler.lambda_handler" runtime = "python3.8" }
For the first run, when the actual zip file is not yet created, it will fail with the following message:
$ terraform plan (...) Error: Error in function call │ │ on main.tf line 94, in module "lambda_function": │ 94: source_code_hash = filebase64sha256(data.archive_file.demo_lambda_zip.output_path) │ ├──────────────── │ │ data.archive_file.lambda_function.output_path is "./zip/demo_lambda.zip" │ │ Call to function "filebase64sha256" failed: open files/demo_lambda.zip: no such file or directory. ╵
To avoid this kind of situations, the archive_file datasource already provides it's hash as one of it's outputs: output_base64sha256: We just need to update the aws_lambda_function to use it as follows:
data "archive_file" "demo_lambda_zip" { type = "zip" source_dir = "${path.module}/src/demo_lambda" output_path = "${path.module}/zip/demo_lambda.zip" } resource "aws_lambda_function" "demo_lambda" { filename = data.archive_file.demo_lambda_zip.output_path source_code_hash = data.archive_file.demo_lambda_zip.output_base64sha256 role = aws_iam_role.demo_lambda.arn function_name = "demo_lambda" handler = "handler.lambda_handler" runtime = "python3.8" }
Posted on 01/04/2022