Bem-vindo a quarta parte do guia. Você aprenderá a manipular o formato da saída e torná-la mais amigável.
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 aspastable
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.
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
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 |
+------------+-------------+--------+----------------+
Nesta parte do guia você aprendeu a:
--output table
para formatar a saída--output text
para eliminar aspas--output text
para eliminar gerar um CSVSe você gostou deste guia, não esqueça de deixar o seu comentário abaixo e o que gostaria ver nas próximas partes.