4

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

jqaws-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'
4

1 に答える 1