aws-ami-builder

作者: hashicorp

使用Packer的amazon-ebs建置器建立自訂Amazon Machine Images。透過HCL範本自動化從來源AMI建立AMI,並搭配佈建工具(Shell腳本、檔案上傳、組態管理)進行自訂。支援透過ami_regions進行多區域AMI分發,以及依名稱、擁有者和虛擬化類型進行靈活的來源AMI篩選。可透過環境變數、AWS憑證檔案或IAM執行個體設定檔進行驗證;包含範本的驗證與建置命令...

npx skills add https://github.com/hashicorp/agent-skills --skill aws-ami-builder

AWS AMI Builder

Build Amazon Machine Images (AMIs) using Packer's amazon-ebs builder.

Reference: Amazon EBS Builder

Note: Building AMIs incurs AWS costs (EC2 instances, EBS storage, data transfer). Builds typically take 10-30 minutes depending on provisioning complexity.

Basic AMI Template

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

variable "region" {
  type    = string
  default = "us-west-2"
}

locals {
  timestamp = regex_replace(timestamp(), "[- TZ:]", "")
}

source "amazon-ebs" "ubuntu" {
  region        = var.region
  instance_type = "t3.micro"

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

  ssh_username = "ubuntu"
  ami_name     = "my-app-${local.timestamp}"

  tags = {
    Name      = "my-app"
    BuildDate = local.timestamp
  }
}

build {
  sources = ["source.amazon-ebs.ubuntu"]

  provisioner "shell" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get upgrade -y",
    ]
  }
}

Common Source AMI Filters

Ubuntu 22.04 LTS

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

Amazon Linux 2023

source_ami_filter {
  filters = {
    name                = "al2023-ami-*-x86_64"
    root-device-type    = "ebs"
    virtualization-type = "hvm"
  }
  most_recent = true
  owners      = ["amazon"]
}

Multi-Region AMI

source "amazon-ebs" "ubuntu" {
  region        = "us-west-2"
  instance_type = "t3.micro"

  source_ami_filter {
    filters = {
      name = "ubuntu/images/*ubuntu-jammy-22.04-amd64-server-*"
    }
    most_recent = true
    owners      = ["099720109477"]
  }

  ssh_username = "ubuntu"
  ami_name     = "my-app-${local.timestamp}"

  # Copy to additional regions
  ami_regions = ["us-east-1", "us-east-2", "eu-west-1"]
}

Authentication

Packer uses AWS credential resolution:

  1. Environment variables: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  2. AWS credentials file: ~/.aws/credentials
  3. IAM instance profile (when running on EC2)
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export AWS_REGION="us-west-2"

packer build .

Build Commands

# Initialize plugins
packer init .

# Validate template
packer validate .

# Build AMI
packer build .

# Build with variables
packer build -var "region=us-east-1" .

Common Issues

SSH Timeout

  • Ensure security group allows SSH (port 22)
  • Verify subnet has internet access

AMI Already Exists

  • AMI names must be unique
  • Use timestamp in name: my-app-${local.timestamp}

Volume Size Too Small

  • Check source AMI's volume size
  • Set launch_block_device_mappings.volume_size accordingly

References

來自 hashicorp 的更多技能

provider-actions
hashicorp
使用 Plugin Framework 實作 Terraform Provider 動作。在開發於生命週期事件(之前/之後…)執行的命令式操作時使用。
official
new-terraform-provider
hashicorp
在新版Terraform Provider使用Plugin Framework建立框架時使用此功能:工作區佈局、Go模組設定、Provider伺服器main.go,以及provider.go…
official
terraform-test
hashicorp
編寫和執行 Terraform 測試的綜合指南。在建立測試檔案(.tftest.hcl)、使用 run 區塊編寫測試情境、驗證…時使用。
official
terraform-test
hashicorp
撰寫與執行 Terraform 測試的完整指南,涵蓋斷言、模擬及模組驗證。使用 .tftest.hcl 語法編寫測試檔案,透過 run 區塊在 plan 或 apply 模式下執行,支援順序與平行執行,並可選擇隔離狀態。對資源屬性、輸出及資料來源進行條件斷言;使用 expect_failures 驗證無效輸入是否被正確拒絕。模擬提供者(Terraform 1.7.0 以上版本)可模擬基礎設施行為,無需...
official
provider-actions
hashicorp
使用 Plugin Framework 在資源生命週期事件中執行命令式的 Terraform Provider 動作。支援建立前/後與更新前/後的觸發機制(Terraform 1.14.0 不支援銷毀事件)。需以正確的框架類型、集合的 ElementType 及輸入驗證器定義適當的綱要。包含進度回報、逾時管理及長時間操作的全面錯誤處理。實作輪詢與...
official
new-terraform-provider
hashicorp
使用 Plugin Framework 建立新的 Terraform provider。生成新的 Go 模組工作區,採用標準的「terraform-provider-」命名慣例,並初始化所需的依賴項。提供遵循 HashiCorp Plugin Framework 模式的範本 main.go 檔案,並附有待辦事項標記供自訂使用。透過執行建置與測試指令來驗證設定,確保 provider 能成功編譯並通過初步檢查。在建立新的工作區前,會先確認意圖以管理工作區。
official
azure-verified-modules
hashicorp
認證要求與Azure Terraform模組尋求AVM合規性的最佳實踐。強制執行提供者版本限制(azurerm >= 4.0, < 5.0;azapi >= 2.0, < 3.0),並禁止基於git的模組引用,改為使用固定的Terraform註冊表來源。要求所有識別碼採用小寫蛇形命名法、精確的變數類型、透過防腐層模式實現離散的輸出屬性,以及按字母順序排列的locals。新增資源時需要功能切換變數...
official
provider-docs
hashicorp
使用 HashiCorp 推薦的模式、tfplugindocs 模板和 schema,為 Terraform Registry 建立、更新和審查 Terraform provider 文件。
official