📦

packerでAMIを作る時のおすすめ設定

2023/02/01に公開

これはなに

packerでAMIを作る時のおすすめ設定です。

クロスアカウント共有のAMIを作る

たとえば検証環境で作ったAMIをステージングがプロダクションにAMI共有&AMIコピーする時。

ami_users

この設定を入れておくと、指定したAWSアカウント向けに共有設定がされる。
共有先のAMI画面でプライベートを選択すると、検証環境で作成したAMIを参照することができる。

snapshot_users

この設定を入れておくと、指定したAWSアカウント向けにEBSの共有設定がされる。
共有先で共有されたAMIをコピーすることができる。

この設定が不足していると、共有先で共有されたAMIをコピーする時、「You do not have permission to access the storage of this ami」というエラーが発生する。

設定

下記2個の設定を追加する。

## Source
source "amazon-ebs" "app" {

  // snip

  // AMI Share
  ami_users = [
    "123456789012", // Stg
    "123456789012"] // Prd
  snapshot_users=[
    "123456789012", // Stg
    "123456789012"] // Prd
    
}

同じAMI名でも上書きして作る

デバッグ中など同じAMIを何度も作る時に向けて入れておくと良い。

force_deregister と force_delete_snapshot

運用の中ではAMI名にコミットIDとかを付与すると思うので、あくまでデバッグ向け。

設定

## Source
source "amazon-ebs" "app" {

  // snip

  force_deregister =  true
  force_delete_snapshot = true
}

Ansible実行ユーザとしてec2-userを指定する

CICDの中でPackerを実行してAMIを作る時に設定する。

user

CICDの中でPackerを実行してAMIを作るとrootユーザなどでEC2へSSHしてしまう。
BaseAMIとするAmazonLinux2には(SSHログインできるユーザとして)ec2-userしか存在しないのでAMIを作るときはuserとしてec2-userを指定する

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

    provisioner "ansible" {
      playbook_file = "./playbook.yml"
      user = "ec2-user" // Here!!
    }
}

AMI名およびNameタグにタイムスタンプを付与する

設定

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

source "amazon-ebs" "ubuntu" {
  ami_name      = "packer-ami-${local.timestamp}"

  // snip

  tags = {
    "Name"                            = "packer-ami-${local.timestamp}"
    }

参考

Packerのドキュメントはなぜか縦にめちゃ長いけど色々書いてあるので読みましょう。

Discussion