AWSコマンドラインツールCLIにはfiltersオプションは付いていますが、偶にうまく使えない場合もあります。この問題に遭って、フィルターの代わりにJMESPathを適用して解決しました。
ボリューム3つが付いているインスタンスを立ち上がって、次のCLIコマンドでインスタンス情報を出力する。
aws ec2 describe-instances --instance-ids YOUR_INSTANCE_ID
下記のような結果を得られました。
{ "Reservations": [ { "OwnerId": YOUR_ACCOUNT_ID, ... "Hypervisor": "xen", "BlockDeviceMappings": [ { "DeviceName": "/dev/xvda", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-683d0d76", "AttachTime": "2015-03-09T04:57:09.000Z" } }, { "DeviceName": "/dev/sdb", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-373d0d29", "AttachTime": "2015-03-09T04:57:09.000Z" } }, { "DeviceName": "/dev/sdc", "Ebs": { "Status": "attached", "DeleteOnTermination": true, "VolumeId": "vol-4c3d0d52", "AttachTime": "2015-03-09T04:57:09.000Z" } } ], "Architecture": "x86_64", ... }
次は、下記コマンドでディバイス/dev/sdbのボリュームIDをとろうと思いますが、
aws ec2 describe-instances --instance-ids i-a62dd853 --filters "Name=block-device mapping.device-name,Values=\/dev\/sdb" --query Reservations[].Instances[].BlockDeviceMappings[].Ebs[].VolumeId[] --output text
結局、三つボリュームIDを全部出力されました。
vol-683d0d76 vol-373d0d29 vol-4c3d0d52
ということはフィルターは効かなかった。ちゃんとAWS CLIマニュアルに従ってコマンドを叩きましたが、何故ダメなのちょっといらいらしましたが、最後JMESPathのおかげで問題を解決しました。
JSONのパースには、jqというツールが有名である。query文の中に条件式を挿入し、構文は下記になります。
aws ec2 describe-instances --instance-ids i-a62dd853 --query 'Reservations[].Instances[].BlockDeviceMappings[?DeviceName==`/dev/sdb`].Ebs[].VolumeId[]' --output text
で、正しい結果が取得できました。
vol-373d0d29