【小ネタ】AWS CLIのサンプルJSON出力オプションで上手にJMESPathしよう

aws-cli

西澤です。みんな大好きAWS CLIに、知っておくとちょっと便利なオプションが追加されていたので、ご紹介します。

サンプルJSON出力オプションとは?

下記リリースにある通り、バージョンは1.11.23以上である必要がありますので、まずAWS CLIのバージョンを確認しておきましょう。

  • 1.11.23
    • feature:--generate-cli-skeleton output: Add support for generating sample output for command

aws-cli/CHANGELOG.rst at develop · aws/aws-cli

$ aws --version
aws-cli/1.11.26 Python/2.7.10 Darwin/15.6.0 botocore/1.4.83

--generate-cli-skeletonオプションを使ったことが無い、という方は、大瀧さんの記事をご覧ください。今回はこちらの使い方には触れません。

--generate-cli-skeletonオプションは、特別なコマンドを除いてほぼ全てのコマンドのオプションとして使えるはずですので、AWS CLIのReferenceページから、いずれかのサブコマンドのヘルプをご確認ください。

または、任意のコマンドにhelpを追加して実行すれば、コマンドライン上でも確認可能です。

$ aws ec2 describe-regions help

ヘルプ内では、以下のように説明されています。

--generate-cli-skeleton (string) Prints a JSON skeleton to standard output without sending an API request. If provided with no value or the value input, prints a sample input JSON that can be used as an argument for --cli-input-json. If provided with the value output, it validates the command inputs and returns a sample output JSON for that command.

要するに、--generate-cli-skeletonオプションに続けて指定する文字列によって挙動が変わるようになったようです。

  • inputまたは指定なし ⇛ sample input jsonを出力(これまで通りの機能)
  • output ⇛ sample output jsonを出力(※新機能)

--generate-cli-skeleton outputの上手な使い方

このヘルプの説明だけを聞いても使い方がよくわからないと思いますが、--queryオプションで出力を工夫したい場合には非常に有効です。--queryオプション(JMESPath)を利用した出力制御については、下記の記事等を参考にしてください。

ここでは、RDSインスタンスの一覧を取得したいケースを考えてみます。

$ aws rds describe-db-instances

RDSインスタンスが複数起動している環境だと、長いjsonが返ってくるので、人間が読むにはちょっと辛い情報です。ここで、新機能を使ってみます。

$ aws rds describe-db-instances --generate-cli-skeleton output
{
    "Marker": "Marker",
    "DBInstances": [
        {
            "DBInstanceIdentifier": "DBInstanceIdentifier",
            "DBInstanceClass": "DBInstanceClass",
            "Engine": "Engine",
            "DBInstanceStatus": "DBInstanceStatus",
            "MasterUsername": "MasterUsername",
            "DBName": "DBName",
            "Endpoint": {
                "Address": "Address",
                "Port": 0,
                "HostedZoneId": "HostedZoneId"
            },
            "AllocatedStorage": 0,
            "InstanceCreateTime": "1970-01-01T00:00:00",
            "PreferredBackupWindow": "PreferredBackupWindow",
            "BackupRetentionPeriod": 0,
            "DBSecurityGroups": [
                {
                    "DBSecurityGroupName": "DBSecurityGroupName",
                    "Status": "Status"
                }
            ],
            "VpcSecurityGroups": [
                {
                    "VpcSecurityGroupId": "VpcSecurityGroupId",
                    "Status": "Status"
                }
            ],
            "DBParameterGroups": [
                {
                    "DBParameterGroupName": "DBParameterGroupName",
                    "ParameterApplyStatus": "ParameterApplyStatus"
                }
            ],
            "AvailabilityZone": "AvailabilityZone",
            "DBSubnetGroup": {
                "DBSubnetGroupName": "DBSubnetGroupName",
                "DBSubnetGroupDescription": "DBSubnetGroupDescription",
                "VpcId": "VpcId",
                "SubnetGroupStatus": "SubnetGroupStatus",
                "Subnets": [
                    {
                        "SubnetIdentifier": "SubnetIdentifier",
                        "SubnetAvailabilityZone": {
                            "Name": "Name"
                        },
                        "SubnetStatus": "SubnetStatus"
                    }
                ],
                "DBSubnetGroupArn": "DBSubnetGroupArn"
            },
            "PreferredMaintenanceWindow": "PreferredMaintenanceWindow",
            "PendingModifiedValues": {
                "DBInstanceClass": "DBInstanceClass",
                "AllocatedStorage": 0,
                "MasterUserPassword": "MasterUserPassword",
                "Port": 0,
                "BackupRetentionPeriod": 0,
                "MultiAZ": true,
                "EngineVersion": "EngineVersion",
                "LicenseModel": "LicenseModel",
                "Iops": 0,
                "DBInstanceIdentifier": "DBInstanceIdentifier",
                "StorageType": "StorageType",
                "CACertificateIdentifier": "CACertificateIdentifier",
                "DBSubnetGroupName": "DBSubnetGroupName"
            },
            "LatestRestorableTime": "1970-01-01T00:00:00",
            "MultiAZ": true,
            "EngineVersion": "EngineVersion",
            "AutoMinorVersionUpgrade": true,
            "ReadReplicaSourceDBInstanceIdentifier": "ReadReplicaSourceDBInstanceIdentifier",
            "ReadReplicaDBInstanceIdentifiers": [
                "String"
            ],
            "LicenseModel": "LicenseModel",
            "Iops": 0,
            "OptionGroupMemberships": [
                {
                    "OptionGroupName": "OptionGroupName",
                    "Status": "Status"
                }
            ],
            "CharacterSetName": "CharacterSetName",
            "SecondaryAvailabilityZone": "SecondaryAvailabilityZone",
            "PubliclyAccessible": true,
            "StatusInfos": [
                {
                    "StatusType": "StatusType",
                    "Normal": true,
                    "Status": "Status",
                    "Message": "Message"
                }
            ],
            "StorageType": "StorageType",
            "TdeCredentialArn": "TdeCredentialArn",
            "DbInstancePort": 0,
            "DBClusterIdentifier": "DBClusterIdentifier",
            "StorageEncrypted": true,
            "KmsKeyId": "KmsKeyId",
            "DbiResourceId": "DbiResourceId",
            "CACertificateIdentifier": "CACertificateIdentifier",
            "DomainMemberships": [
                {
                    "Domain": "Domain",
                    "Status": "Status",
                    "FQDN": "FQDN",
                    "IAMRoleName": "IAMRoleName"
                }
            ],
            "CopyTagsToSnapshot": true,
            "MonitoringInterval": 0,
            "EnhancedMonitoringResourceArn": "EnhancedMonitoringResourceArn",
            "MonitoringRoleArn": "MonitoringRoleArn",
            "PromotionTier": 0,
            "DBInstanceArn": "DBInstanceArn",
            "Timezone": "Timezone"
        }
    ]
}

--generate-cli-skeleton outputを指定することで、1件のみの出力サンプルが表示されました。この中から、--queryオプションで表示させたい項目だけを取り出していきます。実際にはこの作業をする際に、JSONを眺めつつの試行錯誤の作業が必要となりますが、このサンプル表示のおかげで非常に見通し良く作業をすることができるはずです。

$ aws rds describe-db-instances --generate-cli-skeleton output \
    --query "DBInstances[].[DBInstanceIdentifier,DBInstanceClass,Endpoint.Address,AllocatedStorage]" \
    --output table
-------------------------------------------------------------
|                    DescribeDBInstances                    |
+-----------------------+-------------------+----------+----+
|  DBInstanceIdentifier |  DBInstanceClass  |  Address |  0 |
+-----------------------+-------------------+----------+----+

ある程度の確認ができたところで、--generate-cli-skeleton outputの指定を解除して実行してみます。

$ aws rds describe-db-instances \
    --query "DBInstances[].[DBInstanceIdentifier,DBInstanceClass,Endpoint.Address,AllocatedStorage]" \
    --output table
--------------------------------------------------------------------------------------------------------------------
|                                                DescribeDBInstances                                               |
+---------------------+---------------+---------------------------------------------------------------------+------+
|  dbdbdbdbdb         |  db.t2.micro  |  dbdbdbdbdb.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com           |  10  |
|  aaaaaaaaaaaaaaa    |  db.r3.xlarge |  aaaaaaaaaaaaaaa.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com      |  1   |
|  bbbbbbbbbbbbbb     |  db.r3.xlarge |  bbbbbbbbbbbbbb.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com       |  1   |
|  cccccccccccccc     |  db.t2.medium |  cccccccccccccc.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com       |  1   |
|  ddddddddddddddddddd|  db.r3.xlarge |  ddddddddddddddddddd.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com  |  1   |
|  eeeeeeeeeeeeeeeeeee|  db.r3.xlarge |  eeeeeeeeeeeeeeeeeee.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com  |  1   |
|  fffffffffffffffffff|  db.t2.medium |  fffffffffffffffffff.xxxxyyyyzzzz.ap-northeast-1.rds.amazonaws.com  |  1   |
+---------------------+---------------+---------------------------------------------------------------------+------+

 意図した出力を得られることができました!    もっと詳しくAWS CLIを使いこなしたい方は、AWS re:Invent 2016の下記セッション動画も見ておくと為になるノウハウが満載ですので、ぜひご覧ください(初心者向けではありませんのでご注意を)。

  • AWS re:Invent 2016: The Effective AWS CLI User (DEV402)

まとめ

新機能としてリリースされたサンプルJSON出力機能をご紹介しました。--queryオプションで試行錯誤するときに活躍しますので、ぜひ試してみてください。

どこかの誰かのお役に立てば嬉しいです。

AWS Cloud Roadshow 2017 福岡