目次
はじめに
AMIと紐づいているSnapshotを操作する際に、aws-cliコマンドで取得できる情報からAMIとSnapshotはどのように確認できるか。
本記事でまとめてみます。
AMI側から取得できる情報について
aws-cliでAMIの情報を取得するコマンドとして、ec2 describe-imagesを利用します。
このコマンドで取得できる情報を確認するためには、ドキュメントのOuputを確認してみると。
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-images.html#output
BlockDeviceMappings(list)の中にSnapshotIdが含まれている事がわかります。
このため下記のようにqueryオプション(JMESPath)で整形してあげると、AMIのIDとSnapshotIDの対応関係に着目して情報が取得できます。
aws ec2 describe-images --image-ids ami-id --query 'Images[*].{ImageId:ImageId, SnapshotId:BlockDeviceMappings[*].Ebs.SnapshotId}' --output json
Snapshot側から取得できる情報について
aws-cliでSnapshotの情報を取得するコマンドは、ec2 describe-snapshotsを利用します。
Outputを確認してみますが、ami-idといった項目は存在しない事がわかります。
このことからSnapshot側から取得できる情報では、どのAMIが紐づいているかは確認する事はできないように思えます。
AMIに紐づくSnapshotのDescriptionについて
Snapshot側から取得できる項目を眺めているだけでは、ami-idは取得できないように思えますが。
実際にAMIに紐づいているSnapshotの情報を確認してみるとSnapshot側のDescriptionに下記のような情報が記載されている事に気がつきます。
- Created by CreateImage(i-xxxxxxxxxxxxxxxxx) for ami-xxxxxxxxxxxxxxxxx from vol-xxxxxxxx
- Created by CreateImage(i-xxxxxxxxxxxxxxxxx) for ami-xxxxxxxxxxxxxxxxx
- Copied for DestinationAmi ami-xxxxxxxxxxxxxxxxx from SourceAmi ami-xxxxxxxxxxxxxxxxx for SourceSnapshot snap-xxxxxxxxxxxxxxxxx. Task created on xxxxxxx.
イメージ作成時にマネジメントコンソールやaws-cli,AWS BackupからAMIを作成する際にはSnapshotのDescriptionを入力できるような項目はありませんが、上記文言が記載されているようです。
(マネジメントコンソールやaws-cliにDescriptionを入力する欄はありますが、AMI側のDescriptionであって、Snapshot側のDescriptionを設定できるわけではない)
イメージ作成時はAWS側で上記文言が入力されているように思いますが、ここらへんの動作について何かドキュメント等で既定されているか調べてみましたが、特に見当たりません。
だいぶ昔からこういった体系であるようなので、どうしてもSnapshot側から取得できる情報だけで紐づくAMIを探したい場合はこの情報を利用するのも一つの方法かと思います。
ただ、どこかでこの動作が既定されているようでもないので、これから先動作が変更になる可能性もなくはない話かと思うので(だいぶ可能性は低いでしょうけど)、その点だけは頭の片隅には意識しつつ利用するのがいい気がします。
総評
AMIから取得できる情報を起点にSnapshotIdを取得するにはBlockDeviceMappingsから取得すればよい事がわかりました。
この場合は特に問題がありませんが。
SnapshotId側を起点にAMIを探そうとすると、明確にami-idといった項目は持っておらず。
SnapshotのDescription欄に使えそうな情報はありますが、この動作がどこかに規定されているかといえば記載がなく、少し利用に躊躇する状況かと思います。
このためSnapshot側を起点として探す場合は
- SnapshotのDescriptionをパースしてami-idを特定するか。
- describe-imagesで一旦AMI側の情報を全件取得してSnapshotIdとぶつける
- describe-imagesで全件取得するのが乱暴な場合は、フィルタオプションを活用して必要なデータを取得してSnapshotIdとぶつけてAMI側を探す
などの必要があります