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