<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ahmed Belal</title>
    <description>The latest articles on Forem by Ahmed Belal (@engabelal).</description>
    <link>https://forem.com/engabelal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3547024%2Feda8281c-0a29-4db1-9b9f-a6c23160fdcd.jpeg</url>
      <title>Forem: Ahmed Belal</title>
      <link>https://forem.com/engabelal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/engabelal"/>
    <language>en</language>
    <item>
      <title>At-Rest vs In-Transit Encryption</title>
      <dc:creator>Ahmed Belal</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:23:05 +0000</pubDate>
      <link>https://forem.com/engabelal/at-rest-vs-in-transit-encryption-128k</link>
      <guid>https://forem.com/engabelal/at-rest-vs-in-transit-encryption-128k</guid>
      <description>&lt;p&gt;🔐 At-Rest vs In-Transit Encryption &lt;/p&gt;

&lt;p&gt;What’s the Difference?&lt;/p&gt;

&lt;p&gt;In modern cloud environments, data must be encrypted everywhere — whether it’s sitting still or moving between systems. Let’s break it down 👇&lt;/p&gt;

&lt;p&gt;💾 At-Rest Encryption&lt;br&gt;
This protects your data while it’s stored — on disks, databases, or backups.&lt;br&gt;
If someone gets access to the storage, they still can’t read the data without the encryption key.&lt;br&gt;
✅ Example: S3 Bucket encryption, EBS volume encryption.&lt;/p&gt;

&lt;p&gt;🌐 In-Transit Encryption&lt;br&gt;
This protects data while it’s moving between systems, apps, or users.&lt;br&gt;
It ensures no one can intercept or alter data during transfer.&lt;br&gt;
✅ Example: HTTPS, TLS between APIs or microservices.&lt;/p&gt;

&lt;p&gt;🧠 Simply put:&lt;br&gt;
    • At-Rest → protects data “when it’s sleeping”&lt;br&gt;
    • In-Transit → protects data “while it’s traveling”&lt;br&gt;
And both are equally critical — you can’t have real security without using both.&lt;/p&gt;

&lt;h1&gt;
  
  
  CloudSecurity #Encryption #DevOps #AWS #CyberSecurity #ABCloudOps #InfrastructureAsCode #Kubernetes
&lt;/h1&gt;

</description>
      <category>cloud</category>
      <category>security</category>
      <category>cybersecurity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Symmetric vs Asymmetric Encryption</title>
      <dc:creator>Ahmed Belal</dc:creator>
      <pubDate>Wed, 08 Oct 2025 18:21:06 +0000</pubDate>
      <link>https://forem.com/engabelal/symmetric-vs-asymmetric-encryption-1cei</link>
      <guid>https://forem.com/engabelal/symmetric-vs-asymmetric-encryption-1cei</guid>
      <description>&lt;p&gt;🔑 Symmetric vs Asymmetric Encryption &lt;/p&gt;

&lt;p&gt;The Perfect Pair for Data Security&lt;/p&gt;

&lt;p&gt;Every secure system begins with keys, but how you use them makes all the difference 👇&lt;/p&gt;

&lt;p&gt;✴️ Symmetric Encryption&lt;br&gt;
    • Uses one shared key for both encryption and decryption.&lt;br&gt;
    • Fast and efficient — great for large amounts of data.&lt;br&gt;
    • The challenge: both sides must securely share the same key.&lt;br&gt;
✅ Examples: AES, DES, 3DES&lt;/p&gt;

&lt;p&gt;✴️ Asymmetric Encryption&lt;br&gt;
    • Uses two keys: a public key for encryption and a private key for decryption.&lt;br&gt;
    • Slower, but perfect for building trust and exchanging secrets safely.&lt;br&gt;
✅ Examples: RSA, ECC, Diffie-Hellman&lt;/p&gt;

&lt;p&gt;🔄 How They Work Together&lt;br&gt;
In real-world systems, we often use asymmetric encryption to securely share a symmetric key,&lt;br&gt;
then use symmetric encryption to handle the actual data because it’s much faster.&lt;/p&gt;

&lt;p&gt;That’s exactly how HTTPS and TLS work behind the scenes — secure key exchange first, then fast data encryption.&lt;/p&gt;

&lt;p&gt;🧠 Simply put:&lt;br&gt;
    • Symmetric → one key, fast, but hard to share safely&lt;br&gt;
    • Asymmetric → two keys, slower, but enables secure sharing&lt;br&gt;
    • Together → speed + security&lt;/p&gt;

&lt;h1&gt;
  
  
  CyberSecurity #Encryption #CloudSecurity #Networking #TLS #RSA #AES #DevOps #InfoSec #ABCloudOps #AWS
&lt;/h1&gt;

</description>
      <category>cloud</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Building Golden AMIs with HashiCorp Packer: From 15 Minutes to 60 Seconds</title>
      <dc:creator>Ahmed Belal</dc:creator>
      <pubDate>Mon, 06 Oct 2025 19:58:55 +0000</pubDate>
      <link>https://forem.com/engabelal/building-golden-amis-with-hashicorp-packer-from-15-minutes-to-60-seconds-24c</link>
      <guid>https://forem.com/engabelal/building-golden-amis-with-hashicorp-packer-from-15-minutes-to-60-seconds-24c</guid>
      <description>&lt;h2&gt;
  
  
  🤔 The Problem
&lt;/h2&gt;

&lt;p&gt;Every time you launch a new EC2 instance, you spend 10-15 minutes doing the same repetitive tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installing Git, AWS CLI, and development tools&lt;/li&gt;
&lt;li&gt;Configuring security (firewall, SSH hardening)&lt;/li&gt;
&lt;li&gt;Setting up monitoring agents&lt;/li&gt;
&lt;li&gt;Applying system updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This manual process leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Inconsistent environments&lt;/li&gt;
&lt;li&gt;❌ Human errors&lt;/li&gt;
&lt;li&gt;❌ Wasted engineering time&lt;/li&gt;
&lt;li&gt;❌ Slow deployment cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 The Solution: HashiCorp Packer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Packer&lt;/strong&gt; is an Infrastructure as Code tool that automates machine image creation. Instead of manually configuring servers, you write code once and Packer builds identical, production-ready images automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Packer?
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Consistency&lt;/strong&gt; - Same image across dev, staging, and production&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Speed&lt;/strong&gt; - Launch pre-configured servers in seconds&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Version Control&lt;/strong&gt; - Track image configurations in Git&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Multi-Cloud&lt;/strong&gt; - Build for AWS, Azure, GCP, VMware from one template&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Immutable Infrastructure&lt;/strong&gt; - Deploy once, never modify  &lt;/p&gt;


&lt;h2&gt;
  
  
  🛠️ How Packer Works
&lt;/h2&gt;

&lt;p&gt;Packer follows a simple workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Launch&lt;/strong&gt; a temporary instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provision&lt;/strong&gt; it with your configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create&lt;/strong&gt; an image snapshot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminate&lt;/strong&gt; the temporary instance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All automated, all repeatable.&lt;/p&gt;


&lt;h2&gt;
  
  
  📝 Real-World Example: DevOps Golden AMI
&lt;/h2&gt;

&lt;p&gt;Let me show you how I built a production-ready Ubuntu AMI with Packer.&lt;/p&gt;
&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;packer-aws-devops-ami/
├── aws/
│   ├── ubuntu-devops-base.pkr.hcl       # Main template
│   ├── variables.pkr.hcl                # Variables
│   └── terraform.auto.pkrvars.hcl       # Values
├── scripts/
│   ├── 01-update-system.sh
│   ├── 02-install-tools.sh
│   ├── 03-install-aws-cli.sh
│   ├── 04-install-cloudwatch-agent.sh
│   ├── 05-install-ssm-agent.sh
│   ├── 06-security-hardening.sh
│   ├── 07-configure-auto-updates.sh
│   └── 08-cleanup.sh
└── configs/
    ├── sshd_config
    └── cloudwatch-config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 1: Define the Packer Template
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;aws/ubuntu-devops-base.pkr.hcl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;packer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;required_plugins&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;amazon&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&amp;gt;= 1.2.8"&lt;/span&gt;
      &lt;span class="nx"&gt;source&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"github.com/hashicorp/amazon"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;"amazon-ebs"&lt;/span&gt; &lt;span class="s2"&gt;"ubuntu"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami_name&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.ami_name_prefix}-${formatdate("&lt;/span&gt;&lt;span class="nx"&gt;YYYY-MM-DD-hhmm&lt;/span&gt;&lt;span class="s2"&gt;", timestamp())}"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance_type&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_region&lt;/span&gt;

  &lt;span class="nx"&gt;source_ami_filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;filters&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;name&lt;/span&gt;                &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"&lt;/span&gt;
      &lt;span class="nx"&gt;root-device-type&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ebs"&lt;/span&gt;
      &lt;span class="nx"&gt;virtualization-type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"hvm"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source_ami_owner&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;ssh_username&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ssh_username&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;var&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;build&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;sources&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"source.amazon-ebs.ubuntu"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;provisioner&lt;/span&gt; &lt;span class="s2"&gt;"shell"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;inline&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"cloud-init status --wait"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;provisioner&lt;/span&gt; &lt;span class="s2"&gt;"file"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;source&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../configs/sshd_config"&lt;/span&gt;
    &lt;span class="nx"&gt;destination&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/tmp/sshd_config"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;provisioner&lt;/span&gt; &lt;span class="s2"&gt;"file"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;source&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"../configs/cloudwatch-config.json"&lt;/span&gt;
    &lt;span class="nx"&gt;destination&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"/tmp/cloudwatch-config.json"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;provisioner&lt;/span&gt; &lt;span class="s2"&gt;"shell"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;scripts&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/01-update-system.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/02-install-tools.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/03-install-aws-cli.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/04-install-cloudwatch-agent.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/05-install-ssm-agent.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/06-security-hardening.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/07-configure-auto-updates.sh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"../scripts/08-cleanup.sh"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Define Variables
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;aws/variables.pkr.hcl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"aws_region"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AWS region to build AMI"&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"eu-north-1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_type"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"EC2 instance type for building"&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ami_name_prefix"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Prefix for AMI name"&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"devops-base-ubuntu"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"source_ami_owner"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"AWS account ID of AMI owner"&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"099720109477"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"ssh_username"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"SSH username"&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"ubuntu"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"tags"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Environment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"production"&lt;/span&gt;
    &lt;span class="nx"&gt;ManagedBy&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Packer"&lt;/span&gt;
    &lt;span class="nx"&gt;Project&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"DevOps-Base-Image"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: Create Provisioning Scripts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;scripts/02-install-tools.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Installing core DevOps tools..."&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    git &lt;span class="se"&gt;\&lt;/span&gt;
    curl &lt;span class="se"&gt;\&lt;/span&gt;
    wget &lt;span class="se"&gt;\&lt;/span&gt;
    vim &lt;span class="se"&gt;\&lt;/span&gt;
    nano &lt;span class="se"&gt;\&lt;/span&gt;
    unzip &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    htop &lt;span class="se"&gt;\&lt;/span&gt;
    tree &lt;span class="se"&gt;\&lt;/span&gt;
    jq &lt;span class="se"&gt;\&lt;/span&gt;
    net-tools &lt;span class="se"&gt;\&lt;/span&gt;
    software-properties-common

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Core tools installed successfully"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; &lt;code&gt;scripts/06-security-hardening.sh&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Applying security hardening..."&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ufw
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow ssh
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nb"&gt;enable

sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; fail2ban
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;fail2ban
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start fail2ban

&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /tmp/sshd_config /etc/ssh/sshd_config
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;644 /etc/ssh/sshd_config

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"==&amp;gt; Security hardening completed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Build the AMI
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;aws/
packer init &lt;span class="nb"&gt;.&lt;/span&gt;
packer validate &lt;span class="nb"&gt;.&lt;/span&gt;
packer build &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Build Output
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;==&amp;gt; amazon-ebs.ubuntu: Launching a source AWS instance...
==&amp;gt; amazon-ebs.ubuntu: Waiting for instance to become ready...
==&amp;gt; amazon-ebs.ubuntu: Connected to SSH!
==&amp;gt; amazon-ebs.ubuntu: Provisioning with shell script: ../scripts/01-update-system.sh
==&amp;gt; amazon-ebs.ubuntu: Provisioning with shell script: ../scripts/02-install-tools.sh
==&amp;gt; amazon-ebs.ubuntu: Provisioning with shell script: ../scripts/03-install-aws-cli.sh
...
==&amp;gt; amazon-ebs.ubuntu: Creating AMI devops-base-ubuntu-2025-01-15-1430
==&amp;gt; amazon-ebs.ubuntu: AMI: ami-0123456789abcdef0
==&amp;gt; amazon-ebs.ubuntu: Terminating the source AWS instance...
Build 'amazon-ebs.ubuntu' finished after 6 minutes 32 seconds.

==&amp;gt; Builds finished. The artifacts of successful builds are:
--&amp;gt; amazon-ebs.ubuntu: AMIs were created:
eu-north-1: ami-0123456789abcdef0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment Time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;15 minutes&lt;/td&gt;
&lt;td&gt;60 seconds&lt;/td&gt;
&lt;td&gt;95% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual (errors)&lt;/td&gt;
&lt;td&gt;100% identical&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;td&gt;Always hardened&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost per Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🎯 What's Included in the AMI
&lt;/h2&gt;

&lt;p&gt;✅ &lt;strong&gt;Ubuntu 22.04 LTS&lt;/strong&gt; - Latest stable release&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;AWS CLI v2&lt;/strong&gt; - Cloud management&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Git&lt;/strong&gt; - Version control&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;CloudWatch Agent&lt;/strong&gt; - Monitoring&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;SSM Agent&lt;/strong&gt; - Remote management&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Security Hardening&lt;/strong&gt; - UFW firewall, Fail2ban, SSH hardening&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Automatic Updates&lt;/strong&gt; - Unattended security patches&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;DevOps Tools&lt;/strong&gt; - curl, wget, vim, htop, tree, jq  &lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Launch an Instance from Your AMI
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws ec2 run-instances &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image-id&lt;/span&gt; ami-0123456789abcdef0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--instance-type&lt;/span&gt; t3.micro &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-name&lt;/span&gt; your-key-pair &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--security-group-ids&lt;/span&gt; sg-xxxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet-id&lt;/span&gt; subnet-xxxxxx &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tag-specifications&lt;/span&gt; &lt;span class="s1"&gt;'ResourceType=instance,Tags=[{Key=Name,Value=DevOps-Server}]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Fully configured server ready in 60 seconds! 🎉&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Best Practices
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Version Your Images&lt;/strong&gt; - Use timestamps or semantic versioning in AMI names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate in CI/CD&lt;/strong&gt; - Build new AMIs on every commit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Before Production&lt;/strong&gt; - Launch test instances from new AMIs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Up Old AMIs&lt;/strong&gt; - Deregister unused images to save costs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Variables&lt;/strong&gt; - Make templates reusable across environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document Changes&lt;/strong&gt; - Keep a changelog for image updates&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  🔗 Full Project
&lt;/h2&gt;

&lt;p&gt;The complete project with all scripts and configurations is available on GitHub:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/engabelal" rel="noopener noreferrer"&gt;
        engabelal
      &lt;/a&gt; / &lt;a href="https://github.com/engabelal/packer-aws-devops-ami" rel="noopener noreferrer"&gt;
        packer-aws-devops-ami
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Packer template to build hardened Ubuntu 22.04 AMI with DevOps tools, AWS CLI, CloudWatch Agent, and security configurations.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Packer AWS DevOps Base AMI&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/engabelal/packer-aws-devops-ami" rel="noopener noreferrer"&gt;https://github.com/engabelal/packer-aws-devops-ami&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Golden AMI with essential DevOps tools for AWS EC2 instances.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📖 What is Packer?&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Packer&lt;/strong&gt; is an open-source tool by HashiCorp that automates the creation of machine images (AMIs, Docker images, VMware templates, etc.) across multiple platforms from a single source configuration.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Why Use Packer?&lt;/h3&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; - Create identical machine images for dev, staging, and production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt; - Pre-baked images launch in seconds vs. minutes of configuration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Control&lt;/strong&gt; - Track image configurations in Git like any other code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Cloud&lt;/strong&gt; - Build images for AWS, Azure, GCP, VMware from the same template&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation&lt;/strong&gt; - Integrate with CI/CD pipelines for automated image builds&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;What Can You Do With Packer?&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;✅ &lt;strong&gt;Golden Images&lt;/strong&gt; - Pre-configure OS, tools, and security settings
✅ &lt;strong&gt;Immutable Infrastructure&lt;/strong&gt; - Deploy servers that never change after creation
✅ &lt;strong&gt;Faster Deployments&lt;/strong&gt; - Launch fully-configured instances instantly
✅ &lt;strong&gt;Compliance&lt;/strong&gt; - Ensure all…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/engabelal/packer-aws-devops-ami" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;h2&gt;
  
  
  🎓 Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Packer automates machine image creation&lt;/strong&gt; across multiple cloud platforms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Golden AMIs reduce deployment time&lt;/strong&gt; from minutes to seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure as Code&lt;/strong&gt; ensures consistency and repeatability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security hardening&lt;/strong&gt; can be baked into every image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-effective&lt;/strong&gt; - builds cost pennies and save hours&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 What's Next?
&lt;/h2&gt;

&lt;p&gt;Try building your own Golden AMI! Start with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repository&lt;/li&gt;
&lt;li&gt;Customize the scripts for your needs&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;packer build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Launch instances from your AMI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Have questions? Drop them in the comments below! 👇&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Connect with me:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/engabelal" rel="noopener noreferrer"&gt;@engabelal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/engabelal/" rel="noopener noreferrer"&gt;linkedin.com/in/engabelal&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>packer</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>Did you know? Terraform S3 State Locking — No DynamoDB Needed</title>
      <dc:creator>Ahmed Belal</dc:creator>
      <pubDate>Sun, 05 Oct 2025 17:02:46 +0000</pubDate>
      <link>https://forem.com/engabelal/did-you-know-terraform-s3-state-locking-no-dynamodb-needed-k34</link>
      <guid>https://forem.com/engabelal/did-you-know-terraform-s3-state-locking-no-dynamodb-needed-k34</guid>
      <description>&lt;p&gt;Since Terraform v1.10, you no longer need DynamoDB for state locking.&lt;br&gt;
Terraform introduced S3 Native Locking, which lets you lock your state file directly inside your S3 bucket — no DynamoDB table required.&lt;/p&gt;

&lt;p&gt;🧩 How it works&lt;/p&gt;

&lt;p&gt;Add this line to your backend configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use_lockfile = true

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform will:&lt;br&gt;
    • Create a .tflock file in your S3 bucket&lt;br&gt;
    • Prevent concurrent writes to the same state&lt;br&gt;
    • Automatically handle lock cleanup after operations&lt;/p&gt;

&lt;p&gt;✅ Introduced in v1.10&lt;br&gt;
✅ Stabilized in v1.11&lt;br&gt;
⚠️ HashiCorp plans to deprecate DynamoDB locking soon&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;🧠 Before enabling in production&lt;br&gt;
    • Enable Versioning and Encryption on your S3 bucket&lt;br&gt;
    • Ensure your IAM policy includes:&lt;br&gt;
GetObject, PutObject, DeleteObject&lt;br&gt;
    • Always test first in a dev/test environment&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;“Less complexity, same safety.”&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://developer.hashicorp.com/terraform/language/backend/s3" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/language/backend/s3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;h1&gt;
  
  
  Terraform #DevOps #AWS #InfrastructureAsCode #CloudEngineering #HashiCorp #ABCloudOps
&lt;/h1&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>dynamodb</category>
      <category>s3</category>
    </item>
  </channel>
</rss>
