DEV Community

Cover image for The Golden Packer
Anuvindh for AWS Community Builders

Posted on

5 2

The Golden Packer

DAY 22 - Building your Golden Image using packer for Terraform - Day Twenty two

Image tweet

100 days of Cloud on GitHub - Read On iCTPro.co.nz - Read on Dev.to


How to Integrate packer with Terraform?

  • Packer uses HCL language
  • You Build image
  • Then refence the image

Lets download and install packer

Project work space environment

  • I am using VSCode and WSL2 (ubuntu) for this project for AWS environment.

Install Packer

Download link
As we are using WSL 2 linux so i am downloading via bash script

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install packer
Enter fullscreen mode Exit fullscreen mode

Create a project folder , am going to name it as packer.and cd into it.

Checking packer

Image Packer

Building a Image

We are going to build a golden image for NGINX

  • Make a file inside the folder , name it as nginx.pkr.hcl
  • Copy Paste below code, Its a HCL code for create a packer image to run NGINX server on Ubuntu in ap-southeast-2 region.
variable "ami_id" {
    type = string
    default = "ami-0b7dcd6e6fd797935"
}

locals {
    app_name = "nginx"
}

source "amazon-ebs" "nginx" {
    ami_name = "my-nginx-server-${local.app_name}"
    instance_type = "t2.micro"
    region = "ap-southeast-2"
    source_ami = "${var.ami_id}"
    ssh_username = "ubuntu"
    tags = {
        Name = local.app_name
    }
}

build {
    sources = ["source.amazon-ebs.nginx"]
    provisioner "shell"  {
        inline = [
            "sudo apt install nginx -y",
            "sudo systemctl enable nginx",
            "sudo systemctl start nginx"

        ]
    }
}
Enter fullscreen mode Exit fullscreen mode

once you complete the script , build the image using packer

packer build nginx.pkr.hcl 
Enter fullscreen mode Exit fullscreen mode

Image packer build
Image build complete

Verify the build

  • Go to AWS console and select jump to EC2 dashboard.
  • Now under the images area select AMI.
  • You will be able to see the packer build AMI Image ami image

Deploy a new instance with Terraform

  • Lets create a new file in same folder , Name it as main.tf
  • Copy this code
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.58.0"
    }
  }
}

provider "aws" {
  profile = "default"
  region  = "ap-southeast-2"
}

data "aws_ami" "packer_image" {
    filter {
            name   = "name"
            values = ["my-nginx-server-nginx"]
        }
    owners = ["self"]
}

resource "aws_instance" "my_server" {
  ami           = data.aws_ami.packer_image.id
  instance_type = "t2.micro"
    tags = {
        Name = "Server-nginx-Packer"
    }
}

output "public_ip" {
  value = aws_instance.my_server.public_ip
}
Enter fullscreen mode Exit fullscreen mode
  • Initiate terraform
terraform init
Enter fullscreen mode Exit fullscreen mode
  • Plan the deployment
terraform plan
Enter fullscreen mode Exit fullscreen mode

if there is no error

  • Deploy your infrastructure
terraform apply -auto-approve
Enter fullscreen mode Exit fullscreen mode

Best Practice

  • Build your packer code
  • Publish to git , commit
  • build image
  • provision image
  • Reference your image
  • and provision infrastructure

🎉Congratulations🎉 you have successfully deployed an EC2 instance with image build on packer.


âś…Connect with me on Twitter
🤝🏽Connect with me on Linkedin
🧑🏼‍🤝‍🧑🏻 Read more post on dev.to or iCTPro.co.nz
đź’» Connect with me on GitHub

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read full post →

Top comments (1)

Collapse
 
derekcrosson profile image
Derek Crosson •

Thanks for writing this! I was wondering how Terraform knows that this is the image that Packer created when data.aws_ami.packer_image.id is set as the ami in the aws_instance Terraform resource?

Best Practices for Running  Container WordPress on AWS (ECS, EFS, RDS, ELB) using CDK cover image

Best Practices for Running Container WordPress on AWS (ECS, EFS, RDS, ELB) using CDK

This post discusses the process of migrating a growing WordPress eShop business to AWS using AWS CDK for an easily scalable, high availability architecture. The detailed structure encompasses several pillars: Compute, Storage, Database, Cache, CDN, DNS, Security, and Backup.

Read full post