エンコードされたJSONオブジェクトを含むJSONファイルから値を抽出する方法

エンコードされたJSONオブジェクトを含むJSONファイルから値を抽出する方法

コマンド出力:aws s3api get-bucket-policy --bucket bucketname

{
    "Policy": "{\"Version\":\"2012-10-17\",\"Id\":\"S3SecureTransportPolicy\",\"Statement\":[{\"Sid\":\"ForceSSLOnlyAccess\",\"Effect\":\"Deny\",\"Principal\":{\"AWS\":\"*\"},\"Action\":\"s3:*\",\"Resource\":\"arn:aws:s3:::amn/*\",\"Condition\":{\"Bool\":{\"aws:SecureTransport\":\"false\"}}},{\"Sid\":\"AWSCloudTrailAclCheck20150319\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"cloudtrail.amazonaws.com\"},\"Action\":\"s3:GetBucketAcl\",\"Resource\":\"arn:aws:s3:::amn\"},{\"Sid\":\"AWSCloudTrailWrite20150319\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"cloudtrail.amazonaws.com\"},\"Action\":\"s3:PutObject\",\"Resource\":\"arn:aws:s3:::amn/AWSLogs/405042254276/*\",\"Condition\":{\"StringEquals\":{\"s3:x-amz-acl\":\"bucket-owner-full-control\"}}}]}"
}

aws:SecureTransportこのJSONでは、キーに関連付けられた値(この場合false)とキーに関連付けられた値をgrep(抽出)する必要がありますEffect

頑張った

aws s3api get-bucket-policy --bucket amn |
    grep -Po '"Bool": *\K"[^"]*"'

そして

aws s3api get-bucket-policy --bucket amn |
    sed 's/.*\(aws:SecureTransport\)[^:]*:"\([0-9]*\)"'

どうすればいいですか?

ベストアンサー1

コマンドから取得したJSON文書に、他のエンコードされたJSON文書が含まれているようです。このエンコードされたドキュメントからデータをインポートしたいようです。

内部文書を入手するには、次のものを使用できますjq

aws ... |
jq -r '.Policy'

Effectキーを含むビットからキー値を取得するには、aws:SecureTransport文書を再解析する必要があります。

aws ... |
jq -r '.Policy' |
jq -r '.Statement[] | select(.Condition.Bool."aws:SecureTransport").Effect'

最後のjq呼び出しは配列のすべての要素を繰り返して、名前付きキーを持つStatement要素を探します.Condition.Bool."aws:SecureTransport"。次に、Effectその要素に関連するキー値を取得しますStatement

データに対してこの出力値を実行しますDeny

.Condition.Bool."aws:SecureTransport"false文書でそのキーの値が必要な場合は、.Condition.Bool."aws:SecureTransport"上記を使用してください.Effect

または、2番目の呼び出しの代わりにfromjsonディレクティブを使用してください。jqjq

aws ... |
jq -r '.Policy | fromjson | .Statement[] | select(.Condition.Bool."aws:SecureTransport").Effect'

ここでは、fromjsonエンコードされたJSONドキュメントがデコードされ、後処理ステップに渡されます。


ちなみに、内部的にエンコードされたJSONドキュメントは次のようになります(aws ... | jq -r '.Policy | fromjson')。

{
  "Version": "2012-10-17",
  "Id": "S3SecureTransportPolicy",
  "Statement": [
    {
      "Sid": "ForceSSLOnlyAccess",
      "Effect": "Deny",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::amn/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    },
    {
      "Sid": "AWSCloudTrailAclCheck20150319",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::amn"
    },
    {
      "Sid": "AWSCloudTrailWrite20150319",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudtrail.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::amn/AWSLogs/405042254276/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    }
  ]
}

おすすめ記事