terraform: Update a Lambda function when the code changes

AWS Lambda terraform aws_lambda_function archive_file

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

Categories