Просто и со вкусом или --query в aws-cli
Очередная текущая задача, где в терминале нужно было быстро найти нужный VPC ID по известному диапазону адресов для неё (CIDR block).
Выполняем очевидную команду для этого:
aws ec2 describe-vpcs
На выходе обычно простыня параметров, где даже замучаешься скроллировать и выискивать нужное. А если нужно выбрать, не ошибиться или просто сделать красиво (для себя)?
Для этого многие ставят
Итак, смотрим верхние строчки результата работы:
Нас интересуют элементы VpcId и CidrBlock, для этого перебираем все выведенные Vpcs, получается следующая конструкция:
aws ec2 describe-vpcs
Уже хорошо, лишь то, что нужно, можно довольствоваться. А можно сделать ещё и красиво:
aws ec2 describe-vpcs
#query
Очередная текущая задача, где в терминале нужно было быстро найти нужный VPC ID по известному диапазону адресов для неё (CIDR block).
Выполняем очевидную команду для этого:
aws ec2 describe-vpcs
На выходе обычно простыня параметров, где даже замучаешься скроллировать и выискивать нужное. А если нужно выбрать, не ошибиться или просто сделать красиво (для себя)?
Для этого многие ставят
jq, который сделает что угодно с json выводом. Однако не нужно забывать про флажок --query, который из коробки есть в любой #aws_cli.Итак, смотрим верхние строчки результата работы:
{
"Vpcs": [
{
"VpcId": "vpc-04bec1a347f431036",
...
"CidrBlock": "10.11.0.0/16",
...Нас интересуют элементы VpcId и CidrBlock, для этого перебираем все выведенные Vpcs, получается следующая конструкция:
aws ec2 describe-vpcs
--query Vpcs[*].[VpcId,CidrBlock][
[
"vpc-04bec1a347f431036",
"10.11.0.0/16"
],
[
"vpc-6b9b1111",
"172.31.0.0/16"
]
]
Уже хорошо, лишь то, что нужно, можно довольствоваться. А можно сделать ещё и красиво:
aws ec2 describe-vpcs
--query Vpcs[*].[VpcId,CidrBlock] --output table#query
aws cli + query + table headers + tags
Тема флажка
Одна из самых "отзывчивых" команд:
aws ec2 describe-instances
На выходе бывает вывод на десятки экранов. А вот нужно найти нужные инстансы и их внутренние айпишники. То есть среди этой простыни интересуют лишь следующие строчки:
Просто табличка
Формируем запрос по ним, учитывая вложенность и добавяем вывод в виде таблицы (флажок --output table):
aws ec2 describe-instances --query "
Получилось неплохо (см.первый вывод на картинке), однако сложно сориентироваться, т.к. хотелось бы отдельной колонки под каждый элемент.
Ещё одна колонка
Будем использовать секретную конструкцию вида
aws ec2 describe-instances --query
Другое дело! (см. второй вывод на картинке) Всё чётко, не спутаешь. Однако, конечно, по айдишникам инстансов гадать очень сложно - хорошо бы видеть их названия. Что ж - добавим тэги.
Вывод тэгов
Тэгов может быть много, нас интересует стандартный тэг
Но она на выходе даёт массив, потому добавляем к этому "палку" и вывод первого значения:
|
Итоговый запрос
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{IP:NetworkInterfaces[0].PrivateIpAddresses[0].PrivateIpAddress,MyInst:InstanceId,MyName
Лепота! (см. последний вывод на картинке) Вот теперь полный порядок.
Тема флажка
--query в #aws_cli не раз здесь поднималась (её удобно тут искать по тэгу #query, если хотите почитать или просто скопировать и вставить, как я). Конструкции бывают сложные, быстро забываются, а получается красиво, потому залогирую ещё одну.Одна из самых "отзывчивых" команд:
aws ec2 describe-instances
На выходе бывает вывод на десятки экранов. А вот нужно найти нужные инстансы и их внутренние айпишники. То есть среди этой простыни интересуют лишь следующие строчки:
{ "Reservations": [ { "Instances": [ {... "NetworkInterfaces": [ {... "PrivateIpAddresses": [ { "PrivateDnsName": "ip-10-11-11-211.ec2.internal", "PrivateIpAddress": "10.11.11.211",... "InstanceId": "i-09fedeb7686da6be5",...Просто табличка
Формируем запрос по ним, учитывая вложенность и добавяем вывод в виде таблицы (флажок --output table):
aws ec2 describe-instances --query "
Reservations[].Instances[].[NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress,InstanceId]" --output tableПолучилось неплохо (см.первый вывод на картинке), однако сложно сориентироваться, т.к. хотелось бы отдельной колонки под каждый элемент.
Ещё одна колонка
Будем использовать секретную конструкцию вида
{MyTableHeader:JsonItem}. Из-за этого переходим на одинарные кавычки и получаем:aws ec2 describe-instances --query
'Reservations[*].Instances[*].{IP:NetworkInterfaces[0].PrivateIpAddresses[0].PrivateIpAddress,MyInst:InstanceId}' --output tableДругое дело! (см. второй вывод на картинке) Всё чётко, не спутаешь. Однако, конечно, по айдишникам инстансов гадать очень сложно - хорошо бы видеть их названия. Что ж - добавим тэги.
Вывод тэгов
Тэгов может быть много, нас интересует стандартный тэг
Name, потому в запрос добавим ещё одну колонку с именем инстанса. Для встроенного поиска по Name используем хитрую конструкцию:[?Key==`Name`]Но она на выходе даёт массив, потому добавляем к этому "палку" и вывод первого значения:
|
[0].ValueИтоговый запрос
aws ec2 describe-instances --query 'Reservations[*].Instances[*].{IP:NetworkInterfaces[0].PrivateIpAddresses[0].PrivateIpAddress,MyInst:InstanceId,MyName
:Tags[?Key==`Name`]|[0].Value}' --output tableЛепота! (см. последний вывод на картинке) Вот теперь полный порядок.
Найти файлы S3 бакета за декабрь месяц этого года (последние изменённые в диапазоне
aws s3api list-objects-v2 --max-items 20 --bucket my-aws-notes --query "Contents[?LastModified>='2019-12-01'] | [?LastModified<='2020-01-01'].{ File: Key, LastDate: LastModified }" --output table
#query
2019-12-01 - 2020-01-01), чтоб, если что, не слишком много, отобразить лишь 20 штук (--max-items 20), для красоты вывести табличкой (--output table) с указанием названий колонок File и LastDate (.{ File: Key, LastDate: LastModified }):aws s3api list-objects-v2 --max-items 20 --bucket my-aws-notes --query "Contents[?LastModified>='2019-12-01'] | [?LastModified<='2020-01-01'].{ File: Key, LastDate: LastModified }" --output table
#query
Работа с DynamoDB из aws-cli
scan
Предположим, в таблице много билдов разных проектов. Получим все записи таблицы с ограничением максимум 100 значений.
aws dynamodb scan --table-name jenkins
Это будут все проекты, можно вывести лишь нужный, например,
aws dynamodb scan --table-name jenkins --query
query
Сделать выборку по проекту
aws dynamodb query --table-name jenkins --max-items 100 --key-condition-expression
Как найти последнее значение билда (не обязательно совпадающее с количеством записей)? Для этого сделаем реверсивную выборку и получим последний элемент, выделив его с помощью #query и сделав таблицу:
aws dynamodb query --table-name jenkins --key-condition-expression
delete-item
Удалим билд
aws dynamodb delete-item --table-name jenkins --key
delete-table
Удалим таблицу .
aws dynamodb delete-table --table-name jenkins
#DynamoDB #aws_cli
scan
Предположим, в таблице много билдов разных проектов. Получим все записи таблицы с ограничением максимум 100 значений.
aws dynamodb scan --table-name jenkins
--max-items 100Это будут все проекты, можно вывести лишь нужный, например,
aws-notes с помощью #query:aws dynamodb scan --table-name jenkins --query
'Items[?jenkinsProject.S==`aws-notes`]'query
Сделать выборку по проекту
jenkinsProject - получить все билды:aws dynamodb query --table-name jenkins --max-items 100 --key-condition-expression
"jenkinsProject = :jp" --expression-attribute-values '{":jp": { "S": "aws-notes" } }'Как найти последнее значение билда (не обязательно совпадающее с количеством записей)? Для этого сделаем реверсивную выборку и получим последний элемент, выделив его с помощью #query и сделав таблицу:
aws dynamodb query --table-name jenkins --key-condition-expression
"jenkinsProject = :jp" --expression-attribute-values '{":jp": { "S": "aws-notes" } }' --no-scan-index-forward --max-items 1 --query Items[].buildNumber.N[] --output table-------
|Query|
+-----+
| 3 |
+-----+
delete-item
Удалим билд
1 из таблицы:aws dynamodb delete-item --table-name jenkins --key
'{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"} }'delete-table
Удалим таблицу .
aws dynamodb delete-table --table-name jenkins
#DynamoDB #aws_cli
Чтобы получить информацию о мастер-аккаунте, необязательно для этого лезть в мастер организации, можно в любом из аккаунтов выполнить:
aws organizations describe-organization
Т.е. это работает и в мастере, и в любом из под-аккаунтов.
А для получения в каком-то скрипте конкретно AWS ID мастера используем #query:
aws organizations describe-organization --query Organization.MasterAccountId --output text
#Organizations #aws_cli
aws organizations describe-organization
{
"Organization": {
"Id": "o-grkq8ea51d",
"Arn": "arn:aws:organizations::221433848249:organization/o-grkq8ea51d",
"FeatureSet": "ALL",
"MasterAccountArn": "arn:aws:organizations::221433848249:account/o-grkq8ea51d/221433848249",
"MasterAccountId": "221433848249",
"MasterAccountEmail": "admin@aws.notes",
"AvailablePolicyTypes": [
{
"Type": "SERVICE_CONTROL_POLICY",
"Status": "ENABLED"
}
]
}
}Т.е. это работает и в мастере, и в любом из под-аккаунтов.
А для получения в каком-то скрипте конкретно AWS ID мастера используем #query:
aws organizations describe-organization --query Organization.MasterAccountId --output text
221433848249#Organizations #aws_cli
Вывести имена виртуалок с SSM агентами:
SSM виртуалки плюс их IP-адреса:
Нужная виртуалка с конкретным IP с выводом чисто текста (для скрипта):
#query #SSM
aws ssm describe-instance-information --query InstanceInformationList[*].ComputerNameSSM виртуалки плюс их IP-адреса:
aws ssm describe-instance-information --query InstanceInformationList[*].[ComputerName,IPAddress]Нужная виртуалка с конкретным IP с выводом чисто текста (для скрипта):
aws ssm describe-instance-information --query "InstanceInformationList[?IPAddress=='10.12.13.162'].ComputerName" --output text#query #SSM
Получить в командной строке время создания текущего AWS аккаунта в формате мм/дд/гг:
AWS_ID=$(aws sts get-caller-identity --query Account --output text)
CREATED=$(aws organizations describe-account --account-id $AWS_ID --query Account.JoinedTimestamp --output text)
date -d $CREATED '+%D'
#aws_cli #queryНайти сертификаты ACM...
... показать лишь выданные (валидные)...
...вывести ARN сертификата для нужного домена
...в виде готового значения (а не JSON)...
Итого:
#query #ACM
aws acm list-certificates... показать лишь выданные (валидные)...
--certificate-statuses ISSUED...вывести ARN сертификата для нужного домена
my.domain...--query "CertificateSummaryList[?DomainName=='my.domain'].CertificateArn"...в виде готового значения (а не JSON)...
--output textИтого:
aws acm list-certificates --certificate-statuses ISSUED --query "CertificateSummaryList[?DomainName=='my.domain'].CertificateArn" --output text#query #ACM