AWS CLI を使用して、BlockDeviceMappings
このような特定のインスタンスの配列を取得しています。
awscli クエリ
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" \
--output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]
出力
[
[
[
{
"DeviceName": "/dev/xvda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-xvda-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdb",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdb-xxxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdc",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdc-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdd",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdd-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
}
]
]
]
希望の出力
/dev/sdb
、/dev/sdc
およびのボリューム ID のリストが/dev/sdd
それぞれ必要です。
vol-sdb-xxxxx, vol-sdc-xxxx, vol-sdd-xxxxx
jq
aws-cli 出力を にパイプして解析を実行しようとしましたjq
が、「jq: エラー: 文字列で配列にインデックスを付けることはできません」というメッセージが引き続き表示されます。
また、DeviceName
配列の 2 番目、3 番目、4 番目の要素が正しい順序であると想定できる順序で常に来るとは限らない可能性があるため、必要なボリューム ID の出力を確認したいと思います。可能な場合は、常に sdb、sdc、sdd の形式です。
更新 1
ジェフの提案の両方を試した後:
提案1
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq 'select(.DeviceName? | test("/dev/sd[bcd]")) | .Ebs.VolumeId'
error: test is not defined
select(.DeviceName? | test("/dev/sd[bcd]")) | .Ebs.VolumeId 1 compile error
[Errno 32] Broken pipe
提案 2
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq 'select(
.DeviceName? as $dn
| ["b","c","d"]
| map($dn == "/dev/sd\(.)")
| any
)
| .Ebs.VolumeId'
出力なし
私は最新だと信じているjq-1.4を使用しています。
更新 2
以下は jq-1.4 で動作します。
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq '.. | select(.DeviceName? as $dn | ["b","c","d"] | map($dn == "/dev/sd\(.)") | any) | .Ebs.VolumeId'