Главная / Статьи

Практическое использование Bedrock AgentCore: Terraform, LangGraph и выявленные проблемы.

Что делают Runtime, Gateway, Memory и Identity в AgentCore, плюс шесть подводных камней при развертывании, примерная стоимость и сравнение с самостоятельным хостингом агента на AWS.

Издатель: REACTAPP.TOP9 мин чтения2141 слов

Источники: Amazon Bedrock AgentCore, What It Is, How to Use It, and What Hosting Looks Like

Размещение ИИ-агента на AWS вручную означает необходимость самостоятельного решения проблем исолирования сессий, доступа к инструментам, управления памятью и аутентификации. Amazon Bedrock AgentCore — это управляемая версия для решения тех же задач, доступная в общем доступе с октября 2025 года. Практический способ оценить подобную платформу — это прекратить читать об ней и создать что-то реальное; в качестве примера здесь использован небольшой агент для триажа с правами только на чтение в рамках DevOps. Он был развернут с помощью Terraform вместо встроенного мастера CLI AWS, а также написан с использованием LangGraph вместо SDK Strands от AWS. Оба выбора были сделаны намеренно, поскольку целью было выяснить, что сработает в условиях отсутствия готовых решений.

Что такое AgentCore

AgentCore — это набор управляемых компонентов, которые обеспечивают базовые функции работы агента в производственной среде, позволяя при этом сохранить существующие фреймворки агентов без изменений. Основное обещание — поддержка любого фреймворка, и оно в основном сбывается: поддерживаются LangGraph, LangChain, CrewAI, Strands, а также обычные API-запросы.

Компоненты и их функции:

  • Runtime хранит код агента и предоставляет каждой сессии изолированную микро-ВМ. При отсутствии нагрузки он сокращается до нуля, а стоимость расчетывается по секундам во время работы.
  • Gateway преобразует существующие функции Lambda или API в инструменты, совместимые с MCP, которые может использовать агент, тем самым избавляя от необходимости в ручном создании сервера MCP.
  • Memory хранит историю разговоров в виде краткосрочных событий и при необходимости может извлекать долгосрочные семантические знания между сессиями.
  • Идентификация охватывает два аспекта аутентификации: кто может вызывать агента и что агент может делать от имени пользователя, включая сервисы третьих сторон, такие как Slack или GitHub.
  • Возможность наблюдения отправляет треки OpenTelemetry в CloudWatch, чтобы была запись о том, что делал агент и почему.
  • Инструмент для браузера и инструмент интерпретатора кода обслуживают агентов, которым необходимо действовать в открытом интернете или запускать произвольный код.
  • В объявлении на AWS Summit в июне 2026 года был добавлен слой Harness и возможность нативного поиска в интернете. Оба инструмента ещё слишком молоды, поэтому критическая инфраструктура пока не должна полагаться на них.

    Процесс адаптации уже перерабатывался один раз. Исходный инструментарий Starter Toolkit CLI теперь считается устаревшим и заменён npm-пакетом на основе CDK под названием @aws/agentcore. В учебном пособии, описывающем настройку и запуск agentcore как отдельных шагов, показан старый подход. Эти детали важны, так как указывают на скорость изменений: через девять месяцев после общего выпуска путь для начала работы уже был изменён, поэтому всё, что написано о продукте, имеет ограниченный срок действия.

    Тестовый проект

    Агент отвечает на вопросы, такие как наличие срабатывающих тревог CloudWatch или текущий статус определённой инстанции EC2. У него есть два реальных, только для чтения инструмента, поэтому ничто из того, что он может использовать, не способно изменять инфраструктуру — только наблюдать за ней. Он запоминает ход диалога между взаимодействиями, и каждый переход между компонентами аутентифицируется.

    LangGraph был выбран вместо Strands, поскольку Strands — это собственная платформа AWS, которая обеспечивает наиболее плавную работу со всеми официальными примерами. Использование чего-то другого стало настоящим тестом утверждения о универсальности любой платформы, и это позволило воспользоваться уже имеющимися инструментами. По аналогичной причине Terraform был выбран вместо CLI: мастер предназначен для быстрого запуска демо-версии, а целью здесь было наглядно увидеть все отношения доверия IAM и все связи между компонентами, а не позволять им формироваться незаметно. Оказалось, что такая видимость важнее, чем ожидалось.

    Архитектура включает контейнер в режиме выполнения, в котором работает агент LangGraph, взаимодействующий с шлюзом, предоставляющим два инструмента на основе Lambda через протокол MCP. В памяти AgentCore хранятся ходы диалога, а Cognito выдает токены межмашинного взаимодействия для каждого шага работы.

    Перейдите по ссылке перед написанием скриптов

    До того, как был написан Terraform, версия на консоли для настройки была протестирована один раз, в основном чтобы понять, что автоматизируется. Эту привычку стоит сохранить даже тогда, когда реальную развертку выполняет Terraform, поскольку чтение файлов инфраструктуры становится гораздо проще после того, как вы уже видели формы, которые они заполняют.

    Реестр контейнеров требует ручного настройки независимо от инструмента, который обрабатывает остальные аспекты, поскольку это единственный шаг, который Terraform выполнить не может. Создание репозитория происходит на одном экране консоли. Однако изображение должно поступить каким-то другим способом, так как в консоли нет кнопки для создания Dockerfile. Это делается в терминале с командой docker buildx build для платформы linux/arm64, после чего происходит загрузка изображения. Вся суть заключается в ручном указании платформы; если этого не сделать, изображение будет создано без проблем, но затем тихо отклонено при попытке Runtime его запустить, поскольку Runtime работает только на Graviton.

    Как только изображение загружается, консоль отображает его точный URI. Именно этот строковый код является единственным элементом состояния, который должен быть передан от ручных действий в информацию, известную Terraform — будь то файл tfvars или поле с изображением контейнера в Runtime для тех, кто остается в консоли.

    Инструменты AgentCore для настройки памяти, шлюза и времени выполнения расположены в отдельном разделе консоли Bedrock. Каждый из них представляет собой форму с теми же полями, которые задаёт Terraform, что логично, поскольку под капотом Terraform использует ту же API.

    • В форме для настройки памяти требуется указать имя и срок хранения краткосрочных событий.
    • В форме для настройки шлюза необходимо указать протокол, роль выполнения и способ аутентификации вызывающих сторон. Проблема, связанная с различием между аудиторией Cognito и идентификатором клиента, описанная ниже, проявляется именно здесь в виде выпадающего списка, который заставляет выбрать определённый вариант.
    • В форме для настройки времени выполнения требуются URI реестра, роль и та же настройка авторизатора, что и в форме для шлюза.

    Всё это становится простым, как только формы оказываются перед вами. Terraform по-прежнему остаётся лучшим выбором для долгосрочного использования, поскольку переход между семью формами в трёх разделах консоли — это процесс развертывания, который никто не захочет повторять или передавать коллеге.

    Where it bit

    Images must be ARM64

    Runtime is Graviton-only, with no exceptions. A plain docker build on most laptops yields an amd64 image that is silently refused at deploy time. Every build needs the buildx command with the arm64 platform flag. A comment directly above the FROM line in the Dockerfile is a cheap safeguard, because it will be forgotten otherwise.

    The Gateway's Lambda contract

    В нескольких постах в блоге показано, что событие Lambda находится внутри «обертки» с полями toolName и параметрами. На самом деле речь идет о свойствах входных данных инструмента в виде плоского словаря. Фактическое название инструмента указывается в разделе context.client_context.custom под ключом bedrockAgentCoreToolName; к нему добавляется имя целевого шлюза и разделитель в виде трех подчеркиваний. Разница стала заметна только после прямого ознакомления с документацией AWS по Lambda-target, а не после использования косвенных кратких изложений. Большая часть информации об этом продукте поступает из периода тестирования или просто неверна.

    У токенов Cognito отсутствует поле aud

    Чтобы разобраться в этой ситуации, потребовалось время. При использовании Cognito для аутентификации между устройствами через механизм client_credentials без входа человека, Cognito выдает токен доступа, а не токен идентификатора. Токены доступа никогда не содержат поля aud; его имеют только токены идентификатора, а в сценарии M2M токена идентификатора нет, поскольку пользователь для его выдачи отсутствует. Необходимо настроить авторизатор JWT в AgentCore так, чтобы он проверял поле allowed_audience против такого токена; в результате получается ошибка 403 без очевидной причины. Решением является использование параметра allowed_clients, который проверяет поле client_id, присутствующее в токенах доступа Cognito.

    boto3 не может вызывать Runtime, защищенный JWT

    Это было самым большим сюрпризом — речь идет не о обходном решении, а о прямом указании в собственном руководстве API AWS. Если агент использует входную автентификацию по принципу OAuth, функция InvokeAgentRuntime вообще невозможно вызвать с помощью AWS SDK. Вместо этого используется прямой HTTPS-запрос с токеном-носителем в заголовке Authorization, отправляемый по URL, сгенерированному вручную с процентно-кодированным ARN рантайма в пути. Все примеры на boto3 исходят из использования стандартных параметров IAM и SigV4. Как только настраивается пользовательский объект JWT_authorizer, что необходимо для любых решений, выходящих за рамки чисто внутренних систем, все эти примеры перестают быть актуальными.

    Конфликт пакетов в Python

    Пакет mcp для Python выпустил основную версию 2.0.0, в ходе которой были переименованы внутренние модули, тогда как langchain-mcp-adapters ещё не обновился. Он заявляет о совместимости с mcp версии 1.24.0 и выше без указания верхнего предела, поэтому простое выполнение команды pip install теперь приводит к несовместимости. При этом возникает явная ошибка импорта, а не какой-то скрытый баг. В тестовом проекте версия mcp фиксируется на уровне 1.29.0. Проверьте, действительно ли такая фиксация необходима, поскольку незаметные исправления могут превратить решение проблемы в лишний хлам.

    Развертывание — это не просто выполнение команды

    Ресурс Runtime требует образ контейнера, уже находящегося в реестре, и Terraform не может самостоятельно собрать и загрузить такой образ в процессе выполнения команды apply. Правильная последовательность действий — сначала создать только репозиторий в реестре, затем собрать и загрузить образ вне Terraform, а уже после этого применить остальные настройки. Инженеры, работающие с гораздо более крупными стеками AgentCore, используют CodeBuild в рамках схемы Terraform через элемент null_resource, чтобы устранить эту проблему. Это разумный следующий шаг, свидетельствующий о том, что подобные трудности встречаются повсеместно и не являются личной ошибкой.

    Состояние общения должно храниться в одном месте

    Это не баг, а структурный выбор: агент намеренно не использует собственный чекпоинтер LangGraph для хранения состояния разговора, хотя в большинстве учебников LangGraph он задан по умолчанию. Сессии в режиме выполнения могут сворачиваться до нуля и передавать новую микро-ВМ после каждого вызова, поэтому всё, что хранится только в памяти процесса, исчезает. Память AgentCore представляет собой надежную часть этой системы. Работа локального чекпоинтера параллельно с памятью приводит к тому, что у одного и того же разговора появляются две конкурирующие записи, и рано или поздно они начнут расходиться во мнениях относительно сказанного. Необходимо выбрать один вариант. Память — более разумный выбор, поскольку она сохраняется даже при перезапуске.

    Какова стоимость

    Ценообразование основано на фактическом потреблении без минимального лимита, что подходит для сервисов, которые большую часть времени тратят на ожидание ответа от LLM. В результате счет состоит из нескольких небольших позиций, учитываемых отдельно, а не из одного числа. По состоянию на момент написания:

    • Расходы за выполнение составляют примерно 9 центов за каждый час работы vCPU и около 1 цента за каждый гигабайт-час; измерение происходит секундно с минимальным интервалом в одну секунду, поэтому запрос длительностью три секунды обойдется в три секунды, а не в округленную до минуты стоимость.
    • Стоимость использования шлюза составляет примерно полцента за тысячу вызовов MCP.
    • Память оплачивается по ставке 0,25 цента за 1000 сохраненных записей и 0,5 цента за 1000 извлеченных записей.
    • Использование идентификаторов через механизмы Runtime или Gateway вместо прямого вызова не влечет за собой дополнительных расходов, что применимо практически ко всем сценариям использования.

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

    Управляемая платформа или самостоятельное хостинг

    Сравнение с ручно созданной стеком для хостинга агентов оказывается полезным, и честный вывод имеет две стороны. AgentCore обеспечивает изоляцию сессий, управляемый шлюз MCP, долговечную память и модель аутентификации, все это работает вместе, что позволяет добиться более высокой скорости по сравнению с ручной настройкой политик доверия IAM; здесь на разработку именно таких политик ушли часы. Это значительное сокращение объема рутинной работы по созданию инфраструктуры. Для тех, чья задача — разработка агента, а не платформы хостинга под ним, такой обмен, вероятно, того стоит.

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

    Всё это было действительно создано на практике, а не просто описано. У каждого ресурса есть Terraform, агент готов к использованию, существуют инструменты Lambda, а набор тестов не требует учетных данных AWS; поэтому всё, что можно было проверить, было проверено в первую очередь. При аналогичной разработке наиболее вероятными местами, где возникают проблемы, являются флаг платформы ARM64 для образа и параметр allowed_clients в настройках авторизатора Cognito.