Search code examples
amazon-web-servicespacker

Packer dynamic source duplicates artifacts


The following packer file is supposed to produce a single or multiple ami(s) for different ubuntu versions depending on the ubuntu-versions variable.

packer {
  required_plugins {
    amazon = {
      version = ">= 0.0.2"
      source  = "github.com/hashicorp/amazon"
    }
  }
}

variable "region" {
  default     = "us-east-1"
  type        = string
  description = "A region in which to do the build"
}

variable "regions" {
  default     = ["us-east-1"]
  type        = list(string)
  description = "A list of regions to copy the AMI to."
}

variable "ubuntu-versions" {
  default     = ["18.04", "20.04"]
  type        = list(string)
  description = "Ubuntu version"
}


source "amazon-ebs" "ubuntu-generic" {
}

build {
  name = "ami-builds"
  dynamic "source" {
    for_each = var.ubuntu-versions
    labels   = ["amazon-ebs.ubuntu-generic"]
    content {
      name = "${source.value}"
      skip_create_ami         = false
      ami_name                = "Base hvm ${source.value} {{timestamp}}"
      ami_virtualization_type = "hvm"
      ami_regions             = "${var.regions}"
      instance_type = "m5.large"
      region        = "${var.region}"
      source_ami_filter {
        filters = {
          name                = "ubuntu/images/hvm-ssd/ubuntu-*-${source.value}-amd64-server-*"
          root-device-type    = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners      = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
  }

  post-processor "shell-local" {
    inline = ["echo hello"]
  }
}

It functions as intended but I noticed that packer duplicates the number of artifacts produced because of the shell-local post-processor. Example of packer output:

ami-builds.amazon-ebs.18.04: output will be in this color.
ami-builds.amazon-ebs.20.04: output will be in this color.

==> ami-builds.amazon-ebs.20.04: Prevalidating any provided VPC information
==> ami-builds.amazon-ebs.20.04: Prevalidating AMI Name: Base hvm 20.04 1692262684
==> ami-builds.amazon-ebs.18.04: Prevalidating any provided VPC information
==> ami-builds.amazon-ebs.18.04: Prevalidating AMI Name: Base hvm 18.04 1692262684
    ami-builds.amazon-ebs.20.04: Found Image ID: ami-011e48799a29115e9
==> ami-builds.amazon-ebs.20.04: Creating temporary keypair: packer_64dde11c-20a0-0506-6989-cb90612bb5f4
    ami-builds.amazon-ebs.18.04: Found Image ID: ami-055744c75048d8296
==> ami-builds.amazon-ebs.18.04: Creating temporary keypair: packer_64dde11c-3226-5d29-6bce-9ddc2948bbde
==> ami-builds.amazon-ebs.20.04: Creating temporary security group for this instance: packer_64dde11d-6e52-5984-0ced-0e8da6ed8038
==> ami-builds.amazon-ebs.18.04: Creating temporary security group for this instance: packer_64dde11d-6b4f-4d47-cbe4-b08021df4c96
==> ami-builds.amazon-ebs.20.04: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
==> ami-builds.amazon-ebs.18.04: Authorizing access to port 22 from [0.0.0.0/0] in the temporary security groups...
==> ami-builds.amazon-ebs.20.04: Launching a source AWS instance...
==> ami-builds.amazon-ebs.18.04: Launching a source AWS instance...
    ami-builds.amazon-ebs.18.04: Instance ID: i-032358235ea73987b
==> ami-builds.amazon-ebs.18.04: Waiting for instance (i-032358235ea73987b) to become ready...
    ami-builds.amazon-ebs.20.04: Instance ID: i-0a641c49869230a07
==> ami-builds.amazon-ebs.20.04: Waiting for instance (i-0a641c49869230a07) to become ready...
==> ami-builds.amazon-ebs.18.04: Using SSH communicator to connect: 54.89.159.238
==> ami-builds.amazon-ebs.18.04: Waiting for SSH to become available...
==> ami-builds.amazon-ebs.20.04: Using SSH communicator to connect: 54.90.187.148
==> ami-builds.amazon-ebs.20.04: Waiting for SSH to become available...
==> ami-builds.amazon-ebs.20.04: Connected to SSH!
==> ami-builds.amazon-ebs.20.04: Stopping the source instance...
    ami-builds.amazon-ebs.20.04: Stopping instance
==> ami-builds.amazon-ebs.20.04: Waiting for the instance to stop...
==> ami-builds.amazon-ebs.18.04: Connected to SSH!
==> ami-builds.amazon-ebs.18.04: Stopping the source instance...
    ami-builds.amazon-ebs.18.04: Stopping instance
==> ami-builds.amazon-ebs.18.04: Waiting for the instance to stop...
==> ami-builds.amazon-ebs.18.04: Creating AMI Base hvm 18.04 1692262684 from instance i-032358235ea73987b
    ami-builds.amazon-ebs.18.04: AMI: ami-021f569184d752422
==> ami-builds.amazon-ebs.18.04: Waiting for AMI to become ready...
==> ami-builds.amazon-ebs.20.04: Creating AMI Base hvm 20.04 1692262684 from instance i-0a641c49869230a07
    ami-builds.amazon-ebs.20.04: AMI: ami-0ff2caa45b3b4c0dd
==> ami-builds.amazon-ebs.20.04: Waiting for AMI to become ready...
==> ami-builds.amazon-ebs.18.04: Skipping Enable AMI deprecation...
==> ami-builds.amazon-ebs.18.04: Terminating the source AWS instance...
==> ami-builds.amazon-ebs.18.04: Cleaning up any extra volumes...
==> ami-builds.amazon-ebs.18.04: No volumes to clean up, skipping
==> ami-builds.amazon-ebs.18.04: Deleting temporary security group...
==> ami-builds.amazon-ebs.18.04: Deleting temporary keypair...
==> ami-builds.amazon-ebs.18.04: Running post-processor:  (type shell-local)
==> ami-builds.amazon-ebs.18.04 (shell-local): Running local shell script: /tmp/packer-shell3820714757
    ami-builds.amazon-ebs.18.04 (shell-local): hello
Build 'ami-builds.amazon-ebs.18.04' finished after 3 minutes 43 seconds.
==> ami-builds.amazon-ebs.20.04: Skipping Enable AMI deprecation...
==> ami-builds.amazon-ebs.20.04: Terminating the source AWS instance...
==> ami-builds.amazon-ebs.20.04: Cleaning up any extra volumes...
==> ami-builds.amazon-ebs.20.04: No volumes to clean up, skipping
==> ami-builds.amazon-ebs.20.04: Deleting temporary security group...
==> ami-builds.amazon-ebs.20.04: Deleting temporary keypair...
==> ami-builds.amazon-ebs.20.04: Running post-processor:  (type shell-local)
==> ami-builds.amazon-ebs.20.04 (shell-local): Running local shell script: /tmp/packer-shell1219348302
    ami-builds.amazon-ebs.20.04 (shell-local): hello
Build 'ami-builds.amazon-ebs.20.04' finished after 4 minutes 29 seconds.

==> Wait completed after 4 minutes 29 seconds

==> Builds finished. The artifacts of successful builds are:
--> ami-builds.amazon-ebs.18.04: AMIs were created:
us-east-1: ami-021f569184d752422

--> ami-builds.amazon-ebs.18.04: AMIs were created:
us-east-1: ami-021f569184d752422

--> ami-builds.amazon-ebs.20.04: AMIs were created:
us-east-1: ami-0ff2caa45b3b4c0dd

--> ami-builds.amazon-ebs.20.04: AMIs were created:
us-east-1: ami-0ff2caa45b3b4c0dd

As you can see ami-021f569184d752422 and ami-0ff2caa45b3b4c0dd were reported twice. Without the post-processor, there is no duplication. How come?


Solution

  • A post-processor creates an additional artifact(s) from the previous artifact(s). If you do not want the additional artifacts, but do want the shell commands executed within the artifact during the build, then you actually want the provisioner block:

    provisioner "shell-local" {
      inline = ["echo hello"]
    }