Skip to content

Instantly share code, notes, and snippets.

Last active December 14, 2023 15:07
Show Gist options
  • Save danrigsby/11354917 to your computer and use it in GitHub Desktop.
Save danrigsby/11354917 to your computer and use it in GitHub Desktop.
Get AMI ID from a packer build
packer build packer.json 2>&1 | sudo tee output.txt
tail -2 output.txt | head -2 | awk 'match($0, /ami-.*/) { print substr($0, RSTART, RLENGTH) }' > sudo ami.txt
Copy link

You can omit the cat command and pass the file file to jq directly or jq -r '.builds[-1].artifact_id' manifest.json | cut -d':' -f2

Copy link

Gist is one of those sites where it pays to read the comments. I was able to take this and combine it with some of the above additional techniques and wrap it together in a modern AWS demonstration. Enjoy:

Copy link

Using a post-processor with jq works as well.

jq -r '.builds[0].artifact_id|split(":")[1]' ./manifest.json

Copy link

CodeForcer commented Jul 2, 2021

Seriously, we shouldn't have to do all this parsing of text. Packer should just have a way to spit out the ami_id in the language itself so we can use it in future build stages without having to parse arrays in json manifest files

Copy link

@CodeForcer yes, definitely I agree!!!

Copy link

Complete example using HCL with a manifest post-processor and the jq command from @dougireton:

packer {
  required_plugins {
    amazon = {
      version = ">= 0.0.2"
      source  = ""

source "amazon-ebs" "ubuntu" {
  ami_name      = "custom-ami-{{timestamp}}"
  instance_type = "t2.micro"
  region        = "eu-west-1"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    most_recent = true
    owners      = ["099720109477"]
  ssh_username = "ubuntu"
  tags = {
    Name = "my-app"
    Os   = "ubuntu-jammy-22.04-amd64-server"

build {
  name = "custom-ami"
  sources = [""]
    post-processor "manifest" {
        output = "manifest.json"
        strip_path = true

Then just:
jq -r '.builds[0].artifact_id|split(":")[1]' ./manifest.json
Expected output:

But agree with @CodeForcer 2022 and packer still does not have a built-in method to spit out the id.

Copy link

For multiple AWS regions, try:

jq -r '.builds[0].artifact_id' ./manifest.json | tr ',' '\n'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment