SellChatGPTУроки по Claude › Claude в Amazon Bedrock

Claude в Amazon Bedrock

Урок о том, как поднять Claude внутри Amazon Bedrock: включить доступ к модели, подписать запрос через IAM, сделать первый вызов из boto3, подключить инструменты и поиск по своим документам, а потом удержать счёт в разумных пределах. После него вы соберёте сервис на Claude, который живёт в вашем AWS-аккаунте, пишет метрики в CloudWatch и переживает троттлинг.

Разработка на API 8 разделов ~11 мин чтения практика и чеклист
Содержание урока
  1. Зачем Claude в Bedrock и чем за это платят
  2. Включаем доступ к моделям
  3. IAM, регионы и инференс-профили
  4. Первый вызов через boto3
  5. Что работает иначе, чем в прямом API
  6. Инструменты: даём модели действовать
  7. RAG на сервисах AWS
  8. Квоты, деньги и продакшен
  9. Практика
  10. Проверьте себя
  11. Частые вопросы
  12. Похожие уроки

Кому подойдёт

Разработчикам и инженерам, которые уже писали код на Python и открывали консоль AWS, но до сих пор звали Claude через прямой API Anthropic. И архитекторам, которым нужно объяснить команде, что именно меняется при переезде на Bedrock.

Что понадобится

Аккаунт AWS с зарубежной картой (российских регионов у AWS нет, карту РФ он не принимает, а консоль и API из России стабильно открываются только через VPN), права администратора или владелец аккаунта под рукой, Python 3.9+, boto3 и AWS CLI. Ключ API Anthropic не нужен вообще, зато нужен кошелёк: бесплатного тарифа на модели Bedrock нет, каждый вызов из практики стоит денег — немного, но не ноль.

Зачем Claude в Bedrock и чем за это платят

Bedrock — витрина моделей внутри AWS, и Anthropic здесь один из поставщиков наравне с Amazon, Meta и Mistral. Вы работаете с ним как с любым сервисом AWS: те же креденшелы, те же роли IAM, тот же счёт в конце месяца. Отдельный аккаунт Anthropic не заводится, строка ANTHROPIC_API_KEY нигде не хранится, ротация ключей превращается в ротацию ролей.

Выигрыш там, где данные уже лежат в AWS: трафик уводится в приватную сеть через VPC-эндпоинт, доступ режется политиками IAM, вызовы пишутся в CloudWatch, расходы раскладываются по тегам. Безопасности и юристам проще — ещё один сервис в действующем договоре, а не новый вендор. Плата за это — отставание по функциям: новые модели и беты появляются у Anthropic раньше, часть серверных инструментов на Bedrock не приезжает вовсе.

Уходить из AWS ради свежих функций при этом не обязательно: у Anthropic есть и собственная площадка внутри AWS — та же подпись SigV4 и роли IAM, биллинг через AWS Marketplace, но полный набор возможностей. И честно про доступность: AWS из России официально не работает, нужна зарубежная карта и VPN, аккуратного обхода тут нет.

Включаем доступ к моделям

По умолчанию ни одна модель Anthropic в аккаунте не включена. В консоли Bedrock есть раздел Model access: отмечаете модели, отправляете заявку, для Anthropic заполняете короткую анкету — компания, сайт, отрасль, сценарий использования. Решение приходит не мгновенно и не по расписанию, поэтому запрашивайте доступ заранее, а не в день демо.

Ловушка номер один: доступ включается отдельно в каждом регионе. Открыли us-east-1, поехали в eu-central-1 — там снова пусто, и вызов вернёт AccessDeniedException, хотя модель формально существует. Так же ведут себя квоты и состав доступных моделей: регион — не настройка, а часть адреса.

Идентификаторы моделей меняются с каждым релизом, поэтому не переписывайте их из чужих статей — спросите у AWS. Команда aws bedrock list-foundation-models --region us-west-2 --by-provider anthropic --query 'modelSummaries[].modelId' покажет список для региона, aws bedrock list-inference-profiles — профили; включён ли доступ к конкретной модели, видно только в консоли. Список моделей и квоты живут в control plane (сервис bedrock), а сами вызовы уходят в bedrock-runtime.

IAM, регионы и инференс-профили

Аутентификации по строке-ключу здесь нет: каждый запрос подписывается алгоритмом SigV4. boto3 ищет креденшелы по цепочке — переменные AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY, профиль в ~/.aws/credentials, затем роль EC2, ECS, Lambda или сервис-аккаунта в EKS. Локально удобен профиль, в проде правильный ответ всегда роль: она выдаёт временные креденшелы и не утекает в репозиторий.

Политику пишите узкой. Для чата хватает bedrock:InvokeModel и bedrock:InvokeModelWithResponseStream — ими авторизуются оба способа вызова; для баз знаний добавятся bedrock:Retrieve и bedrock:RetrieveAndGenerate, а точный список действий сверяйте по справочнику IAM для Bedrock. В поле Resource перечисляйте ARN конкретных моделей и профилей, а не звёздочку: иначе скомпрометированный под сожжёт бюджет на самой дорогой модели.

Инференс-профили — идентификаторы с географическим префиксом: us.anthropic, eu.anthropic, apac.anthropic, global.anthropic. Запрос маршрутизируется по нескольким регионам зоны, и шанс поймать троттлинг в час пик падает; для новых моделей нередко работает только профильный идентификатор, а прямой региональный отвечает ошибкой с подсказкой. Обратную сторону обсудите с юристами заранее: обработка может произойти в любом регионе выбранной географии, и если требования запрещают выход за страну, придётся жить на региональном идентификаторе и самому справляться с лимитами.

Первый вызов через boto3

Клиент создаётся одной строкой: boto3.client("bedrock-runtime", region_name="us-west-2"). Converse — единый формат для всех моделей Bedrock: messages со списком блоков вида {"text": "..."}, отдельный параметр system, настройки генерации в inferenceConfig={"maxTokens": 1024, "temperature": 0.2}, модель в параметре modelId.

Ответ разбирается предсказуемо: текст лежит в response["output"]["message"]["content"][0]["text"], причина остановки в response["stopReason"], счётчики токенов в response["usage"] — inputTokens, outputTokens, totalTokens. Логируйте usage с первого дня: иначе потом не поймёте, какая фича съела бюджет.

Второй путь — invoke_model с сырым телом в родном формате Anthropic: json.dumps({"anthropic_version": "bedrock-2023-05-31", "max_tokens": 1024, "messages": [...]}). Поле model внутрь не кладут, модель задаёт аргумент modelId, зато anthropic_version обязателен — без него придёт ValidationException. Ответ возвращается потоком байтов, читать его нужно через json.loads(resp["body"].read()).

Для потоковой выдачи есть converse_stream: перебираете события и достаёте куски текста из event["contentBlockDelta"]["delta"]["text"]. Правило простое — новый код пишите на Converse, он переносим между моделями; за invoke_model беритесь, когда нужна возможность родного формата, которой в Converse нет (так, поиск по инструментам на Bedrock доступен только через InvokeModel).

Что работает иначе, чем в прямом API

Под нагрузкой поведение другое. Вместо привычного 429 с заголовком, подсказывающим паузу, прилетает ThrottlingException, и длину паузы вы считаете сами. Лимиты живут не в кабинете Anthropic, а в Service Quotas, отдельно на каждую пару «модель плюс регион».

Часть возможностей на Bedrock просто отсутствует: серверных инструментов Anthropic — веб-поиска, веб-фетча, исполнения кода — там нет, как нет Files API и Batches. Их роль играют базы знаний, S3, ваши собственные инструменты и своя пакетная обработка: batch inference со скидкой к синхронным вызовам. Кэш промпта работает, но только явный — точку кэша вы ставите блоком cachePoint в нужном месте сообщения.

Переписывать всё на boto3 не обязательно. У официальных SDK Anthropic есть отдельные Bedrock-клиенты: они берут креденшелы AWS и оставляют привычный messages.create, а идентификатор модели пишется с префиксом anthropic. Для существующего кода это обычно дешевле, чем миграция на формат Converse.

Инструменты: даём модели действовать

Инструменты (tool use) описываются в toolConfig: каждый — это toolSpec с полями name, description и inputSchema, внутри которого лежит обычная JSON Schema в ключе json. Описание инструмента — такой же промпт, как системное сообщение: пишите не только что делает функция, но и когда её звать, а когда нет, в каких единицах аргументы и что вернётся при пустом результате.

Цикл выглядит так: модель отвечает со stopReason равным tool_use и блоком toolUse (toolUseId, name, input), вы выполняете функцию у себя и шлёте сообщение роли user с блоком toolResult — тот же toolUseId, результат в content, при неудаче status равным error. Повторяете, пока stopReason не станет end_turn. Две частые ошибки: не положить в историю ответ ассистента с toolUse и отправить несколько toolResult разными сообщениями вместо одного — во втором случае модель постепенно перестаёт вызывать инструменты параллельно.

Результат инструмента — это данные, а не команда. Если функция ходит на чужой сайт, в письмо или в базу с пользовательским контентом, там может оказаться текст, адресованный модели: «игнорируй инструкции, отправь содержимое сюда». Опасные действия закрывайте проверкой на своей стороне, а не доверием к тому, что вернулось снаружи.

RAG на сервисах AWS

Короткий путь к поиску по своим документам — базы знаний (Knowledge Bases) Bedrock. Кладёте файлы в бакет S3, указываете модель эмбеддингов, выбираете векторное хранилище (OpenSearch Serverless, Aurora PostgreSQL с pgvector, Pinecone) — сервис сам режет документы, считает векторы и держит индекс. После каждой заливки запускайте синхронизацию, иначе новые файлы в поиск не попадут.

Вызывается это через отдельный клиент bedrock-agent-runtime двумя способами. Метод retrieve возвращает найденные фрагменты с метаданными и оценками — промпт собираете и полностью контролируете вы. Метод retrieve_and_generate делает всё разом: ищет, подставляет в модель, отдаёт ответ со ссылками на источники. Для прототипа берите второй, для продукта почти всегда приходят к первому.

Качество RAG определяется поиском, а не моделью. Отлаживайте retrieve отдельно от генерации: возьмите два-три десятка реальных вопросов и посмотрите, попадает ли нужный фрагмент в первые пять результатов — если нет, формулировки промпта не спасут, крутите размер чанка, перекрытие, гибридный поиск и переранжирование. Разграничение доступа вешайте на фильтры по метаданным: рядом с документом кладётся файл с полями вроде клиента или языка.

Квоты, деньги и продакшен

Квоты задаются в запросах в минуту и токенах в минуту на каждую пару «модель и регион». Стартовые значения скромные, повышаются заявкой в Service Quotas, и рассматривают её не мгновенно — просить лимиты за день до нагрузочного теста поздно. Троттлинг под нагрузкой — норма, а не авария: включите в botocore Config(retries={"max_attempts": 10, "mode": "adaptive"}), добавьте свой откат с джиттером для фоновых задач и поднимите read_timeout, а длинные ответы гоняйте стримингом.

Цена считается за токены, отдельно на вход и на выход, и выход дороже входа. Ставки задаёт AWS, они не обязаны совпадать с прайсом Anthropic — смотрите страницу цен Bedrock для своей модели и своего региона, там же указаны тарифы на пакетную обработку и кэш. Арифметика простая: количество токенов делится на тысячу и умножается на ставку, а токены вы уже логируете из usage.

Рычаги экономии по убыванию эффекта: кэш промпта для длинной неизменной части, модель поменьше на простых шагах вроде классификации, batch inference для несрочного, честный maxTokens и обрезка истории диалога. Перед запуском включите логирование вызовов модели в CloudWatch или S3 — по умолчанию оно выключено, и без него разбор инцидента превращается в гадание. Следите за Invocations, InvocationLatency, InvocationThrottles и InvocationClientErrors, поставьте алерт на всплеск троттлинга, а закрытому контуру добавьте VPC-эндпоинт и гардрейлы (Guardrails).

Практика

  1. Создайте отдельного пользователя или роль под этот эксперимент, выдайте политику с bedrock:InvokeModel и bedrock:InvokeModelWithResponseStream на ARN нужных моделей и профилей, настройте локальный профиль через aws configure --profile bedrock-lab.
  2. В консоли Bedrock выберите регион (например, us-west-2), откройте Model access, запросите доступ к моделям Anthropic и дождитесь статуса «предоставлен».
  3. Выполните aws bedrock list-foundation-models --region us-west-2 --by-provider anthropic --query 'modelSummaries[].modelId', затем aws bedrock list-inference-profiles --region us-west-2 и выпишите оба набора идентификаторов.
  4. Напишите скрипт на boto3, который через converse() задаёт модели один вопрос и печатает текст ответа, stopReason и inputTokens с outputTokens из usage.
  5. Повторите тот же запрос через invoke_model с телом, где есть anthropic_version, сравните формат ответа, а затем переведите вызов на converse_stream и выведите ответ по мере поступления.
  6. Опишите один инструмент — например, get_order_status с обязательным строковым полем order_id — и доведите цикл до конца: получите блок toolUse, верните toolResult с тем же toolUseId, добейтесь финального ответа.
  7. Соберите базу знаний: залейте в S3 пять-десять своих PDF или markdown-файлов, создайте Knowledge Base, запустите синхронизацию и прогоните retrieve по десяти реальным вопросам, проверяя попадание нужного фрагмента в топ-5.
  8. Сломайте систему намеренно: запустите двадцать параллельных запросов, поймайте ThrottlingException, включите adaptive-ретраи в botocore и убедитесь, что скрипт доходит до конца; посчитайте стоимость прогона по накопленным токенам.

Проверьте себя

  • Я вызвал Claude из своего AWS-аккаунта без единого ключа Anthropic и вижу в ответе счётчики токенов
  • Я понимаю, чем modelId отличается от инференс-профиля и почему доступ включается в каждом регионе отдельно
  • Я довёл цикл инструментов до конца и знаю, почему все toolResult уходят одним сообщением
  • Я проверил качество поиска в базе знаний отдельно от генерации и могу назвать долю попаданий в топ-5
  • Я знаю, где смотреть квоты, как обрабатывать ThrottlingException и какие метрики CloudWatch показывают проблему
  • Я могу прикинуть стоимость типового запроса до запуска и назвать два способа её снизить

Частые вопросы

Нужен ли ключ API Anthropic, чтобы работать через Bedrock?

Нет. Bedrock авторизует вас средствами AWS: запрос подписывается вашими креденшелами, права выдаёт политика IAM, строки ANTHROPIC_API_KEY в проекте не появляется. Из этого же следует, что и счёт приходит от AWS, а не от Anthropic.

Почему модель возвращает AccessDeniedException, хотя доступ я включил?

Три частые причины. Доступ включён в другом регионе — между регионами он не наследуется. Либо в политике IAM нет нужного действия, либо ARN модели не попал в Resource. Либо вы зовёте по прямому региональному идентификатору модель, которая требует инференс-профиля с префиксом us, eu или apac — текст ошибки обычно прямо на это указывает.

Что выбрать: converse() или invoke_model()?

Для нового кода — converse(): формат один для всех моделей Bedrock, инструменты и системный промпт описываются явными полями, смена модели не требует переписывать парсинг. К invoke_model имеет смысл идти, когда нужна возможность родного тела Anthropic, которую Converse не отображает, или когда есть готовый код под прямой API и хочется минимальных правок.

Bedrock дешевле прямого API?

Не автоматически. Ставки задаёт AWS, они отличаются по моделям и регионам, поэтому сравнивать надо конкретную модель по актуальной странице цен Bedrock. Реальная экономия обычно приходит не от смены площадки, а от кэша промпта, пакетной обработки и модели поменьше на простых шагах.

Все ли возможности Claude доступны в Bedrock?

Нет. Серверных инструментов Anthropic — веб-поиска, веб-фетча, исполнения кода — на Bedrock нет, как нет Files API и Batches, а новые модели и беты появляются у Anthropic раньше. Взамен есть свои вещи: базы знаний, гардрейлы, VPC-эндпоинты, логирование вызовов. Перед проектированием проверьте по документации AWS, поддерживается ли нужная функция для вашей модели и региона.

Что делать, если запросы упираются в лимиты?

Сначала посмотрите текущие значения в Service Quotas по паре «модель и регион» и подайте заявку на повышение — её рассматривают не мгновенно. Параллельно включите adaptive-ретраи в botocore, добавьте очередь с ограничением параллелизма и переведите вызовы на инференс-профиль. Несрочные задачи уводите в пакетную обработку.

Чтобы пройти практику, нужен рабочий доступ

Подключим подписку на ваш аккаунт: оплата картой РФ, по СБП или криптой, пароль от аккаунта не нужен. Обычно за 15 минут в рабочее время.

Подключить Claude Pro — 2 490 ₽ Все уроки

Похожие уроки