AWS Notes
4.74K subscribers
228 photos
30 videos
10 files
2.41K links
AWS Notes — Amazon Web Services Educational and Information Channel

Chat: https://t.me/aws_notes_chat

Contacts: @apple_rom, https://www.linkedin.com/in/roman-siewko/
Download Telegram
Работа с DynamoDB из aws-cli

Примеров работы из aws-cli с DynamoDB кот наплакал, особенно, когда нужны простые вещи, но выходящие за рамки примеров из документации.


create-table

Создадим простенькую таблицу для условного Jenkins, куда будем писать для каждого проекта (jenkinsProject) свои переменные для каждого билда (buildNumber). Для уменьшения стоимости (хоть и так будет около нуля) вместо дефолтного режима (PROVISIONED) сразу включим (PAY_PER_REQUEST).

Здесь и дальше предполагается, что настроен ~/.aws/config , иначе к каждому запросу добавляем регион --region eu-west-1 (и/или --profile my-profile)

aws dynamodb create-table \
--table-name jenkins \
--attribute-definitions \
AttributeName=jenkinsProject,AttributeType=S \
AttributeName=buildNumber,AttributeType=N \
--key-schema \
AttributeName=jenkinsProject,KeyType=HASH \
AttributeName=buildNumber,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST



put-item

Запишем в таблицу значение для условного проекта aws-notes и билда номер 1 из ветки feature-1. Для получения текущего timestamp вручную выполним:

date +%s
1578575096

Получение timestamp можно добавить и сразу в команду, но так наглядней.

Сделаем выполнение сразу из строки, а не через отдельный файл для JSON (из-за этого не получится разбить строчку обратным слэшем - поэтому получится длинная):

aws dynamodb put-item --table-name jenkins --item '{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"}, "imageTag": {"S": "feature-1.build-1"}, "imageRepository": {"S": "123166313456.dkr.ecr.eu-west-1.amazonaws.com/aws-notes"}, "date": {"S": "2020-01-09 13:04"}, "timestamp": {"N": "1569486943"}, "branch": {"S": "feature-1"} }'

Переменных добавлено сразу много разных и больше условно, чисто для примера и чтобы удобней выбрать, удалив лишние.


update-item

Обновим билд 1, исправив в нём тэг и ветку (заменим 1 на ):

aws dynamodb update-item --table-name jenkins --key '{ "jenkinsProject": {"S": "aws-notes"}, "buildNumber": {"N": "1"} }' --update-expression "SET #T = :t, #B = :b" --expression-attribute-names '{ "#T":"imageTag", "#B":"branch" }' --expression-attribute-values '{ ":t": {"S": "feature-1a.build-1"}, ":b": {"S": "feature-1a"} }'


...продолжение следует

#DynamoDB #aws_cli
Работа с 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
Single-Table Design with DynamoDB

Хорошая разъясняющая статья по #best_practices архитектуры для DynamoDB:

https://www.alexdebrie.com/posts/dynamodb-single-table/

Подробно описаны свойства и преимущества single-table архитектуры, а также случаи, когда это неуместно.

#DynamoDB #design
NoSQL Workbench for Amazon DynamoDB:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.html

Клиентское приложение для разработчиков, чтобы работать с DynamoDB. Есть версия под MacOS и Windows (линуксоиды в пролёте :/ ).

Описание функционала NoSQL Workbench (ещё когда оно было в Preview):

https://aws.amazon.com/blogs/aws/nosql-workbench-for-amazon-dynamodb-available-in-preview/

#DynamoDB
​​Пример query в aws cli с фильтрацией:

aws dynamodb query --table-name jenkins \
--key-condition-expression "Project = :jp" \
--filter-expression "#repo = :ecr" \
--expression-attribute-names '{"#repo": "Repo"}' \
--expression-attribute-values '{
":jp": { "S": "my-service" },
":ecr": { "S": "888888888888.dkr.ecr.eu-central-1.amazonaws.com/my-repo" }
}'

Как-то писал, что подобных конкретных примеров по DynamoDB мало, потому стоит порекомендовать хороший сайт по ней:

https://www.dynamodbguide.com

В частности, добавлю, что его автор, Alex DeBrie (AWS Data Hero), недавно выпустил полноценную книжку:

https://www.dynamodbbook.com/

Её шибко хвалят известные господа в данной области, так что наверняка стоит прочитать, если это ваша тема или у вас много DynamoDB в проекте.

#DynamoDB #aws_cli
​​В консоли DynamoDB появился PartiQL редактор (см. картинку).

PartiQL ­- язык, запиленный Амазоном в 2019-м году для возможности работать в SQL-подобном стиле с данными любого формата:

https://aws.amazon.com/ru/blogs/opensource/announcing-partiql-one-query-language-for-all-your-data/

Или на русском на Хабре:

https://habr.com/ru/news/t/463253/

Кроме того, теперь любые изменения таблиц DynamoDB можно стримить в Kinesis.

#DynamoDB
Как удалить большой объём данных из DynamoDB:

https://medium.com/analytics-vidhya/how-to-delete-huge-data-from-dynamodb-table-f3be586c011c

Если у вас терабайты данных, то в зависимости от ситуации есть 4 варианта:
1️⃣ drop & re-create (2-4 минуты)
2️⃣ update TTL column (в течение 2 суток)
3️⃣ delete-item (тысячи записей в минуту)
4️⃣ batch-write-item (десятки тысяч записей в минуту)

#DynamoDB
DynamoDB Standard-IA:

https://aws.amazon.com/blogs/aws/new-dynamodb-table-class-save-up-to-60-in-your-dynamodb-costs/

Отличная возможность сэкономить в два с половиной раза на стоимости редко используемых объёмных таблиц DynamoDB.

Важно отметить, что данный тариф для большого объёма данных, ибо на малых и часто востребованных данных можно лишь потерять, т.к. запросы записи-чтения дороже, а первые 25 ГБ не бесплатны для нового тарифа Standard-IA.

DynamoDB Standard table class
▪️ First 25 GB stored per month is free using the DynamoDB Standard table class
▪️ $0.25 per GB-month thereafter

DynamoDB Standard-Infrequent Access (DynamoDB Standard-IA) table class
▪️ $0.10 per GB-month

#DynamoDB #cost_optimization