Terraform Notes
Lambda resource lifecycle and conditional tags
This example will create Lambda function and initially tag the resource with creation_date and modified_date. But will ONLY update the modified_date IF the python file's hash has changed.- To prevent creation_date from updating each run, just add this to lambda resource under lifecycle's ignore_changes list.
- To prevent modified_date from updating each run, see the logic in locals below
- If file does not exist, then set new modified_date
- If file exists, but hash of the file has changed then set new modified_date
lambda resource
resource "aws_lambda_function" "test_lambda_function" { filename = "${path.module}/${var.zip_filename}" ## this is the standard handler for python function handler = "lambda_function.lambda_handler" ## this is just a function name function_name = var.function_name ## the role arn is obtained from below role = aws_iam_role.test_lambda_role.arn runtime = "python3.8" ## Need this source_code_hash to ensure function is updated when the zip is updated source_code_hash = local.new_file_hash ## these are the variables that can be used by the code environment { variables = { myvar = var.test } } tags = local.tags # Only attributes defined by the resource type can be ignored. # last_modified and source_code_size is only here for illustration purposes. # for tags, any NEW tag creation can't be ignored. # if you create a tag from AWS console that isn't listed, then it will cause update to occur # if you set to ignore any tag, this will NOT update the tag after the first run lifecycle { ignore_changes = [ last_modified, source_code_size, tags["creation_date"] ] } }
readme file resource
to manage trigger of modified_date tagresource "local_file" "readme"{ content = jsonencode({"name"=var.function_name,"lastmodified"=local.new_modified_date,"hash"=local.new_file_hash}) filename = local.readme_file }
data call
to create the zip file from .py filedata "archive_file" "init"{ type = "zip" output_path = local.zip_file_path source_dir = "${path.module}/${var.function_filepath}/" }
variables
variable "region" { default = "us-east-1" } variable "function_name"{ default = "test" } variable "function_filepath"{ default = "files" } variable "zip_filename"{ default = "test.zip" } variable "test"{ default = "hello world" }
locals
locals{ ## Readme file should reside with the invoking root, because this file can be deleted readme_file = "${path.root}/readme.json" zip_file_path = "${path.module}/${var.zip_filename}" new_file_hash = data.archive_file.init.output_base64sha256 current_time_stamp = formatdate("YYYY-MM-DD hh:mm:ssZZZZZ", timestamp()) } ## If readme files exists, use existing data locals{ ## if this is a new file, then old_mod_date will be current date old_modified_date = fileexists(local.readme_file) ? jsondecode(file(local.readme_file)).lastmodified : local.current_time_stamp ## if this is a new file, then old_file_hash will be the current hash old_file_hash = fileexists(local.readme_file) ? jsondecode(file(local.readme_file)).hash : local.new_file_hash } locals{ ## if old and new hash are equal then new_mod_date will be old_mod_date, otherwise use the current date, new_modified_date = local.new_file_hash == local.old_file_hash ? local.old_modified_date : local.current_time_stamp } ## Tags locals{ tags = { "creation_date" = local.current_time_stamp "modified_date" = local.new_modified_date "keep_until" = "0" "hash" = local.new_file_hash } }
No comments:
Post a Comment