Бот организует random coffee для сообщества @betterdatacommunity
Разработка
Создать директорию в YC.
yc resource-manager folder create --name bdc-rc
Создать сервисный аккаунт в YC. Записать id
в .env
.
yc iam service-accounts create bdc-rc --folder-name bdc-rc
id: {SERVICE_ACCOUNT_ID}
Сгенерить ключи для DynamoDB, добавить их в .env
.
yc iam access-key create \
--service-account-name bdc-rc \
--folder-name bdc-rc
key_id: {AWS_KEY_ID}
secret: {AWS_KEY}
Назначить роли, сервисный аккаунт может только писать и читать YDB.
for role in ydb.viewer ydb.editor
do
yc resource-manager folder add-access-binding bdc-rc \
--role $role \
--service-account-name bdc-rc \
--folder-name bdc-rc \
--async
done
Создать базу YDB. Записать эндпоинт для DynamoDB в .env
.
yc ydb database create default --serverless --folder-name bdc-rc
document_api_endpoint: {DYNAMO_ENDPOINT}
Установить, настроить aws
.
pip install awscli
aws configure --profile bdc-rc
{AWS_KEY_ID}
{AWS_KEY}
ru-central1
Создать таблички.
aws dynamodb create-table \
--table-name chats \
--attribute-definitions \
AttributeName=id,AttributeType=N \
--key-schema \
AttributeName=id,KeyType=HASH \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb create-table \
--table-name users \
--attribute-definitions \
AttributeName=user_id,AttributeType=N \
--key-schema \
AttributeName=user_id,KeyType=HASH \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb create-table \
--table-name contacts \
--attribute-definitions \
AttributeName=key,AttributeType=S \
--key-schema \
AttributeName=key,KeyType=HASH \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb create-table \
--table-name manual_matches \
--attribute-definitions \
AttributeName=key,AttributeType=S \
--key-schema \
AttributeName=key,KeyType=HASH \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
Удалить таблички.
aws dynamodb delete-table --table-name chats \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb delete-table --table-name users \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb delete-table --table-name contacts \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb delete-table --table-name manual_matches \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
Список таблиц.
aws dynamodb list-tables \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
Прочитать табличку.
aws dynamodb scan \
--table-name chats \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb scan \
--table-name users \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb scan \
--table-name contacts \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
aws dynamodb scan \
--table-name manual_matches \
--endpoint $DYNAMO_ENDPOINT \
--profile bdc-rc
Создать реестр для контейнера в YC. Записать id
в .env
.
yc container registry create default --folder-name bdc-rc
id: {REGISTRY_ID}
Дать права сервисному аккаунту читать из реестра. Интеграция с YC Serverless Containers.
yc container registry add-access-binding default \
--role container-registry.images.puller \
--service-account-name bdc-rc \
--folder-name bdc-rc
Создать Serverless Containers. Записать id
в .env
.
yc serverless container create --name bot --folder-name bdc-rc
id: {BOT_CONTAINER_ID}
yc serverless container create --name trigger --folder-name bdc-rc
id: {TRIGGER_CONTAINER_ID}
Разрешить bot
без токена. Телеграм дергает вебхук.
yc serverless container allow-unauthenticated-invoke bot \
--folder-name bdc-rc
Сделать trigger
приватным.
yc serverless container deny-unauthenticated-invoke trigger \
--folder-name bdc-rc
Только у сервисного аккаунта право вызывать.
yc serverless container add-access-binding trigger \
--role serverless.containers.invoker \
--service-account-name bdc-rc \
--folder-name bdc-rc
Логи из stderr/stdout. Пропустить system
типа REPORT RequestID: 3f14b872-6371-4637-8b83-2927ba464036 Duration: 166.848 ms Billed Duration: 200 ms Memory Size: 256 MB Max Memory Used: 11 MB Queuing Duration: 0.058 ms
.
yc log read default \
--filter 'json_payload.source = "user"' \
--follow \
--folder-name bdc-rc
Последние 1000 записей.
yc log read default \
--filter 'json_payload.source = "user"' \
--limit 1000 \
--since 2020-01-01T00:00:00Z \
--until 2030-01-01T00:00:00Z \
--folder-name bdc-rc
Прицепить вебхук.
WEBHOOK_URL=https://${BOT_CONTAINER_ID}.containers.yandexcloud.net/
curl --url https://api.telegram.org/bot${BOT_TOKEN}/setWebhook\?url=${WEBHOOK_URL}
Создать триггер.
yc serverless trigger create timer default \
--cron-expression "0 0,9,17 ? * MON,SAT,SUN *" \
--invoke-container-name trigger \
--invoke-container-service-account-name bdc-rc \
--folder-name bdc-rc
Удалить триггер.
yc serverless trigger delete default \
--folder-name bdc-rc
Создать окружение, установить зависимости.
python -m venv ~/.venvs/bdc-rc
source ~/.venvs/bdc-rc/bin/activate
pip install \
-r requirements/test.txt \
-r requirements/main.txt
pip install -e .
Трюк чтобы загрузить окружение из .env
.
export $(cat .env | xargs)
Прогнать линтер, тесты.
make test-lint test-key KEY=test
Собрать образ, загрузить его в реестр, задеплоить.
make image push
make deploy-bot
make deploy-trigger