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

 

 

TOP