ようへいの日々精進XP

よかろうもん

【俺の一行チップス】Packer で EC2 の AMI を作ったあとに出来るだけ簡単に AMI ID を文字列でほしい場合

やりたいこと

Packer で EC2 の AMI を作ったあとに出来るだけ簡単に AMI ID を文字列でほしい.

どうしたか

まず, Manifest Post-Processor を使う. Post Processor とは, AMI 作り終わって, 作業用の EC2 をターミネートし終わったあとに実行される処理だと思っている.

packer.io

packer.io

Post-Processor は色々と用意されているけど, Manifest Post-ProcessorJSON 形式で packer を実行したパスに保存される. JSON 形式で出力されるので, あとから色々と加工してガチャガチャ出来るので便利だと思う. 以下は Manifest Post-Processor で生成されるt manifest.json のサンプル.

{
  "builds": [
    {
      "name": "file",
      "builder_type": "file",
      "build_time": 1581225653,
      "files": [
        {
          "name": "dummy_artifact",
          "size": 26
        }
      ],
      "artifact_id": "File",
      "packer_run_uuid": "a8407f0c-b343-0730-fac8-db661853080c",
      "custom_data": null
    },
    {
      "name": "file",
      "builder_type": "file",
      "build_time": 1581225786,
      "files": [
        {
          "name": "dummy_artifact",
          "size": 26
        }
...
    },
    {
      "name": "amazon-ebs",
      "builder_type": "amazon-ebs",
      "build_time": 1581226719,
      "files": null,
      "artifact_id": "ap-northeast-1:ami-xxxxxxxxxxxxxxxxxxxx",
      "packer_run_uuid": "3e557191-2305-9700-d1e4-c01579143ac0",
      "custom_data": null
    }
  ],
  "last_run_uuid": "3e557191-2305-9700-d1e4-c01579143ac0"
}

ということで, 以下のように packer build を実行した後に jq や awk などを駆使して AMI ID を取得することができた.

$ cat manifest.json | jq -r '.builds[]|select(.name == "amazon-ebs")|.artifact_id' | awk -F':' '{print $2}'
ami-xxxxxxxxxxxxxxxxxxx

やったー.

以上

メモでした.