»The post-processors block

The post-processors block allows to define lists of post-processors, that will run from the artifact of each build.

# builds.pkr.hcl
build {
  # ...
  post-processors {
    post-processor "shell-local" { # create an artifice.txt file containing "hello"
      inline = [ "echo hello > artifice.txt" ]
    }
    post-processor "artifice" { # tell packer this is now the new artifact
      files = ["artifice.txt"]
    }
    post-processor "checksum" { # checksum artifice.txt
      checksum_types = [ "md5", "sha512" ] # checksum the artifact
      keep_input_artifact = true           # keep the artifact
    }
  }
  
}

The post-processor block allows to define multiple post-processors that will run from the Artifact of each build. Read the post-processor documentation to know how to use a post-processor.

»Difference bewteen a post-processor and a post-processors block

These two templates are doing the same thing:

# builds.pkr.hcl
build {
  # ... build image
  post-processor "checksum" { # checksum image
    checksum_types = [ "md5", "sha512" ] # checksum the artifact
  }

  post-processor "amazon-import" { # upload image to AWS
  }

  post-processor "googlecompute-import" { # upload image to GCP
  }
}
# builds.pkr.hcl
build {
  # ... build image
  post-processors {
    post-processor "checksum" { # checksum image
      checksum_types = [ "md5", "sha512" ] # checksum the artifact
    }
  }

  post-processors {
    post-processor "amazon-import" { # upload image to AWS
    }
  }

  post-processors {
    post-processor "googlecompute-import" { # upload image to GCP
    }
  }
}

Each of these post-processors will start after each build -- that is, after each privision step has run on each source --. In all cases the source image is going to be deleted.