JSONデータをjqコマンドで整形
最近、AWS CLI を使って RDS のステータスを確認する機会がありました。
そこで、データを見やすく整形できると業務が捗るなと思い、JSON データを整形する方法を探してみました。
ちなみに、RDS のステータスは以下のコマンドで確認できますが、めっちゃ情報量が多いです。
$ aws rds describe-db-instances
{
"DBInstances": [
{
"DBInstanceIdentifier": "database-1-xxxx-instance-1",
"DBInstanceClass": "db.t3.medium",
"Engine": "aurora-postgresql",
"DBInstanceStatus": "available",
"MasterUsername": "postgres",
"DBName": "xxxxxx",
"Endpoint": {
"Address": "xxxxx.rds.amazonaws.com",
"Port": 5432,
"HostedZoneId": "Z29XKXDKYMONMX"
},
"AllocatedStorage": 1,
"InstanceCreateTime": "2019-10-06T08:32:21.864000+00:00",
"PreferredBackupWindow": "03:34-04:04",
"BackupRetentionPeriod": 1,
"DBSecurityGroups": [],
"VpcSecurityGroups": [
{
"VpcSecurityGroupId": "sg-00000000000000000",
"Status": "active"
},
{
"VpcSecurityGroupId": "sg-00000000000000000",
"Status": "active"
}
],
"DBParameterGroups": [
{
"DBParameterGroupName": "aurora-postgresql-test-db",
"ParameterApplyStatus": "in-sync"
}
],
"AvailabilityZone": "eu-west-1a",
...
JSONの出力結果をフィルター
今回の目的は、特定のインスタンスの特定の項目だけチェックしたいときに、どうすればこのJSONファイルを見やすくできるかです。
フィルターをかける
特定のDBクラスターに限定したり、特定のDBエンジンに限定することができます。
$ aws rds describe-db-instances \
| jq '.DBInstances[] | select(.DBClusterIdentifier == "db_cluster_name")'
〇〇を含むというフィルターもかけられます。以下では postgresql を含むデータベースを検索できます。
$ aws rds describe-db-instances \
| jq '.DBInstances[] | select(.Engine | contains("postgresql"))'
結果は長くなってしまうので省略しましたが、これで欲しいリソースにだけ限定することができました。
続いては、JSONデータを見やすくしていきましょう。
JSONの出力結果を見やすく整形
欲しい項目(1個)を抽出します。
$ aws rds describe-db-instances \
| jq '.DBInstances[].DBInstanceIdentifier'
"koizumi-db-01-instance-1"
"koizumi-db-01-instance-1-eu-west-1a"
"koizumi-postgresql-01"
"koizumi-postgresql-02"
『 -r 』でダブルクオーテーション(")は外しましょう。
$ aws rds describe-db-instances \
| jq -r '.DBInstances[].DBInstanceIdentifier'
koizumi-db-01-instance-1
koizumi-db-01-instance-1-eu-west-1a
koizumi-postgresql-01
koizumi-postgresql-02
欲しい項目(複数個)だけをJSON形式で抽出します。
$ aws rds describe-db-instances \
| jq '.DBInstances[] | {DB_Instance: .DBInstanceIdentifier, Status: .DBInstanceStatus}'
{
"DB_Instance": "koizumi-db-01-instance-1",
"Status": "stopped"
}
{
"DB_Instance": "koizumi-db-01-instance-1-eu-west-1a",
"Status": "stopped"
}
{
"DB_Instance": "koizumi-postgresql-01",
"Status": "stopped"
}
{
"DB_Instance": "koizumi-postgresql-02",
"Status": "stopped"
}
フィルター & 整形
最後は、JSON形式のデータに対してフィルターと項目の抽出を同時にやってみたいと思います。
フィルター条件:Engine に"postgresql"を含む
抽出項目:DBInstanceIdentifier、DBInstanceStatus
aws rds describe-db-instances \
| jq '.DBInstances[] | select(.Engine | contains("postgresql")) | {DB_Instance: .DBInstanceIdentifier, Status: .DBInstanceStatus}'
{
"DB_Instance": "koizumi-postgresql-01",
"Status": "stopped"
}
{
"DB_Instance": "koizumi-postgresql-02",
"Status": "stopped"
}
今日はここまでです。