Boto3 python yandex cloud

Подключение Yandex Database к serverless телеграм боту на Yandex Functions

Данная статья является продолжением вот этой статьи. В ней мы рассмотрели создание и настройку yandex cloud functions телеграм бота. А сегодня мы рассмотрим подключение телеграм бота к базе данных и сохранение какой-либо информации о пользователе, с которым общается бот.

В качестве базы данных мы будем использовать Yandex Cloud Database.

Задачи

  1. Создать базу данных;
  2. Подготовить базу к подключению;
  3. Установить зависимости;
  4. Добавить таблицу в базе данных для хранения пользователя;
  5. Сохранить информацию о входящем пользователе в сообщении телеграмма;
  6. Получить информацию и отправить её пользователю из базы данных.

Создание базы данных

Самая простая задача в нашем списке, нам нужно зайти в Консоль Yandex Cloud под своим аккаунтом. Затем в меню консоли управления выбираем Yandex Database.

Кликаем на кнопку . Здесь мы можем задать имя базы и тип. В качестве типа я рекомендую выбирать Serverless, поскольку трафика у нас крайне мало и данных мы хранить особо много не будем. Молодцы! Мы создали базу данных.

Настройка подключения к базе данных

Для осуществления подключения базы данных нам нужно составить свой список задач:

  1. Создание сервисного аккаунта и получение ключей для доступов к базе;
  2. Установка зависимостей для python (boto3);
  3. Настройка подключения к базе данных в коде.
Читайте также:  Абсолютный адрес

Для создания сервисного аккаунта (это такая сущность, которая позволяет программам получать доступ к различным функциям Яндекс Облака) читаем ВНИМАТЕЛЬНО вводную, затем заходим в свою консоль и выбираем облако, в которой расположена база данных. В нем мы нажимаем на «Сервисные аккаунты».

Где найти сервисные аккаунты

Далее создаем сервисный аккаунт с РОЛЬЮ editor. Она позволит работать нам от имени программы с нашей базой.

Далее нажимаем на созданный аккаунт и находим кнопку «Создать новый ключ» и в выпадающем списке выбираем «статический ключ». Оба ключика куда-нибудь записываем. Данные ключи позволят нам настроить подключение по DocAPI к Yandex Cloud Database.

Кнопка для создания ключей

Установка зависимостей

Для установки зависимостей (библиотека для подключения к Yandex Database), мы должны перейти в Редактор нашей функции и посмотреть параметр — «Среда выполнения». Ставим 3.7 preview (так как она поддерживает установку зависимостей).

Проверяем среду выполнения

Затем создаем файл ‘requirements.txt’, он будет использоваться для хранения наших зависимостей и они станут доступны внутри функции. Внутрь пишем библиотеку boto3, это SDK для работы с AWS, но она позволит нам подключиться к Yandex Database как DynamoDB. В итоге у нас получилось 2 файла — бот и зависимости.

Теперь мы умеем ставить различные библиотеки!

Прописываем подключение в коде

После установки зависимостей мы можем настроить подключение к базе. Я рекомендую открывать/закрывать подключение внутри корневой функции 1 раз и прокидывать подключение внутрь других функций, которые работают непосредственно с командами. Но также можно внутри функций проверять подключение.

import json import logging import os import boto3 from botocore.exceptions import ClientError def read_user(user_id, dynamodb=None): if not dynamodb: dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) table = dynamodb.Table('Users') try: response = table.get_item(Key=) except ClientError as e: print(e.response['Error']['Message']) else: return response def create_user(user_id, first_name, dynamodb=None): if not dynamodb: dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) table = dynamodb.Table('Users') response = table.put_item( Item= < 'user_id': str(user_id), 'first_name': str(first_name) >) return response def handler(event, context): dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) body = json.loads(event['body']) user_query = read_user(body['message']['chat']['id'], dynamodb) if 'Item' not in user_query: create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb) return < 'statusCode': 200, 'headers': < 'Content-Type': 'application/json' >, 'body': json.dumps(< 'method': 'sendMessage', 'chat_id': body['message']['chat']['id'], 'text': 'Привет! Я тебя запомнил :)' >), 'isBase64Encoded': False > user = user_query['Item'] return < 'statusCode': 200, 'headers': < 'Content-Type': 'application/json' >, 'body': json.dumps(< 'method': 'sendMessage', 'chat_id': body['message']['chat']['id'], 'text': f'Привет, !' >), 'isBase64Encoded': False >

Перед написанием кода создадим 3 записи в переменные окружения функции.

Оба KEY у нас беруться из сервисного аккаунта, который мы создали ранее, а ссылку на хранилище мы берем из базы данных (Document API).

Где лежит ссылка на базу данных

Сам ресурс подключается командой:

dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') )

Здесь мы указываем какой ресурс из boto3 мы используем и его настройки. Тут нас интересуют endpoint_url — адрес базы данных, и два ключа — сервисного аккаунта.

Ура, теперь мы подключили базу данных в программе!

Создание таблицы в базе

Нашей итоговой задачей является чтение/запись таблицу в базе данных. Но перед тем как работать с таблицей, её нужно создать. Для этого нам нужно 1 раз запустить следующую функцию:

import os import boto3 def create_user_table(): dynamodb = boto3.resource( 'dynamodb', endpoint_url=USER_STORAGE_URL, region_name = 'us-east-1', aws_access_key_id = AWS_ACCESS_KEY_ID, aws_secret_access_key = AWS_SECRET_ACCESS_KEY ) table = dynamodb.create_table( TableName = 'Users', KeySchema=[ < 'AttributeName': 'user_id', 'KeyType': 'HASH' # Partition key >], AttributeDefinitions=[ ] ) return table create_user_table()

Я её запускаю просто из локального редактора на компьютере, чтобы она отработала 1 раз и более нам не нужна. Можно также сделать функцию, которая при каждом запуске проверяет наличие этой таблицы и создает её, в случае ненахождения. Но это уже другая тема.

В данном коде нас интересует функция dynamodb.create_table. Здесь мы указываем при создании имя таблицы(TableName), ключевые элементы (KeySchema) и тип этих элементов (AttributeDefinitions). Не забываем исполнить код. Далее мы будем работать с этой таблицей.

Проверка пользователя и создание в случае отсутствия

Создаем функцию для чтения пользователя внутри файла main.py нашего бота:

def read_user(user_id, dynamodb=None): if not dynamodb: dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) table = dynamodb.Table('Users') try: response = table.get_item(Key=) except ClientError as e: print(e.response['Error']['Message']) else: return response

Она принимает user_id (в нашем случае это id телеграм чата с ботом) и ресурс из основной функции (опционально).

Для создания пользователя также создадим функцию, которая принимает user_id и first_name телеграм юзеров, затем сохраняет их в табличке или перезаписывает старого:

def create_user(user_id, first_name, dynamodb=None): if not dynamodb: dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) table = dynamodb.Table('Users') response = table.put_item( Item= < 'user_id': str(user_id), 'first_name': str(first_name) >) return response

Затем мы должны использовать эти функции внутри нашего кода корневой функции:

def handler(event, context): dynamodb = boto3.resource( 'dynamodb', endpoint_url=os.environ.get('USER_STORAGE_URL'), region_name = 'us-east-1', aws_access_key_id = os.environ.get('AWS_ACCESS_KEY_ID'), aws_secret_access_key = os.environ.get('AWS_SECRET_ACCESS_KEY') ) body = json.loads(event['body']) user_query = read_user(body['message']['chat']['id'], dynamodb) if 'Item' not in user_query: create_user(body['message']['chat']['id'], body['message']['from']['first_name'], dynamodb) return < 'statusCode': 200, 'headers': < 'Content-Type': 'application/json' >, 'body': json.dumps(< 'method': 'sendMessage', 'chat_id': body['message']['chat']['id'], 'text': 'Привет! Я тебя запомнил :)' >), 'isBase64Encoded': False > user = user_query['Item'] return < 'statusCode': 200, 'headers': < 'Content-Type': 'application/json' >, 'body': json.dumps(< 'method': 'sendMessage', 'chat_id': body['message']['chat']['id'], 'text': f'Привет, !' >), 'isBase64Encoded': False >

Обращаем внимание на 10 и 12 строку. В 10 строке мы делаем запрос на пользователя, затем в 11 проверяем наличие его. В случае отсутствия в 12 строке идет создание пользователя.

На этом всё, надеюсь вам не наскучило. Очень прошу оставлять свой отзывы и предложения по дальнейшим планам.

Спасибо телеграм каналам Яндекс Облака и Yandex Cloud Functions, особенно их администрации, которая очень толково все разъясняет.

Следующим шагом я планирую разработку меню и уже реализацию приложения, в котором можно будет просто оформлять какие-либо заказы.

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Yandex Cloud Functions — boto3 example

monsterzz/ycf-python-boto3

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Yandex.Cloud Serverless Functions : Boto3

Small example which shows how to use boto3 to access Yandex Object Storage.

To build deployment package:

Deployment package is 7Mb+, so we need to use Object Storage to deploy it (at least for the first time).

  • create storage bucket in your folder;
  • upload dist.zip using web console or any S3 compatible client;

In this example we will use bgleb-dev as such bucket.

Also you need to have Service Account and access keys to access Object Storage. It could be created using web console or with yc (don’t forget to write down your access key and secret key):

yc iam service-account create --name function-sa yc iam access-key create --service-account-name function-sa yc resource-manager folder add-access-binding \ --subject serviceAccount: --role editor 

To deploy Function with this package:

yc serverless function create --name boto yc serverless function version create \ --function-name boto \ --runtime python37 \ --entrypoint main.handler \ --memory 128M \ --execution-timeout 1s \ --package-bucket-name bgleb-dev \ --package-object-name dist.zip \ --environment STORAGE_BUCKET=my-bucket \ --environment AWS_ACCESS_KEY_ID=XXX \ --environment AWS_SECRET_ACCESS_KEY=XXX 
yc serverless function invoke --name boto 

Get your own invocation URL using:

yc serverless function get --name boto 

Don’t forget to allow unauthorized function invocation

Источник

Оцените статью