Formatando a Saída

Introdução

Bem-vindo a quarta parte do guia. Você aprenderá a manipular o formato da saída e torná-la mais amigável.

Configurando o Formato de Saída

O AWS CLI oferece algumas formas de saída. Por padrão o formato JSON é usado, mas você pode forçar uma saída em outro formato para facilitar uma tarefa (--output).

  • --output table - apresentar de uma maneira mais “bonita” e amigável
  • --output text - útil para tirar aspas

Usando a Saída table

Suponha que você queria dar uma olhada rápida nas instâncias presentes na sua conta da AWS, você pode recorrer ao aws ec2 describe-instances.

aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-1ecaxxxx",
                    "InstanceId": "i-e4cdxxxx",
                    "InstanceType": "t2.micro",
                    "KeyName": "my-key",
                    "LaunchTime": "2020-01-22T11:00:35+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-1b",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-52-22.ec2.internal",
                    "PrivateIpAddress": "172.31.52.22",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    },
                    "StateTransitionReason": "User initiated (2021-01-22 19:00:36 GMT)",
                    "SubnetId": "subnet-f6f56dddd",
                    "VpcId": "vpc-0ed7abab",
                    "Architecture": "x86_64",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "AttachTime": "2016-04-30T22:02:18+00:00",
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-5c732121"
                            }
                        }
                    ],
//...
            "OwnerId": "000000000000",
            "ReservationId": "r-4f5babab"
        },
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-1853ac65",
                    "InstanceId": "i-09f1d3b41784f896b",
                    "InstanceType": "t2.medium",
                    "KeyName": "my-key",
                    "LaunchTime": "2018-11-23T17:41:26+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "us-east-1c",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-172-31-62-1.ec2.internal",
                    "PrivateIpAddress": "172.31.62.1",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    },
                    "StateTransitionReason": "User initiated (2019-03-09 22:35:52 GMT)",
                    "SubnetId": "subnet-f6f55xxx",
                    "VpcId": "vpc-0ed79xxx",
                    "Architecture": "x86_64",
                    "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "AttachTime": "2018-04-04T03:17:11+00:00",
//...
            "OwnerId": "000000000000",
            "ReservationId": "r-xxxxxxx91a69f17a"
        }
    ]

Parece bem poluído e difícil de conseguir o que estamos buscando, uma visão rápida e fácil das instâncias. Usando o que você aprendeu sobre --query, talvez possamos limpar um pouco a saída, mostrando somente InstanceId, InstanceType, PublicIpAddress, State e Tags.Name.

aws ec2 describe-instances \
       --query "Reservations[*].Instances[*].{IP:PublicIpAddress,ID:InstanceId,Type:InstanceType,State:State.Name,Name:Tags[0].Value}"
[
    [
        {
            "IP": null,
            "ID": "i-1234567890xxxxxxx",
            "Type": "t2.micro",
            "State": "stopped",
            "Name": "Instance A"
        }
    ],
    [
        {
            "IP": null,
            "ID": "i-xxxxxxx1234567890",
            "Type": "t2.medium",
            "State": "stopped",
            "Name": "Instance B"
        }
    ],
    [
        {
            "IP": null,
            "ID": "i-xxxxxxx1234567891",
            "Type": "t2.micro",
            "State": "stopped",
            "Name": "WindowsA"
        }
    ],
    [
        {
            "IP": null,
            "ID": "i-1234567890yyyyyyy",
            "Type": "t2.small",
            "State": "stopped",
            "Name": "WindowsB"
        }
    ],
]

Ficou mais claro, mas será que dá para ser melhor? Vamos tentar com a saída --output table.

aws ec2 describe-instances \
       --query "Reservations[*].Instances[*].{IP:PublicIpAddress,ID:InstanceId,Type:InstanceType,State:State.Name,Name:Tags[0].Value}" \
       --output table
--------------------------------------------------------------------------------------
|                                       DescribeInstances                            |
+---------------------+-------+-----------------------------+----------+-------------+
|         ID          |  IP   |                 Name        |  State   |    Type     |
+---------------------+-------+-----------------------------+----------+-------------+
|  i-1234567890xxxxxxx|  None |  InstanceA                  |  stopped |  t2.micro   |
|  i-xxxxxxx1234567890|  None |  InstanceB                  |  stopped |  t2.medium  |
|  i-xxxxxxx1234567891|  None |  WindowsA                   |  stopped |  t2.micro   |
|  i-1234567890yyyyyyy|  None |  WindowsB                   |  stopped |  t2.small   |
+---------------------+-------+-----------------------------+----------+-------------+

Ficou muito melhor agora. Esta é uma forma de como --output table pode ser útil.

Usando a Saída text

Quando você usa --query com a saída JSON e começa a compor comandos, uma simples aspas pode ser bem inconveniente. Por exemplo, suponha que você queira criar uma VPC com uma subrede, neste caso, você precisará de um comando para criar a VPC (ec2 create-vpc) e outro para criar uma subrede (ec2 create-subnet). Vamos tentar fazer isto encadeando os comandos.

Primeiro, crie uma VPC e guarde o VPC ID em uma variável para poder usá-lo na criação da subrede.

VPC_ID=`aws ec2 create-vpc \
    --cidr-block 10.0.0.0/16 \
    --query "Vpc.VpcId"`

echo "VPC_ID='$VPC_ID'"
VPC_ID='"vpc-000400aba1801d7ef"'

DICA: Sempre use aspas ao imprimir valores de variáveis na console, pois um simples espaço ou caracter especial pode não ficar oculto e gerar um problema difícil de ser identificado.

Agora, crie a subrede usando valor armazenado em VPC_ID.

aws ec2 create-subnet \
    --vpc-id $VPC_ID \
    --cidr-block 10.0.1.0/24
An error occurred (InvalidVpcID.NotFound) when calling the CreateSubnet operation: The vpc ID '"vpc-000400aba1801d7ef"' does not exist

Oooops, parece que o VPC ID está errado e tudo por conta da saída que inclui aspas duplas. Uma forma de tratar isto é removendo elas com | tr -d '"', mas --output text pode ser mais simples.

VPC_ID=`aws ec2 create-vpc \
    --cidr-block 10.0.0.0/16 \
    --query "Vpc.VpcId" \
    --output text`

echo "VPC_ID='$VPC_ID'"
VPC_ID='vpc-000000aba1801d7ef'
aws ec2 create-subnet \
    --vpc-id $VPC_ID \
    --cidr-block 10.0.1.0/24

Outro exemplo, é gravar um arquivo texto no formato “CSV-like”.

aws ec2 describe-instances \
    --query "Reservations[*].Instances[*].{IP:PublicIpAddress,ID:InstanceId,Type:InstanceType,State:State.Name,Name:Tags[0].Value}" \
    --output text | sed 's/      /,/g'
i-e4cdxxxx,None,InstaciaA,stopped,t2.micro
i-09f1d3b417xxxxxxx,None,InstaciaB,stopped,t2.medium
i-036b10c2c5xxxxxxx,None,WindowsA,stopped,t2.micro
i-0742f2c64bxxxxxxx,None,WindowsB,stopped,t2.small

Praticando

Agora que já aprendeu a usar o commando --output, monte um comando que liste todos as subredes na conta. Exemplo da saída.

------------------------------------------------------
|                      Comando                       |
+------------+-------------+--------+----------------+
|     AZ     |   Estado    | N_Ips  |      VPC       |
+------------+-------------+--------+----------------+
|  us-east-1c|  available  |  250   |  vpc-aaaaaaaa  |
|  us-east-1f|  available  |  4091  |  vpc-bbbbbbbb  |
|  us-east-1e|  available  |  4091  |  vpc-bbbbbbbb  |
|  us-east-1b|  available  |  4090  |  vpc-bbbbbbbb  |
|  us-east-1d|  available  |  4086  |  vpc-bbbbbbbb  |
|  us-east-1a|  available  |  4089  |  vpc-cccccccc  |
|  us-east-1b|  available  |  4090  |  vpc-dddddddd  |
|  us-east-1a|  available  |  249   |  vpc-dddddddd  |
|  us-east-1a|  available  |  4090  |  vpc-eeeeeeee  |
|  us-east-1c|  available  |  4085  |  vpc-eeeeeeee  |
+------------+-------------+--------+----------------+

Fechando

Nesta parte do guia você aprendeu a:

  • usar a opção --output table para formatar a saída
  • usar a opção --output text para eliminar aspas
  • usar a opção --output text para eliminar gerar um CSV

Se você gostou deste guia, não esqueça de deixar o seu comentário abaixo e o que gostaria ver nas próximas partes.

Referências


Comentários

comments powered by Disqus