AWS Notes
5.6K subscribers
444 photos
42 videos
10 files
2.8K links
AWS Notes — Amazon Web Services Educational and Information Channel

Chat: https://xn--r1a.website/aws_notes_chat

Contacts: @apple_rom, https://www.linkedin.com/in/roman-siewko/
Download Telegram
Просто и со вкусом или --query в aws-cli

Очередная текущая задача, где в терминале нужно было быстро найти нужный 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

Тема флажка --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 бакета за декабрь месяц этого года (последние изменённые в диапазоне 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 --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

{
"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 агентами:

aws ssm describe-instance-information --query InstanceInformationList[*].ComputerName

SSM виртуалки плюс их 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...

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