簡單介紹如何用 Packer 建立 AWS AMI

程式技術
sharkHead
簡單介紹如何用 Packer 建立 AWS AMI

假設我們需要一個運行 PHP 專案的線上環境,我們可以在雲端服務上面啟動一台裝有 Linux 乾淨作業系統的機器,然後透過 SSH 進入機器,開始安裝所需的系統套件,以便運行 PHP 專案。

這個過程雖然不算冗長,但是假設你需要不止一台機器,而是十台,甚至上百台機器,重複進行這個流程可能會讓你抓狂。

為了解決這個問題,AWS EC2 提供 User Data 的功能,讓您可以在啟動 Linux 執行個體後執行常見的自動化組態任務,例如安裝 PHP 專案所需的系統套件。但這個過程仍需等待一段時間。

有沒有什麼辦法,可以讓機器在一啟動後,環境就完全準備好了呢?方法其實有的,就是自己建立一個準備好運行環境的 AMI。

AWS 的 AMI 是什麼?

AMI 是 Amazon Machine Image 的縮寫,是 Amazon Web Services (AWS) 中的一項功能。AMI 是一個預先配置好的虛擬機映像檔,可以用來快速啟動 EC2 實例。AMI 中包含了操作系統、應用程序和任何額外的軟件、設置和資源。我們可以自己設定並建立客製化的 AMI,以便在 EC2 上啟動實例後就可以立即使用。

用來建立 AMI 的工具,Packer

Packer 是一個由 HashiCorp 所開發的開源工具,可以用來建立多平台的映像檔,包括 AWS AMI。使用 Packer 可以讓你從頭開始建立 AMI,或是基於現有的 AMI 進行擴展和自訂。

Packer 除了 AMI,還可以拿來建立容器的映像檔 (但 Dockerfile 已經夠好用了,我這邊就不考慮了)。

建立安裝好 Docker 的 UbuntuOS AMI

首先在系統上安裝 Packer,根據不同的作業系統,會有不一樣的安裝方式,詳細可以參考官方文件。這裡我選擇透過 HomeBrew 安裝。

$ brew install packer

安裝完成之後,建立一個新資料夾 docker-ami 並進入到資料夾中。

$ mkdir docker-ami && cd docker-ami

在資料夾中新增一個檔案 docker.pkr.hcl,然後寫上以下的內容。

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

# 從 Amazon EBS 後端 AMI 中挑選乾淨的 Ubuntu OS 來建立我們的客製 AMI
source "amazon-ebs" "docker" {
  ami_name        = "docker"
  ami_description = "Install docker in a Ubuntu OS"
  instance_type   = "t4g.small"
  region          = "us-west-2"

  source_ami_filter {
    filters = {
      architecture        = "arm64"
      name                = "ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-arm64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["099720109477"]
  }

  ssh_username = "ubuntu"

  tags = {
    Name = "docker"
  }
}

# 在剛剛挑選的 Ubuntu OS 中執行以下指令安裝 Docker
# 安裝完成之後,Packer 就會開始建立新的 AMI
# 第一行指令確保在安裝過程中不會出現任何互動式提示,例如要輸入 yes 才能下一步
build {
  sources = ["source.amazon-ebs.docker"]

  provisioner "shell" {
    inline = [
      "echo 'debconf debconf/frontend select Noninteractive' | sudo debconf-set-selections",
      "sudo apt-get update",
      "sudo apt-get install -y ca-certificates curl gnupg",
      "sudo install -m 0755 -d /etc/apt/keyrings",
      "curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg",
      "sudo chmod a+r /etc/apt/keyrings/docker.gpg",
      "echo 'deb [arch='$(dpkg --print-architecture)' signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu '$(. /etc/os-release && echo $VERSION_CODENAME)' stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null",
      "sudo apt-get update",
      "sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin"
    ]
  }
}

Packer 使用 Hashicorp 自家的 HCL (Hashicorp Configuration Language) 語言,如果你很熟悉 Terraform,想必對上面的內容感到很親切。

在使用 Packer 建立 AMI 之前,請先設定好 AWS 的 Credentials,讓 Packer 擁有在你 AWS 帳號中建立 AMI 的權限。

首先對 Packer 進行設定初始化。

$ packer init .

判斷檔案的內容是否正確。

$ packer validate .

如果內容正確無誤,就可以開始建立 AMI 了。

$ packer build docker.pkr.hcl

建立成功之後,就可以登入 AWS 的網頁主控台,選擇服務 EC2,在 AMIs 頁面底下,應該就能看到剛剛建立的 AMI 了。

2023_04_23_23_32_53_8397e0abea5d.png
私有的 AMI ID 應該可以不用遮,但不知道為什麼就是很想遮

Packer 並不會幫你管理 AMI,如果你要刪除 AMI 的話,可以上到 AMI 的管理頁面手動將 AMI deregister 並刪除對應的 snapshot。

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言