# NGCloud Shared SQS — Multi-Tenant Message Queue Service Совместимый с Amazon SQS мультитенантный сервис очередей сообщений. Один кластер — много тенантов, каждый с изолированными очередями и credentials. ## Демо-стенд | | | |---|---| | **Web UI** | https://qu.kube5s.ru/ui/ | | **SQS Endpoint** | https://qu.kube5s.ru | | **Access Key** | `SSAK-dbdee63f39621705826a759e` | | **Secret Key** | `faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f` | | **Region** | `us-east-1` (любая) | ## AWS CLI Самый простой способ работы — через стандартный AWS CLI. ### Установка Linux / macOS (pip): ```bash pip install awscli ``` Linux (пакет): ```bash curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip unzip awscliv2.zip && sudo ./aws/install ``` macOS (brew): ```bash brew install awscli ``` Windows: скачайте установщик с [https://aws.amazon.com/cli/](https://aws.amazon.com/cli/) Проверка: `aws --version` ### Настройка ```bash export AWS_ACCESS_KEY_ID="SSAK-dbdee63f39621705826a759e" export AWS_SECRET_ACCESS_KEY="faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f" export AWS_DEFAULT_REGION="us-east-1" ENDPOINT="--endpoint-url https://qu.kube5s.ru" ``` ### Создать очередь ```bash aws sqs create-queue --queue-name myqueue $ENDPOINT ``` ### Список очередей ```bash aws sqs list-queues $ENDPOINT ``` ### Отправить сообщение ```bash aws sqs send-message \ --queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \ --message-body "Hello from CLI!" \ $ENDPOINT ``` ### Получить сообщение ```bash aws sqs receive-message \ --queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \ $ENDPOINT ``` ### Удалить очередь ```bash aws sqs delete-queue \ --queue-url "$(aws sqs get-queue-url --queue-name myqueue $ENDPOINT --query QueueUrl --output text)" \ $ENDPOINT ``` > **Совет:** `--endpoint-url` — единственное отличие от работы с Amazon SQS. > Весь остальной код без изменений. ## curl ### Создать очередь ```bash curl -s -u "SSAK-dbdee63f39621705826a759e:faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f" \ "https://qu.kube5s.ru/?Action=CreateQueue&QueueName=myqueue&Version=2012-11-05" ``` ### Отправить сообщение ```bash curl -s -u "SSAK-dbdee63f39621705826a759e:faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f" \ "https://qu.kube5s.ru/?Action=SendMessage&QueueUrl=https://qu.kube5s.ru/queue/myqueue&MessageBody=HelloWorld&Version=2012-11-05" ``` ### Получить сообщение ```bash curl -s -u "SSAK-dbdee63f39621705826a759e:faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f" \ "https://qu.kube5s.ru/?Action=ReceiveMessage&QueueUrl=https://qu.kube5s.ru/queue/myqueue&Version=2012-11-05" ``` ## Python (boto3) ```python import boto3 sqs = boto3.client( "sqs", endpoint_url="https://qu.kube5s.ru", region_name="us-east-1", aws_access_key_id="SSAK-dbdee63f39621705826a759e", aws_secret_access_key="faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f", ) # Создать очередь queue = sqs.create_queue(QueueName="myqueue") print(queue["QueueUrl"]) # Отправить сообщение sqs.send_message(QueueUrl=queue["QueueUrl"], MessageBody="Hello from Python!") # Получить сообщение msgs = sqs.receive_message(QueueUrl=queue["QueueUrl"]) print(msgs["Messages"][0]["Body"]) ``` ## Node.js (@aws-sdk/client-sqs) ```javascript const { SQSClient, CreateQueueCommand, SendMessageCommand, ReceiveMessageCommand } = require("@aws-sdk/client-sqs"); const sqs = new SQSClient({ endpoint: "https://qu.kube5s.ru", region: "us-east-1", credentials: { accessKeyId: "SSAK-dbdee63f39621705826a759e", secretAccessKey: "faaae34c905f467636cce1db09a66f35113bee6f61efecbe1dcd30ed8d11c33f", }, }); const queue = await sqs.send(new CreateQueueCommand({ QueueName: "myqueue" })); await sqs.send(new SendMessageCommand({ QueueUrl: queue.QueueUrl, MessageBody: "Hello!" })); const res = await sqs.send(new ReceiveMessageCommand({ QueueUrl: queue.QueueUrl })); console.log(res.Messages[0].Body); ``` ## Тесты В репозитории три тестовых скрипта — от простого к сложному. ### quick_test.sh — быстрая проверка Требования: `aws cli`, `bash` ```bash bash quick_test.sh ``` Проверяет 6 базовых операций: создание очереди → список → отправка → получение → удаление → проверка удаления. ### hardcore_test.sh — полный тест (AWS CLI + curl) Требования: `aws cli`, `curl`, `bash` ```bash bash hardcore_test.sh ``` 86 тестов в 23 группах: - Admin API: создание, список, удаление тенантов - CRUD через AWS CLI и через curl - Кросс-доставка: CLI отправляет → curl получает (и наоборот) - Изоляция тенантов: тенант A не видит очереди тенанта B - Невалидный ввод: неавторизованный доступ, несуществующие очереди - Спецсимволы: JSON, XML-сущности, Unicode, эмодзи - Batch операции: SendMessageBatch, DeleteMessageBatch - Visibility timeout: сообщение скрыто → снова доступно - Лимиты: максимум очередей на тенанта - Load test: 20 сообщений throughput - Целостность: проверка MD5 - Edge cases: длинные имена, большие сообщения, граничные параметры ## Особенности - **Полная совместимость с Amazon SQS API** — AWS SDK и CLI работают без изменений, только endpoint меняется - **Мультитенантность** — каждый тенант с изолированными credentials (Access Key / Secret Key) и лимитами - **Изоляция** — тенант видит только свои очереди, чужие недоступны - **Web UI** — визуальное управление тенантами и мониторинг очередей - **Admin API** — программное управление тенантами (создание, удаление, просмотр) - **Batch операции** — SendMessageBatch, DeleteMessageBatch для высокой пропускной способности