Если вы когда-нибудь пытались прикрутить Amazon SageMaker к LangChain или Vercel AI SDK, то знаете эту боль: сигнатуры SigV4, сложные заголовки, постоянные танцы с бубном вокруг аутентификации. А OpenAI — просто кинул API-ключ и погнал. Почему нельзя так же? Можно. И я покажу как.
Почему SigV4 — это головная боль
SigV4 — это стандартный способ аутентификации запросов к AWS API. Он требует вычисления подписи на основе секретного ключа, временных меток, региона и сервиса. Для инференса моделей это превращается в постоянное переписывание клиентов. Любой OpenAI-совместимый инструмент (например, openai-python) просто не умеет подписывать SigV4. Приходится писать обёртки, использовать boto3, мучиться с потоками.
Альтернатива — Amazon Bedrock, но он поддерживает только ограниченный набор моделей. Если вы хотите кастомную модель, обученную на своих данных, или, скажем, открытую LLM вроде Llama 3, — путь один: SageMaker. И вот тут нужен мостик между OpenAI-миром и AWS.
Что предлагает наш подход
Есть два основных пути. Первый — развернуть отдельный proxy-сервер (например, на AWS Lambda + API Gateway), который принимает запросы с bearer token, перепаковывает их и подписывает SigV4. Второй — встроить OpenAI-совместимый слой прямо в контейнер модели на SageMaker, используя такие фреймворки, как AIPerf или vLLM с поддержкой OpenAI API.
В этой инструкции мы сфокусируемся на втором варианте — он проще, быстрее и не требует дополнительной инфраструктуры. Более того, vLLM уже умеет открывать OpenAI-совместимые эндпоинты прямо из коробки. Остаётся только настроить аутентификацию.
Сравнение с альтернативами
| Подход | Аутентификация | Совместимость с OpenAI SDK | Кастомные модели | Сложность |
|---|---|---|---|---|
| SageMaker + native OpenAI endpoint (наш метод) | Bearer token | Полная | Да | Низкая |
| SageMaker + API Gateway proxy | Bearer token + SigV4 внутри | Полная | Да | Средняя |
| Amazon Bedrock | SigV4 + AWS CLI | Частичная (через обёртки) | Нет | Низкая |
| Сторонние сервисы (Together AI, Anyscale) | API key | Полная | Ограниченно | Низкая |
Пошаговая настройка SageMaker endpoint с OpenAI-совместимым API
Мы будем разворачивать модель через SageMaker JumpStart или кастомный контейнер. Для простоты возьмём vLLM, который уже включает в себя OpenAI-сервер.
1 Разверните контейнер с vLLM
Создайте SageMaker endpoint с образом vLLM. В конфигурации укажите переменную VLLM_API_KEY — это и будет ваш bearer token. Пример из ноутбука:
# Задаём API-ключ при деплое
aws sagemaker create-endpoint-config \
--endpoint-config-name vllm-openai \
--production-variants '[{"VariantName":"default","ModelName":"vllm-model","InitialInstanceCount":1,"InstanceType":"ml.g5.2xlarge","Environment":{"VLLM_API_KEY":"sk-your-secret-key"}}]'
2 Настройте Inference Component (опционально)
Если вы используете SageMaker Inference Components с rolling updates, просто добавьте ту же переменную окружения. Это удобно для A/B тестов и канареечных деплоев.
3 Тестируем через curl
Теперь любой OpenAI-клиент может обращаться к вашему эндпоинту, указав базовый URL и ключ:
curl https://your-endpoint.sagemaker.aws/v1/chat/completions \
-H "Authorization: Bearer sk-your-secret-key" \
-d '{"model":"meta-llama/Meta-Llama-3-8B-Instruct","messages":[{"role":"user","content":"Hello!"}]}'
Интеграция с популярными фреймворками
1. Python OpenAI SDK
Просто поменяйте base_url:
from openai import OpenAI
client = OpenAI(
base_url="https://your-endpoint.sagemaker.aws/v1",
api_key="sk-your-secret-key"
)
response = client.chat.completions.create(
model="meta-llama/Meta-Llama-3-8B-Instruct",
messages=[{"role":"user","content":"Что такое SageMaker?"}]
)
print(response.choices[0].message.content)
2. LangChain
LangChain поддерживает любые OpenAI-совместимые API через ChatOpenAI:
from langchain.chat_models import ChatOpenAI
llm = ChatOpenAI(
model="meta-llama/Meta-Llama-3-8B-Instruct",
openai_api_base="https://your-endpoint.sagemaker.aws/v1",
openai_api_key="sk-your-secret-key"
)
response = llm.predict("Расскажи про SageMaker")
3. Vercel AI SDK
На фронтенде или в Next.js используем кастомный провайдер:
import { OpenAIStream, StreamingTextResponse } from 'ai';
import OpenAI from 'openai';
const openai = new OpenAI({
baseURL: process.env.SAGEMAKER_ENDPOINT,
apiKey: process.env.SAGEMAKER_API_KEY,
});
export async function POST(req) {
const { messages } = await req.json();
const response = await openai.chat.completions.create({
model: 'meta-llama/Meta-Llama-3-8B-Instruct',
stream: true,
messages,
});
const stream = OpenAIStream(response);
return new StreamingTextResponse(stream);
}
Безопасность bearer token
Используйте AWS Secrets Manager для хранения токена. Никогда не кладите его прямо в код. Сквозной трекинг через DVC и MLflow тоже может хранить секреты, но лучше довериться нативным инструментам AWS.
Важно: SageMaker endpoint по умолчанию использует VPC и IAM. Если вы открываете доступ через Интернет, обязательно настройте WAF и IP-ограничения. Bearer token — не панацея, а лишь замена SigV4 на клиентской стороне.
Кому подойдёт этот инструмент
- Разработчикам AI-приложений, которые хотят использовать SageMaker как бэкенд, но не хотят переписывать код под SigV4.
- Командам, уже использующим LangChain или Vercel AI SDK — интеграция займёт 5 минут.
- Тем, кто переходит с OpenAI на кастомные модели — API совместим, можно просто сменить base_url и ключ.
- Всех, кто ценит время и не хочет изобретать велосипед с аутентификацией.
Не советую использовать этот подход, если вам нужна строгая IAM-политика на уровне каждого запроса — тогда лучше оставить SigV4 с временными ключами. Но для 90% сценариев Bearer token — это золотая середина между безопасностью и удобством.
Кстати, GLM-4.7 от Zhipu тоже переходит на OpenAI-совместимый API — тренд очевиден: все хотят единый интерфейс. Amazon SageMaker наконец-то догоняет этот тренд.
Хотите попробовать? Запустите SageMaker endpoint через AWS Free Tier — вам хватит бесплатных часов на тестирование. А полный код настройки я выложил в GitHub (ссылка в описании).