やりたいこと
Packer で EC2 の AMI を作ったあとに出来るだけ簡単に AMI ID を文字列でほしい.
どうしたか
まず, Manifest Post-Processor を使う. Post Processor とは, AMI 作り終わって, 作業用の EC2 をターミネートし終わったあとに実行される処理だと思っている.
Post-Processor は色々と用意されているけど, Manifest Post-Processor は JSON 形式で 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
やったー.
以上
メモでした.