SpyBara
Go Premium

Documentation 2026-10-06 23:59 UTC to 2026-10-07 03:02 UTC

5 files changed +40 −32. View all changes and history on the product overview
2026
Wed 7 03:58 Tue 6 23:59 Mon 5 23:58 Sun 4 23:58 Sat 3 23:57 Fri 2 22:59 Thu 1 23:59
Details

75| - | - |75| - | - |

76| Claude Code v2.1.195 или позже | Подкоманда `claude gateway` и поток входа шлюза поставляются в v2.1.195. Более ранние общедоступные сборки их не включают. Как машина, запускающая сервер шлюза, так и машина каждого разработчика должны быть на v2.1.195 или позже; запустите `claude update`, чтобы получить последний выпуск. [Claude Platform on AWS upstream](/docs/ru/claude-apps-gateway-config#claude-platform-on-aws) требует Claude Code v2.1.198 или позже на сервере шлюза. |76| Claude Code v2.1.195 или позже | Подкоманда `claude gateway` и поток входа шлюза поставляются в v2.1.195. Более ранние общедоступные сборки их не включают. Как машина, запускающая сервер шлюза, так и машина каждого разработчика должны быть на v2.1.195 или позже; запустите `claude update`, чтобы получить последний выпуск. [Claude Platform on AWS upstream](/docs/ru/claude-apps-gateway-config#claude-platform-on-aws) требует Claude Code v2.1.198 или позже на сервере шлюза. |

77| Поставщик удостоверений OpenID Connect (OIDC) | Okta, Microsoft Entra ID, Google Workspace, Keycloak или Dex, или любой другой совместимый с OIDC IdP, такой как PingFederate. Шлюз запускает стандартное обнаружение OIDC и поток кода авторизации против него. SAML и LDAP не поддерживаются. |77| Поставщик удостоверений OpenID Connect (OIDC) | Okta, Microsoft Entra ID, Google Workspace, Keycloak или Dex, или любой другой совместимый с OIDC IdP, такой как PingFederate. Шлюз запускает стандартное обнаружение OIDC и поток кода авторизации против него. SAML и LDAP не поддерживаются. |

78| PostgreSQL 14 или позже | Поддерживает поток входа устройства, где обратный вызов браузера пишет, а опрашивающий CLI читает, плюс счётчики ограничения скорости. Любой управляемый Postgres работает, включая самый маленький уровень. Без настроенных ограничений расходов шлюз хранит несколько КБ краткосрочного состояния аутентификации; с [ограничениями расходов](/docs/ru/claude-apps-gateway-spend-limits) он также содержит долговечные таблицы расходов, аудита и идентификации, которые должны быть скопированы. TLS через `?sslmode=require` рекомендуется. |78| PostgreSQL 11 или позже | Обеспечивает работу потока входа устройства и счётчиков ограничения частоты запросов. Подойдёт управляемый сервис PostgreSQL, включая самый маленький уровень; см. [какие базы данных поддерживаются](/docs/ru/claude-apps-gateway-deploy#postgres). С [ограничениями расходов](/docs/ru/claude-apps-gateway-spend-limits) он также содержит долговечные таблицы расходов, аудита и идентификации, для которых следует создавать резервные копии. TLS через `?sslmode=require` рекомендуется. PostgreSQL 11, 12 и 13 требуют Claude Code v2.1.290 или позже на сервере шлюза. Проект PostgreSQL больше не поддерживает эти версии, поэтому по возможности используйте более новую. |

79| Вышестоящий уровень модели | Учётные данные Amazon Bedrock, учётные данные Claude Platform on AWS, учётные данные Google Cloud, ресурс Microsoft Foundry или ключ API Anthropic. Поддерживаются несколько вышестоящих уровней с отказоустойчивостью. |79| Вышестоящий уровень модели | Учётные данные Amazon Bedrock, учётные данные Claude Platform on AWS, учётные данные Google Cloud, ресурс Microsoft Foundry или ключ API Anthropic. Поддерживаются несколько вышестоящих уровней с отказоустойчивостью. |

80| HTTPS | Шлюз должен быть доступен по `https://` с ноутбуков разработчиков и из любого браузера, используемого для входа; шлюз служит страницей проверки устройства на том же слушателе. Либо предоставьте сертификат TLS через `listen.tls`, либо запустите позади завершающего TLS входа, и установите `listen.public_url` на внешнее происхождение в обоих случаях. При `/login` Claude Code принимает простое происхождение `http://` только когда хост шлюза является loopback: `localhost`, `127.0.0.1` или `::1`. |80| HTTPS | Шлюз должен быть доступен по `https://` с ноутбуков разработчиков и из любого браузера, используемого для входа; шлюз служит страницей проверки устройства на том же слушателе. Либо предоставьте сертификат TLS через `listen.tls`, либо запустите позади завершающего TLS входа, и установите `listen.public_url` на внешнее происхождение в обоих случаях. При `/login` Claude Code принимает простое происхождение `http://` только когда хост шлюза является loopback: `localhost`, `127.0.0.1` или `::1`. |

81| Адрес частной сети | При `/login` Claude Code требует, чтобы имя хоста или IP-адрес шлюза разрешались только в частные адреса: RFC 1918, link-local, CGNAT `100.64.0.0/10`, IPv6 ULA `fc00::/7` или loopback. Для шлюза, который вы размещаете, любой общедоступный адрес вне блока, который вы объявляете, отклоняется; см. [модель угроз](/docs/ru/claude-apps-gateway-deploy#threat-model-summary) в руководстве развёртывания. Если машины разработчиков маршрутизируют HTTPS через корпоративный прокси, вход также требует, чтобы хост прокси разрешался в частные адреса; если это не так, добавьте хост шлюза в `NO_PROXY`, чтобы CLI подключался напрямую. Если ваша внутренняя сеть пронумерована из общедоступного пространства IPv4, которым владеет ваша организация, [объявите эти блоки](#allow-a-gateway-on-public-address-space-you-own), чтобы `/login` принял шлюз там. |81| Адрес частной сети | При `/login` Claude Code требует, чтобы имя хоста или IP-адрес шлюза разрешались только в частные адреса: RFC 1918, link-local, CGNAT `100.64.0.0/10`, IPv6 ULA `fc00::/7` или loopback. Для шлюза, который вы размещаете, любой общедоступный адрес вне блока, который вы объявляете, отклоняется; см. [модель угроз](/docs/ru/claude-apps-gateway-deploy#threat-model-summary) в руководстве развёртывания. Если машины разработчиков маршрутизируют HTTPS через корпоративный прокси, вход также требует, чтобы хост прокси разрешался в частные адреса; если это не так, добавьте хост шлюза в `NO_PROXY`, чтобы CLI подключался напрямую. Если ваша внутренняя сеть пронумерована из общедоступного пространства IPv4, которым владеет ваша организация, [объявите эти блоки](#allow-a-gateway-on-public-address-space-you-own), чтобы `/login` принял шлюз там. |


91 </Step>91 </Step>

92 92 

93 <Step title="Подготовьте базу данных PostgreSQL">93 <Step title="Подготовьте базу данных PostgreSQL">

94 Любой Postgres 14 или позже работает, включая самый маленький управляемый уровень. Шлюз запускает свои собственные миграции схемы при загрузке, поэтому пользователю базы данных нужны права для создания и изменения таблиц; см. [`store`](/docs/ru/claude-apps-gateway-config#store).94 Используйте PostgreSQL 11 или позже. Самого маленького управляемого уровня достаточно. Шлюз запускает свои собственные миграции схемы при загрузке, поэтому роли базы данных нужны права для создания и изменения таблиц; см. [`store`](/docs/ru/claude-apps-gateway-config#store).

95 </Step>95 </Step>

96 96 

97 <Step title="Напишите gateway.yaml">97 <Step title="Напишите gateway.yaml">

Details

158Шлюз читает ключ и сертификат один раз при загрузке, поэтому изменённый файл вступает в силу только после перезапуска. Выполняйте ротацию в таком порядке, чтобы ни один запрос токена не предъявлял сертификат, которого нет у IdP:158Шлюз читает ключ и сертификат один раз при загрузке, поэтому изменённый файл вступает в силу только после перезапуска. Выполняйте ротацию в таком порядке, чтобы ни один запрос токена не предъявлял сертификат, которого нет у IdP:

159 159 

1601. Загрузите новый сертификат в IdP в дополнение к старому.1601. Загрузите новый сертификат в IdP в дополнение к старому.

1612. Замените файлы ключа и сертификата, которые загружает `gateway.yaml`, затем перезапустите шлюз.1612. Замените файлы ключа и сертификата, которые загружает `gateway.yaml`, затем перезапустите шлюз. Если вы запускаете несколько реплик, подойдёт [последовательный перезапуск](/docs/ru/claude-apps-gateway-deploy#upgrades), потому что у IdP есть оба сертификата, пока вы не удалите старый.

1623. Удалите старый сертификат из IdP.1623. После перезапуска всех реплик удалите старый сертификат из IdP.

163 163 

164<h4 id="idp-requests-through-a-forward-proxy">164<h4 id="idp-requests-through-a-forward-proxy">

165 Запросы к IdP через прямой прокси165 Запросы к IdP через прямой прокси


227 227 

228| Поле | Обязательно | Описание |228| Поле | Обязательно | Описание |

229| - | - | - |229| - | - | - |

230| `postgres_url` | Да | URL `postgres://` или `postgresql://`. Обязателен: точке встречи грантов устройств, куда пишет обратный вызов браузера и откуда читает опрашивающий CLI, нужно состояние, общее для реплик. Шлюз сам выполняет миграции схемы при загрузке и при обновлении, поэтому роли нужны права на создание и изменение таблиц в целевой схеме. См. [Обновления](/docs/ru/claude-apps-gateway-deploy#upgrades) и [Postgres](/docs/ru/claude-apps-gateway-deploy#postgres). |230| `postgres_url` | Да | URL `postgres://` или `postgresql://` с одним хостом, а не списком хостов через запятую. Шлюз сам выполняет миграции схемы при загрузке и при обновлении, поэтому роли нужны права на создание и изменение таблиц в целевой схеме. См. [Обновления](/docs/ru/claude-apps-gateway-deploy#upgrades) и [Postgres](/docs/ru/claude-apps-gateway-deploy#postgres). |

231| `username` | Нет | Переопределяет пользователя в `postgres_url` |231| `username` | Нет | Переопределяет пользователя в `postgres_url` |

232| `password` | Нет | Учётные данные базы данных. Задавайте их здесь, а не в `postgres_url`, чтобы учётные данные не попадали в URL. Принимает любые символы и имеет приоритет над учётными данными из URL. |232| `password` | Нет | Учётные данные базы данных. Задавайте их здесь, а не в `postgres_url`, чтобы учётные данные не попадали в URL. Принимает любые символы и имеет приоритет над учётными данными из URL. |

233| `max_connections` | Нет | Размер пула соединений Postgres на реплику. По умолчанию `5` — консервативное значение, подходящее для общих баз данных. При включённых [лимитах расходов](#admin) горячий путь выполняет несколько операций на каждый запрос инференса, поэтому увеличьте значение для выделенной базы данных под нагрузкой и следите, чтобы число реплик × это значение было меньше `max_connections` базы данных. |233| `max_connections` | Нет | Размер пула соединений Postgres на реплику. По умолчанию `5` — консервативное значение, подходящее для общих баз данных. При включённых [лимитах расходов](#admin) горячий путь выполняет несколько операций на каждый запрос инференса, поэтому увеличьте значение для выделенной базы данных под нагрузкой и следите, чтобы число реплик × это значение было меньше `max_connections` базы данных. |

Details

249 Postgres249 Postgres

250</h3>250</h3>

251 251 

252Шлюз хранит своё состояние в базе данных PostgreSQL:

253 

254* **База данных**: сам PostgreSQL, размещённый самостоятельно или управляемый, [минимальной версии](/docs/ru/claude-apps-gateway#prerequisites) или новее. Базы данных, которые лишь реализуют протокол Postgres, например распределённые SQL-базы данных, не поддерживаются.

255* **Адрес**: `store.postgres_url` принимает один хост. Если у базы данных несколько узлов, используйте адрес, стоящий перед ними, например эндпоинт вашего управляемого сервиса, балансировщик нагрузки или виртуальный IP. Установите [период благодати готовности](#readiness-grace-period) длиннее, чем занимает переключение при отказе.

256 

252Шлюз содержит пять таблиц данных плюс таблицу `_migrations`, все созданные его миграциями при загрузке:257Шлюз содержит пять таблиц данных плюс таблицу `_migrations`, все созданные его миграциями при загрузке:

253 258 

254| Таблица | Содержимое | Удержание |259| Таблица | Содержимое | Удержание |


396| CLI `/login`: `Could not resolve the configured HTTP proxy` | Имя хоста в `HTTPS_PROXY` или `HTTP_PROXY` не разрешается с машины разработчика, обычно потому что она не подключена к корпоративной сети | Попросите разработчика подключиться к вашей сети или VPN и повторить попытку, или исправьте URL прокси |401| CLI `/login`: `Could not resolve the configured HTTP proxy` | Имя хоста в `HTTPS_PROXY` или `HTTP_PROXY` не разрешается с машины разработчика, обычно потому что она не подключена к корпоративной сети | Попросите разработчика подключиться к вашей сети или VPN и повторить попытку, или исправьте URL прокси |

397| CLI `/login`: `Could not resolve gateway host <host>` | Машина не может разрешить внутреннее DNS-имя шлюза, обычно потому что она не в корпоративной сети | Попросите разработчика подключиться к вашей сети или VPN, затем повторите попытку `/login` |402| CLI `/login`: `Could not resolve gateway host <host>` | Машина не может разрешить внутреннее DNS-имя шлюза, обычно потому что она не в корпоративной сети | Попросите разработчика подключиться к вашей сети или VPN, затем повторите попытку `/login` |

398| Загрузка выходит с ошибкой валидации конфигурации, называющей `store.postgres_url` | Postgres не настроен; шлюз требует Postgres | Установите `store.postgres_url`. Для локальной разработки используйте одноразовый контейнер: `docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`. |403| Загрузка выходит с ошибкой валидации конфигурации, называющей `store.postgres_url` | Postgres не настроен; шлюз требует Postgres | Установите `store.postgres_url`. Для локальной разработки используйте одноразовый контейнер: `docker run --rm -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres`. |

404| Загрузка выходит: `store.postgres_url in <path> is not a URL the gateway can read` или, в версиях до v2.1.290, просто `Invalid URL` или `URI error` | URL не удаётся разобрать, например потому что в нём указано более одного хоста или пароль содержит незакодированные `/`, `?`, `#` или `%` | Укажите [один хост](#postgres) и перенесите пароль в [`store.password`](/docs/ru/claude-apps-gateway-config#store) |

399| Загрузка выходит: `requires the native binary` | Запуск под Node вместо нативного бинарного файла | Установите Claude Code одним из [методов автономной установки](/docs/ru/setup) |405| Загрузка выходит: `requires the native binary` | Запуск под Node вместо нативного бинарного файла | Установите Claude Code одним из [методов автономной установки](/docs/ru/setup) |

400| Загрузка выходит с ошибкой обнаружения OIDC после `config.load` | `oidc.issuer` недоступен или цепочке TLS нет доверия | Проверьте, что издатель доступен из pod и обслуживает `/.well-known/openid-configuration`. Установите `ca_cert_pem` для приватной PKI. Если pod достигает IdP только через forward proxy, установите [`oidc.use_proxy: true`](/docs/ru/claude-apps-gateway-config#idp-requests-through-a-forward-proxy); на версиях до v2.1.227 вместо этого предоставьте pod прямой маршрут к каждому эндпоинту IdP. Если pod также не может разрешить имя хоста IdP или прокси отказывает в `CONNECT` на IP-адрес, см. [Proxy-only egress](/docs/ru/claude-apps-gateway-config#proxy-only-egress), что требует v2.1.277 или позже. |406| Загрузка выходит с ошибкой обнаружения OIDC после `config.load` | `oidc.issuer` недоступен или цепочке TLS нет доверия | Проверьте, что издатель доступен из pod и обслуживает `/.well-known/openid-configuration`. Установите `ca_cert_pem` для приватной PKI. Если pod достигает IdP только через forward proxy, установите [`oidc.use_proxy: true`](/docs/ru/claude-apps-gateway-config#idp-requests-through-a-forward-proxy); на версиях до v2.1.227 вместо этого предоставьте pod прямой маршрут к каждому эндпоинту IdP. Если pod также не может разрешить имя хоста IdP или прокси отказывает в `CONNECT` на IP-адрес, см. [Proxy-only egress](/docs/ru/claude-apps-gateway-config#proxy-only-egress), что требует v2.1.277 или позже. |

401| Загрузка выходит с ошибкой прав доступа Postgres | Роль базы данных не имеет прав DDL на своей схеме | Предоставьте роли `CREATE` на схему шлюза, чтобы она могла создавать и изменять свои таблицы при загрузке |407| Загрузка выходит с ошибкой прав доступа Postgres | Роль базы данных не имеет прав DDL на своей схеме | Предоставьте роли `CREATE` на схему шлюза, чтобы она могла создавать и изменять свои таблицы при загрузке |

402| Лог: `could not connect to Postgres at boot, attempt 1 of 3` | База данных ещё не была доступна, когда шлюз запустился, например на холодном экземпляре, чья сеть всё ещё поднимается | Если шлюз затем завершает загрузку, никаких действий не требуется. Когда база данных недоступна, шлюз пытается подключиться три раза, с интервалом в две секунды, перед выходом. Если он выходит с `could not connect to Postgres`, проверьте `store.postgres_url` и сетевой путь к базе данных. Если попытки завершаются по таймауту, а не отклоняются, поднимите [`store.connect_timeout_seconds`](/docs/ru/claude-apps-gateway-config#store), чтобы дать каждой больше времени. |408| Лог: `could not connect to Postgres at boot, attempt 1 of 3` | База данных ещё не была доступна, когда шлюз запустился, например на холодном экземпляре, чья сеть всё ещё поднимается | Если шлюз затем завершает загрузку, никаких действий не требуется. Когда база данных недоступна, шлюз пытается подключиться три раза, с интервалом в две секунды, перед выходом. Если он выходит с `could not connect to Postgres`, проверьте `store.postgres_url`, в том числе что в нём указан один хост, и сетевой путь к базе данных. Если попытки завершаются по таймауту, а не отклоняются, поднимите [`store.connect_timeout_seconds`](/docs/ru/claude-apps-gateway-config#store), чтобы дать каждой больше времени. |

403| `/oauth/callback` показывает "Sign-in could not be completed" | Домен email отклонён, валидация id\_token не удалась или `email_verified` явно `false`, что шлюз всегда отклоняет без возможности переопределения | Проверьте `allowed_email_domains` и что IdP возвращает проверенное утверждение `email`. Для `email_verified: false` исправьте проверку на стороне IdP. Если ваш IdP выдаёт email под другим именем утверждения, установите `oidc.email_claim`. |409| `/oauth/callback` показывает "Sign-in could not be completed" | Домен email отклонён, валидация id\_token не удалась или `email_verified` явно `false`, что шлюз всегда отклоняет без возможности переопределения | Проверьте `allowed_email_domains` и что IdP возвращает проверенное утверждение `email`. Для `email_verified: false` исправьте проверку на стороне IdP. Если ваш IdP выдаёт email под другим именем утверждения, установите `oidc.email_claim`. |

404| Лог: `token exchange failed request_id=<id>: id_token missing email claim` | IdP не включает `email` в id\_token по умолчанию. Это отклонение срабатывает только когда установлен `allowed_email_domains`; без него отсутствующий email создаёт сессию без email | Настройте IdP для выдачи `email` в id\_token. Okta: добавьте `email` к утверждениям ID-токена пользовательского сервера авторизации. Entra: добавьте `email` как опциональное утверждение в регистрации приложения. PingFederate: включите политику OpenID Connect, которая выдаёт `email`. Если IdP обслуживает `email` из эндпоинта userinfo, но не включает его в id\_token, как, например, сервер авторизации организации Okta, установите `oidc.userinfo_fallback: true`. |410| Лог: `token exchange failed request_id=<id>: id_token missing email claim` | IdP не включает `email` в id\_token по умолчанию. Это отклонение срабатывает только когда установлен `allowed_email_domains`; без него отсутствующий email создаёт сессию без email | Настройте IdP для выдачи `email` в id\_token. Okta: добавьте `email` к утверждениям ID-токена пользовательского сервера авторизации. Entra: добавьте `email` как опциональное утверждение в регистрации приложения. PingFederate: включите политику OpenID Connect, которая выдаёт `email`. Если IdP обслуживает `email` из эндпоинта userinfo, но не включает его в id\_token, как, например, сервер авторизации организации Okta, установите `oidc.userinfo_fallback: true`. |

405| Лог: `refresh failed request_id=<id>: invalid_token (…) (at userinfo_no_id_token, …)`, и разработчики видят `Cloud gateway session expired` каждые `session.ttl_hours` | IdP принял refresh token, но не вернул вместе с ним id\_token, поэтому шлюз запросил утверждения пользователя у эндпоинта userinfo IdP. IdP отклонил там обновлённый access token. Шлюз отвечает `temporarily_unavailable`, поэтому Claude Code сохраняет refresh token, но не может обновить сессию. Версии шлюза до v2.1.260 логируют ту же строку без деталей `(at …)`. | Установите [`oidc.scope_on_refresh: true`](/docs/ru/claude-apps-gateway-config#oidc), доступно в шлюзе v2.1.260 или позже, чтобы запрос refresh снова запрашивал `openid`. Некоторые IdP, такие как Okta, возвращают id\_token при refresh только при явном запросе. На PingFederate вместо этого включите **Return ID Token On Refresh Grant** в разделе **Applications > OAuth > OpenID Connect Policy Management**. Ключ не изменяет поведение PingFederate. Для других IdP, которые всё ещё его опускают, проверьте, принимает ли эндпоинт userinfo access tokens, выданные при refresh. В качестве временного решения поднимите [`session.ttl_hours`](/docs/ru/claude-apps-gateway-config#session). См. [Identity provider setup](#identity-provider-setup) о компромиссе при deprovisioning. |411| Лог: `refresh failed request_id=<id>: invalid_token (…) (at userinfo_no_id_token, …)`, и разработчики видят `Cloud gateway session expired` каждые `session.ttl_hours` | IdP принял refresh token, но не вернул вместе с ним id\_token, поэтому шлюз запросил утверждения пользователя у эндпоинта userinfo IdP. IdP отклонил там обновлённый access token. Шлюз отвечает `temporarily_unavailable`, поэтому Claude Code сохраняет refresh token, но не может обновить сессию. Версии шлюза до v2.1.260 логируют ту же строку без деталей `(at …)`. | Установите [`oidc.scope_on_refresh: true`](/docs/ru/claude-apps-gateway-config#oidc), доступно в шлюзе v2.1.260 или позже, чтобы запрос refresh снова запрашивал `openid`. Некоторые IdP, такие как Okta, возвращают id\_token при refresh только при явном запросе. На PingFederate вместо этого включите **Return ID Token On Refresh Grant** в разделе **Applications > OAuth > OpenID Connect Policy Management**. Ключ не изменяет поведение PingFederate. Для других IdP, которые всё ещё его опускают, проверьте, принимает ли эндпоинт userinfo access tokens, выданные при refresh. В качестве временного решения поднимите [`session.ttl_hours`](/docs/ru/claude-apps-gateway-config#session). См. [Identity provider setup](#identity-provider-setup) о компромиссе при deprovisioning. |

Details

161 --policy-name read-gateway-secrets --policy-document file://secrets-read.json161 --policy-name read-gateway-secrets --policy-document file://secrets-read.json

162 ```162 ```

163 163 

164 Политика называет один ARN на секрет, а не простой подстановочный знак `gateway-*`, который в общей учётной записи также совпадал бы с несвязанными секретами; конечный `-??????` совпадает ровно с случайным суффиксом из шести символов, который Secrets Manager добавляет к ARN каждого секрета. Конечный `-*` был бы простым глобусом префикса и также совпадал бы с более длинными именами, такими как `gateway-postgres-url-prod`.164 Политика называет один ARN на секрет, а не простой подстановочный знак `gateway-*`, который в общей учётной записи также совпадал бы с несвязанными секретами; конечный `-??????` совпадает ровно с случайным суффиксом из шести символов, который Secrets Manager добавляет к ARN каждого секрета. Конечный `-*` был бы простым глобом префикса и также совпадал бы с более длинными именами, такими как `gateway-postgres-url-prod`.

165 165 

166 Политика IAM предоставляет gateway разрешение на вызов Bedrock, и Bedrock включает доступ к модели по умолчанию в коммерческих регионах. Оставшиеся ворота на уровне учётной записи — это одноразовая форма использования Anthropic: если никто в вашей учётной записи её не отправил, откройте [консоль Amazon Bedrock](https://console.aws.amazon.com/bedrock/), выберите модель Anthropic из каталога моделей и заполните форму. Доступ предоставляется сразу после отправки; см. [Claude Code на Amazon Bedrock](/docs/ru/amazon-bedrock#1-submit-use-case-details) для формы AWS Organizations и разрешений IAM, которые нужны отправителю.166 Политика IAM предоставляет gateway разрешение на вызов Bedrock, и Bedrock включает доступ к модели по умолчанию в коммерческих регионах. Оставшиеся ворота на уровне учётной записи — это одноразовая форма использования Anthropic: если никто в вашей учётной записи её не отправил, откройте [консоль Amazon Bedrock](https://console.aws.amazon.com/bedrock/), выберите модель Anthropic из каталога моделей и заполните форму. Доступ предоставляется сразу после отправки; см. [Claude Code на Amazon Bedrock](/docs/ru/amazon-bedrock#1-submit-use-case-details) для формы AWS Organizations и разрешений IAM, которые нужны отправителю.

167 167 


169 </Step>169 </Step>

170 170 

171 <Step title="Подготовьте Amazon RDS для PostgreSQL">171 <Step title="Подготовьте Amazon RDS для PostgreSQL">

172 Экземпляр работает в приватных подсетях без публичного адреса и с включённым шифрованием хранилища. Версия движка закреплена на Postgres 16, что удовлетворяет поддерживаемому минимуму gateway PostgreSQL 14 и гарантирует, что семейство группы параметров ниже совпадает с экземпляром.172 Экземпляр работает на Postgres 16 в приватных подсетях без публичного адреса и с включённым шифрованием хранилища.

173 173 

174 Сначала создайте группу подсетей, которая размещает базу данных в приватных подсетях, и группу параметров с `rds.force_ssl=1`, чтобы сервер отклонял открытые соединения. Версия движка закреплена один раз, потому что семейство группы параметров должно совпадать с основной версией движка, которую запускает экземпляр:174 Сначала создайте группу подсетей, которая размещает базу данных в приватных подсетях, и группу параметров с `rds.force_ssl=1`, чтобы сервер отклонял открытые соединения. Версия движка закреплена один раз, потому что семейство группы параметров должно совпадать с основной версией движка, которую запускает экземпляр:

175 175 


203 203 

204 Буквальный аргумент `--master-user-password` виден в таблице процессов и в журналах аудита/EDR во время выполнения команды, то же самое воздействие, которое охватывает примечание шага секретов. На общем или контролируемом хосте передайте пароль через `--cli-input-json` из файла `0600` вместо этого, так же как это делает `setup.sh` пакета.204 Буквальный аргумент `--master-user-password` виден в таблице процессов и в журналах аудита/EDR во время выполнения команды, то же самое воздействие, которое охватывает примечание шага секретов. На общем или контролируемом хосте передайте пароль через `--cli-input-json` из файла `0600` вместо этого, так же как это делает `setup.sh` пакета.

205 205 

206 Дождитесь, пока экземпляр запустится, что может занять несколько минут, затем прочитайте его приватную конечную точку и соберите строку подключения, которую будет использовать gateway:206 Дождитесь, пока экземпляр запустится, что может занять несколько минут, затем прочитайте его приватный эндпоинт и соберите строку подключения, которую будет использовать gateway:

207 207 

208 ```bash theme={null}208 ```bash theme={null}

209 aws rds wait db-instance-available --db-instance-identifier claude-gateway-db209 aws rds wait db-instance-available --db-instance-identifier claude-gateway-db


214 214 

215 `sslmode=verify-full` заставляет gateway проверять цепь сертификата сервера RDS и имя хоста, а не только шифровать. Якорь доверия — это [пакет сертификатов AWS RDS](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem), который шаг сборки образа ниже копирует в `/etc/claude/rds-global-bundle.pem` и доверяет через `NODE_EXTRA_CA_CERTS`. Не добавляйте параметр `sslrootcert=` в стиле libpq к URL: драйвер gateway читает только `sslmode` из строки запроса и передал бы `sslrootcert` Postgres как параметр запуска, который сервер отклоняет.215 `sslmode=verify-full` заставляет gateway проверять цепь сертификата сервера RDS и имя хоста, а не только шифровать. Якорь доверия — это [пакет сертификатов AWS RDS](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem), который шаг сборки образа ниже копирует в `/etc/claude/rds-global-bundle.pem` и доверяет через `NODE_EXTRA_CA_CERTS`. Не добавляйте параметр `sslrootcert=` в стиле libpq к URL: драйвер gateway читает только `sslmode` из строки запроса и передал бы `sslrootcert` Postgres как параметр запуска, который сервер отклоняет.

216 216 

217 Сервис ECS или поды EKS должны работать в этом VPC, чтобы они могли достичь приватной конечной точки экземпляра, и группа безопасности `claude-gateway-db` допускает только группу безопасности gateway.217 Сервис ECS или поды EKS должны работать в этом VPC, чтобы они могли достичь приватного эндпоинта экземпляра, и группа безопасности `claude-gateway-db` допускает только группу безопасности gateway.

218 </Step>218 </Step>

219 219 

220 <Step title="Напишите gateway.yaml">220 <Step title="Напишите gateway.yaml">


223 Два поля `listen` описывают, что находится перед gateway:223 Два поля `listen` описывают, что находится перед gateway:

224 224 

225 * `public_url`: внешний источник `https://`, требуется для любого привязывания, отличного от loopback; см. [справочник `listen`](/docs/ru/claude-apps-gateway-config#listen). Gateway строит `redirect_uri` IdP и его документ обнаружения только из этого значения, никогда из заголовков `X-Forwarded-*`.225 * `public_url`: внешний источник `https://`, требуется для любого привязывания, отличного от loopback; см. [справочник `listen`](/docs/ru/claude-apps-gateway-config#listen). Gateway строит `redirect_uri` IdP и его документ обнаружения только из этого значения, никогда из заголовков `X-Forwarded-*`.

226 * `trusted_proxies`: диапазоны источников фронтенда. Gateway соблюдает `X-Forwarded-For` только когда TCP-пир находится в этом списке, затем проходит цепь мимо доверенных переходов, поэтому ограничения скорости входа на IP и события аудита записывают IP разработчиков вместо load balancer.226 * `trusted_proxies`: диапазоны источников фронтенда. Gateway соблюдает `X-Forwarded-For` только когда TCP-пир находится в этом списке, затем проходит цепь мимо доверенных переходов, поэтому ограничения частоты запросов на вход по IP и события аудита записывают IP разработчиков вместо load balancer.

227 227 

228 На обоих треках фронтенд — это внутренний ALB, создан ли он напрямую или AWS Load Balancer Controller, и узлы ALB берут адреса из подсетей, к которым он присоединён, поэтому установите `trusted_proxies` на CIDR этих подсетей. Это доверяет каждому хосту в этих подсетях как прокси. Не допускайте, чтобы источник входа ALB, ваша корпоративная CIDR, перекрывался с ними, и не делитесь подсетями с ненадёжными рабочими нагрузками, которые могли бы подделать IP клиентов через `X-Forwarded-For`.228 На обоих треках фронтенд — это внутренний ALB, создан ли он напрямую или AWS Load Balancer Controller, и узлы ALB берут адреса из подсетей, к которым он присоединён, поэтому установите `trusted_proxies` на CIDR этих подсетей. Это доверяет каждому хосту в этих подсетях как прокси. Не допускайте, чтобы источник входа ALB, ваша корпоративная CIDR, перекрывался с ними, и не делитесь подсетями с ненадёжными рабочими нагрузками, которые могли бы подделать IP клиентов через `X-Forwarded-For`.

229 229 

230 Атрибут сохранения клиентского порта ALB, `routing.http.xff_client_port.enabled`, может остаться в любом параметре: с ним включённым, ALB записывает клиента как `203.0.113.7:54321` или `[2001:db8::1]:54321`, и gateway читает оба с опущенным портом.230 Атрибут сохранения клиентского порта ALB, `routing.http.xff_client_port.enabled`, может остаться в любой настройке: с ним включённым, ALB записывает клиента как `203.0.113.7:54321` или `[2001:db8::1]:54321`, и gateway читает оба с опущенным портом.

231 231 

232 ```yaml gateway.yaml theme={null}232 ```yaml gateway.yaml theme={null}

233 listen:233 listen:


244 # Сервер авторизации организации Okta возвращает тонкий id_token, который опускает244 # Сервер авторизации организации Okta возвращает тонкий id_token, который опускает

245 # email и groups; gateway заполняет их из /userinfo.245 # email и groups; gateway заполняет их из /userinfo.

246 userinfo_fallback: true246 userinfo_fallback: true

247 # Okta выдаёт groups только когда запрашивается область `groups` и247 # Okta выдаёт groups только когда запрашивается scope `groups` и

248 # фильтр утверждения groups приложения их позволяет.248 # фильтр утверждения groups приложения их позволяет.

249 scopes: [openid, profile, email, offline_access, groups]249 scopes: [openid, profile, email, offline_access, groups]

250 250 


267 ```267 ```

268 268 

269 <Note>269 <Note>

270 Только блок `oidc` специфичен для Okta. Чтобы использовать Microsoft Entra ID вместо этого, установите `issuer` на `https://login.microsoftonline.com/<tenant-id>/v2.0`, удалите `userinfo_fallback` и область `groups`, и обратите внимание, что Entra выдаёт Object ID группы, а не имена, поэтому [`managed.policies`](/docs/ru/claude-apps-gateway-config#managed) должны совпадать на GUID, или на App Roles с `oidc.groups_claim: roles`. См. [Настройка поставщика идентификации](/docs/ru/claude-apps-gateway-deploy#identity-provider-setup).270 Только блок `oidc` специфичен для Okta. Чтобы использовать Microsoft Entra ID вместо этого, установите `issuer` на `https://login.microsoftonline.com/<tenant-id>/v2.0`, удалите `userinfo_fallback` и scope `groups`, и обратите внимание, что Entra выдаёт Object ID группы, а не имена, поэтому [`managed.policies`](/docs/ru/claude-apps-gateway-config#managed) должны совпадать на GUID, или на App Roles с `oidc.groups_claim: roles`. См. [Настройка поставщика идентификации](/docs/ru/claude-apps-gateway-deploy#identity-provider-setup).

271 </Note>271 </Note>

272 </Step>272 </Step>

273 273 


289 Буквальные аргументы `--secret-string` видны в таблице процессов и в журналах аудита/EDR во время выполнения каждой команды. На общем или контролируемом хосте поместите значение в файл `0600` и передайте `--secret-string file://<path>` вместо этого. `setup.sh` пакета держит значения секретов вне argv процесса так же, передавая временные файлы `0600` в `--cli-input-json`.289 Буквальные аргументы `--secret-string` видны в таблице процессов и в журналах аудита/EDR во время выполнения каждой команды. На общем или контролируемом хосте поместите значение в файл `0600` и передайте `--secret-string file://<path>` вместо этого. `setup.sh` пакета держит значения секретов вне argv процесса так же, передавая временные файлы `0600` в `--cli-input-json`.

290 </Note>290 </Note>

291 291 

292 В отличие от секретов, сам `gateway.yaml` не содержит значений секретов, потому что каждое учётное данные разрешается при загрузке через [`${VAR}` или `${file:...}` расширение](/docs/ru/claude-apps-gateway-config#secret-expansion). Как всё достигает контейнера, отличается по треку:292 В отличие от секретов, сам `gateway.yaml` не содержит значений секретов, потому что все учётные данные разрешаются при загрузке через [`${VAR}` или `${file:...}` расширение](/docs/ru/claude-apps-gateway-config#secret-expansion). Как всё достигает контейнера, отличается по треку:

293 293 

294 * На ECS, сборка следующего шага копирует `gateway.yaml` в образ в `/etc/claude/gateway.yaml`, и определение задачи внедряет три секрета как переменные окружения через его поле `secrets`, поэтому YAML ссылается на `${GATEWAY_JWT_SECRET}`, `${OIDC_CLIENT_SECRET}` и `${GATEWAY_POSTGRES_URL}`.294 * На ECS, сборка следующего шага копирует `gateway.yaml` в образ в `/etc/claude/gateway.yaml`, и определение задачи внедряет три секрета как переменные окружения через его поле `secrets`, поэтому YAML ссылается на `${GATEWAY_JWT_SECRET}`, `${OIDC_CLIENT_SECRET}` и `${GATEWAY_POSTGRES_URL}`.

295 * На EKS, смонтируйте `gateway.yaml` из ConfigMap и секреты как файлы в `/secrets`, на которые ссылаются как `${file:/secrets/...}`. Получите Kubernetes Secrets из Secrets Manager с External Secrets Operator или поставщиком AWS драйвера Secrets Store CSI, или создайте их напрямую с помощью `kubectl`.295 * На EKS, смонтируйте `gateway.yaml` из ConfigMap и секреты как файлы в `/secrets`, на которые ссылаются как `${file:/secrets/...}`. Получите Kubernetes Secrets из Secrets Manager с External Secrets Operator или поставщиком AWS драйвера Secrets Store CSI, или создайте их напрямую с помощью `kubectl`.


298 <Step title="Соберите и отправьте образ в Amazon ECR">298 <Step title="Соберите и отправьте образ в Amazon ECR">

299 Соберите образ согласно [требованиям образа контейнера](/docs/ru/claude-apps-gateway-deploy#container-image), разместив двоичный файл `linux-x64` glibc в `./claude` в контексте сборки. Напишите свой собственный Dockerfile согласно этим требованиям или начните с [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/examples/gateway/aws/Dockerfile) пакета, который копирует заполненный `gateway.yaml` из предыдущих шагов в образ в `/etc/claude/gateway.yaml`. На ECS эта встроенная копия — это то, как конфигурация достигает контейнера, поэтому сборка идёт после написания файла. Трек EKS вместо этого монтирует `gateway.yaml` из ConfigMap при развёртывании, поэтому встроенная копия там не используется.299 Соберите образ согласно [требованиям образа контейнера](/docs/ru/claude-apps-gateway-deploy#container-image), разместив двоичный файл `linux-x64` glibc в `./claude` в контексте сборки. Напишите свой собственный Dockerfile согласно этим требованиям или начните с [`Dockerfile`](https://github.com/anthropics/claude-code/blob/main/examples/gateway/aws/Dockerfile) пакета, который копирует заполненный `gateway.yaml` из предыдущих шагов в образ в `/etc/claude/gateway.yaml`. На ECS эта встроенная копия — это то, как конфигурация достигает контейнера, поэтому сборка идёт после написания файла. Трек EKS вместо этого монтирует `gateway.yaml` из ConfigMap при развёртывании, поэтому встроенная копия там не используется.

300 300 

301 Образ также содержит пакет сертификатов AWS RDS как якорь доверия для `sslmode=verify-full` строки подключения, поэтому загрузите его в контекст сборки сначала. AWS ротирует пакет (новые региональные CA добавляются), поэтому загружайте его при каждой сборке, а не закрепляйте контрольную сумму или фиксируйте её:301 Образ также содержит пакет сертификатов AWS RDS как якорь доверия для `sslmode=verify-full` строки подключения, поэтому загрузите его в контекст сборки сначала. AWS ротирует пакет (новые региональные CA добавляются), поэтому загружайте его при каждой сборке, а не закрепляйте контрольную сумму или фиксируйте его:

302 302 

303 ```bash theme={null}303 ```bash theme={null}

304 curl -fL --proto '=https' -o rds-global-bundle.pem \304 curl -fL --proto '=https' -o rds-global-bundle.pem \

305 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem305 https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

306 ```306 ```

307 307 

308 Требования образа контейнера не охватывают пакет, поэтому если вы напишете свой собственный Dockerfile, добавьте две строки, которые копируют и доверяют ему; `Dockerfile` пакета уже включает оба:308 Требования образа контейнера не охватывают пакет, поэтому если вы напишете свой собственный Dockerfile, добавьте две строки, которые копируют и доверяют ему; `Dockerfile` пакета уже включает обе:

309 309 

310 ```dockerfile theme={null}310 ```dockerfile theme={null}

311 COPY rds-global-bundle.pem /etc/claude/rds-global-bundle.pem311 COPY rds-global-bundle.pem /etc/claude/rds-global-bundle.pem

312 ENV NODE_EXTRA_CA_CERTS=/etc/claude/rds-global-bundle.pem312 ENV NODE_EXTRA_CA_CERTS=/etc/claude/rds-global-bundle.pem

313 ```313 ```

314 314 

315 Создайте репозиторий ECR и подпишите Docker в него. Неизменяемые теги означают, что тег `<version>`, который закрепляет шаг развёртывания, не может позже молча переуказываться на другой образ:315 Создайте репозиторий ECR и выполните вход Docker в него. Неизменяемые теги означают, что тег `<version>`, который закрепляет шаг развёртывания, не может позже молча переуказываться на другой образ:

316 316 

317 ```bash theme={null}317 ```bash theme={null}

318 aws ecr create-repository --repository-name claude-gateway \318 aws ecr create-repository --repository-name claude-gateway \


401 401 

402 Добавьте слушатель HTTPS. `--ssl-policy` закрепляет современный минимум TLS, так как его опущение возвращается к устаревшему значению по умолчанию `ELBSecurityPolicy-2016-08`, которое всё ещё принимает TLS 1.0/1.1.402 Добавьте слушатель HTTPS. `--ssl-policy` закрепляет современный минимум TLS, так как его опущение возвращается к устаревшему значению по умолчанию `ELBSecurityPolicy-2016-08`, которое всё ещё принимает TLS 1.0/1.1.

403 403 

404 ALB закрывает соединение после 60 секунд без данных по умолчанию. Keepalive пинги gateway держат потоки внутри этого значения по умолчанию, поэтому повышение времени ожидания добавляет запас выше кадра пинга; строка [Troubleshooting](#troubleshooting) на разорванных потоках охватывает механизм и более старые gateway. Команды ниже добавляют слушатель и повышают время ожидания:404 ALB закрывает соединение после 60 секунд без данных по умолчанию. Keepalive пинги gateway держат потоки внутри этого значения по умолчанию, поэтому повышение таймаута добавляет запас выше частоты пингов; строка [Устранение неполадок](#troubleshooting) о разорванных потоках охватывает механизм и более старые gateway. Команды ниже добавляют слушатель и повышают таймаут:

405 405 

406 ```bash theme={null}406 ```bash theme={null}

407 aws elbv2 create-listener --load-balancer-arn "$ALB_ARN" \407 aws elbv2 create-listener --load-balancer-arn "$ALB_ARN" \


414 --attributes Key=idle_timeout.timeout_seconds,Value=3600414 --attributes Key=idle_timeout.timeout_seconds,Value=3600

415 ```415 ```

416 416 

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

418 418 

419 ```bash theme={null}419 ```bash theme={null}

420 aws ecs create-service --cluster claude-gateway --service-name claude-gateway \420 aws ecs create-service --cluster claude-gateway --service-name claude-gateway \


425 --load-balancers "targetGroupArn=$TG_ARN,containerName=gateway,containerPort=8080"425 --load-balancers "targetGroupArn=$TG_ARN,containerName=gateway,containerPort=8080"

426 ```426 ```

427 427 

428 Период благодати в 60 секунд даёт холодной задаче время на извлечение образа, подключение к хранилищу и ответ на первую проверку здоровья перед тем, как ECS начнёт считать отказы против развёртывания. Проверка здоровья целевой группы на `GET /readyz` проверяет, что хранилище доступно, поэтому задача, которая не может достичь Postgres, никогда не входит в ротацию. Чтобы держать задачи проходящими проверку через короткий сбой базы данных, такой как отказ RDS, установите `store.readiness_grace_seconds`, как описано в [Поведение при сбое](/docs/ru/claude-apps-gateway-deploy#outage-behavior), которое также охватывает альтернативу `/healthz`.428 Период благодати в 60 секунд даёт холодной задаче время на извлечение образа, подключение к хранилищу и ответ на первую проверку здоровья перед тем, как ECS начнёт считать отказы против развёртывания.

429 429 

430 Задачи работают в приватных подсетях без публичного IP, поэтому весь исходящий трафик (в Bedrock, ваш IdP, Secrets Manager, ECR и CloudWatch Logs) проходит через NAT gateway. Чтобы держать трафик Bedrock вне публичного пути, создайте интерфейсную конечную точку VPC `bedrock-runtime` и укажите `base_url` upstream на неё, как показано в [справочнике upstream Bedrock](/docs/ru/claude-apps-gateway-config#amazon-bedrock); IdP всё ещё нуждается в исходящем доступе в интернет.430 Проверка здоровья целевой группы на `GET /readyz` проверяет, что хранилище доступно, поэтому задача, которая не может достичь Postgres, никогда не входит в ротацию. Чтобы держать задачи проходящими проверку через короткий сбой базы данных, такой как отказ RDS, установите `store.readiness_grace_seconds`, как описано в [Поведение при сбое](/docs/ru/claude-apps-gateway-deploy#outage-behavior), которое также охватывает альтернативу `/healthz`.

431 

432 Задачи работают в приватных подсетях без публичного IP, поэтому весь исходящий трафик (в Bedrock, ваш IdP, Secrets Manager, ECR и CloudWatch Logs) проходит через NAT gateway. Чтобы держать трафик Bedrock вне публичного пути, создайте интерфейсный эндпоинт VPC `bedrock-runtime` и укажите `base_url` upstream на него, как показано в [справочнике upstream Bedrock](/docs/ru/claude-apps-gateway-config#amazon-bedrock); IdP всё ещё нуждается в исходящем доступе в интернет.

431 433 

432 Завершите, дав разработчикам приватно разрешаемое имя хоста: в приватной зоне Route 53 создайте псевдоним внутреннего имени DNS gateway на ALB и установите `listen.public_url` на это имя хоста. Собственное имя `*.elb.amazonaws.com` ALB разрешается на приватные адреса на внутреннем ALB, но оно не может нести ваш сертификат ACM, поэтому используйте своё имя.434 Завершите, дав разработчикам приватно разрешаемое имя хоста: в приватной зоне Route 53 создайте псевдоним внутреннего имени DNS gateway на ALB и установите `listen.public_url` на это имя хоста. Собственное имя `*.elb.amazonaws.com` ALB разрешается на приватные адреса на внутреннем ALB, но оно не может нести ваш сертификат ACM, поэтому используйте своё имя.

433 435 

434 Обновите URI перенаправления авторизованного клиента OAuth на `<public_url>/oauth/callback` перед первым входом. После изменения `public_url`, пересоберите и отправьте образ под новым тегом, зарегистрируйте новую редакцию определения задачи и переразвёртывайте. На ECS параметр живёт в встроенном `gateway.yaml` образа, и gateway строит свой публичный источник только из этого параметра, игнорируя `X-Forwarded-Host` и `X-Forwarded-Proto`. `X-Forwarded-For` соблюдается для IP клиентов только когда установлен `listen.trusted_proxies`.436 Обновите URI перенаправления авторизованного клиента OAuth на `<public_url>/oauth/callback` перед первым входом. После изменения `public_url`, пересоберите и отправьте образ под новым тегом, зарегистрируйте новую редакцию определения задачи и переразвёртывайте. На ECS настройка живёт во встроенном `gateway.yaml` образа, и gateway строит свой публичный источник только из этой настройки, игнорируя `X-Forwarded-Host` и `X-Forwarded-Proto`. `X-Forwarded-For` соблюдается для IP клиентов только когда установлен `listen.trusted_proxies`.

435 </Tab>437 </Tab>

436 438 

437 <Tab title="EKS">439 <Tab title="EKS">

438 Этот трек нуждается в установленных `kubectl` и `eksctl` локально, и существующем кластере EKS с поставщиком IAM OIDC и установленным AWS Load Balancer Controller. Кластер должен быть на `$VPC_ID`, чтобы поды могли достичь приватной конечной точки RDS, и группа безопасности `claude-gateway-db` должна допускать группу безопасности пода или узла кластера вместо `$GW_SG`.440 Этот трек нуждается в установленных `kubectl` и `eksctl` локально, и существующем кластере EKS с поставщиком IAM OIDC и установленным AWS Load Balancer Controller. Кластер должен быть на `$VPC_ID`, чтобы поды могли достичь приватного эндпоинта RDS, и группа безопасности `claude-gateway-db` должна допускать группу безопасности пода или узла кластера вместо `$GW_SG`.

439 441 

440 На EKS gateway получает свои учётные данные Bedrock через IRSA, а не роли ECS. Политика доверия `ecs-tasks.amazonaws.com` из шага IAM не применяется здесь; IRSA нуждается в роли, чья политика доверия федерирует на поставщика OIDC кластера, ограниченном `system:serviceaccount:claude-gateway:gateway`. `eksctl create iamserviceaccount` создаёт эту роль, присоединяет политики и аннотирует учётную запись сервиса Kubernetes с ARN роли в один шаг. Превратите два документа политики из шага IAM в управляемые политики, которые он может присоединить:442 На EKS gateway получает свои учётные данные Bedrock через IRSA, а не роли ECS. Политика доверия `ecs-tasks.amazonaws.com` из шага IAM не применяется здесь; IRSA нуждается в роли, чья политика доверия федерирует на поставщика OIDC кластера, ограниченной `system:serviceaccount:claude-gateway:gateway`. `eksctl create iamserviceaccount` создаёт эту роль, присоединяет политики и аннотирует учётную запись сервиса Kubernetes с ARN роли в один шаг. Превратите два документа политики из шага IAM в управляемые политики, которые он может присоединить:

441 443 

442 ```bash theme={null}444 ```bash theme={null}

443 BEDROCK_POLICY_ARN="$(aws iam create-policy --policy-name claude-gateway-bedrock-invoke \445 BEDROCK_POLICY_ARN="$(aws iam create-policy --policy-name claude-gateway-bedrock-invoke \


464 Для фронтенда, Ingress, управляемый AWS Load Balancer Controller, предусматривает внутренний ALB. Аннотируйте его с:466 Для фронтенда, Ingress, управляемый AWS Load Balancer Controller, предусматривает внутренний ALB. Аннотируйте его с:

465 467 

466 * `alb.ingress.kubernetes.io/scheme: internal` и `alb.ingress.kubernetes.io/target-type: ip`468 * `alb.ingress.kubernetes.io/scheme: internal` и `alb.ingress.kubernetes.io/target-type: ip`

467 * `alb.ingress.kubernetes.io/ip-address-type: ipv4`, поэтому записи AAAA общественного диапазона не публикуются для проверки приватной сети `/login` [private-network check](/docs/ru/claude-apps-gateway#prerequisites) отклонить469 * `alb.ingress.kubernetes.io/ip-address-type: ipv4`, чтобы не публиковались записи AAAA общественного диапазона, которые [проверка приватной сети](/docs/ru/claude-apps-gateway#prerequisites) `/login` отклонила бы

468 * `alb.ingress.kubernetes.io/inbound-cidrs: <your-corporate-cidr>`, поэтому контроллер-управляемая группа безопасности фронтенда допускает только вашу корпоративную сеть вместо значения по умолчанию `0.0.0.0/0`470 * `alb.ingress.kubernetes.io/inbound-cidrs: <your-corporate-cidr>`, поэтому контроллер-управляемая группа безопасности фронтенда допускает только вашу корпоративную сеть вместо значения по умолчанию `0.0.0.0/0`

469 * `alb.ingress.kubernetes.io/certificate-arn` с сертификатом ACM471 * `alb.ingress.kubernetes.io/certificate-arn` с сертификатом ACM

470 * `alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS13-1-2-2021-06`, поэтому слушатель не возвращается к устаревшей политике по умолчанию, которая принимает TLS 1.0 и 1.1472 * `alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS13-1-2-2021-06`, поэтому слушатель не возвращается к устаревшей политике по умолчанию, которая принимает TLS 1.0 и 1.1

471 * `alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=3600`, запас выше keepalive потоков gateway; см. [Troubleshooting](#troubleshooting)473 * `alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=3600`, запас выше keepalive потоковой передачи gateway; см. [Устранение неполадок](#troubleshooting)

472 474 

473 С IRSA, AWS SDK читает спроецированный токен учётной записи сервиса и обменивает его с AWS STS, поэтому под никогда не нуждается в сервисе метаданных экземпляра EC2; NetworkPolicy исходящего трафика может блокировать `169.254.169.254` для подов gateway. Проблема с лимитом переходов узла в [Troubleshooting](#troubleshooting) ниже применяется только к кластерам, которые пропускают IRSA и полагаются на роли экземпляра узла.475 С IRSA, AWS SDK читает спроецированный токен учётной записи сервиса и обменивает его с AWS STS, поэтому под никогда не нуждается в сервисе метаданных экземпляра EC2; NetworkPolicy исходящего трафика может блокировать `169.254.169.254` для подов gateway. Проблема с лимитом переходов узла в разделе [Устранение неполадок](#troubleshooting) ниже применяется только к кластерам, которые пропускают IRSA и полагаются на роли экземпляра узла.

474 </Tab>476 </Tab>

475 </Tabs>477 </Tabs>

476 </Step>478 </Step>

477 479 

478 <Step title="Отправьте URL gateway на машины разработчиков">480 <Step title="Отправьте URL gateway на машины разработчиков">

479 Gateway теперь работает, но разработчики не могут достичь его из `/login` до тех пор, пока URL gateway не будет на их машинах. Установите `forceLoginMethod` и `forceLoginGatewayUrl` в [файле управляемых параметров](/docs/ru/claude-apps-gateway#set-the-gateway-url), который вы развёртываете на каждом устройстве через MDM. Нет опции gateway в средстве выбора входа для разработчика, чтобы выбрать вручную.481 Gateway теперь работает, но разработчики не могут достичь его из `/login` до тех пор, пока URL gateway не будет на их машинах. Установите `forceLoginMethod` и `forceLoginGatewayUrl` в [файле управляемых настроек](/docs/ru/claude-apps-gateway#set-the-gateway-url), который вы развёртываете на каждом устройстве через MDM. Нет опции gateway в средстве выбора входа для разработчика, чтобы выбрать вручную.

480 </Step>482 </Step>

481</Steps>483</Steps>

482 484 

sessions.md +3 −3

Details

83* Терминал: `claude --continue`, `claude --resume <session-id>` или `claude --resume <name>`, когда имя соответствует одному сеансу, без `-p`. Claude Code восстанавливает режим разрешений, в котором находился сеанс, за исключением случаев в таблице. Передайте `--permission-mode` или `--dangerously-skip-permissions`, чтобы переопределить восстановленный режим.83* Терминал: `claude --continue`, `claude --resume <session-id>` или `claude --resume <name>`, когда имя соответствует одному сеансу, без `-p`. Claude Code восстанавливает режим разрешений, в котором находился сеанс, за исключением случаев в таблице. Передайте `--permission-mode` или `--dangerously-skip-permissions`, чтобы переопределить восстановленный режим.

84* Неинтерактивный: `claude -p --resume` или `claude -p --continue`. Claude Code запускает выполнение в режиме разрешений, в котором запустился бы новый запуск `claude -p`, за исключением того, что сеанс, который завершился в режиме Plan Mode, возобновляется в режиме Plan Mode при [условиях ниже](#resume-in-plan-mode-with-p).84* Неинтерактивный: `claude -p --resume` или `claude -p --continue`. Claude Code запускает выполнение в режиме разрешений, в котором запустился бы новый запуск `claude -p`, за исключением того, что сеанс, который завершился в режиме Plan Mode, возобновляется в режиме Plan Mode при [условиях ниже](#resume-in-plan-mode-with-p).

85* VS Code: панель диалога расширения. Таблица охватывает только диалог, который завершился в режиме Plan Mode; для остального см. [возобновление прошлых диалогов](/docs/ru/vs-code#resume-past-conversations).85* VS Code: панель диалога расширения. Таблица охватывает только диалог, который завершился в режиме Plan Mode; для остального см. [возобновление прошлых диалогов](/docs/ru/vs-code#resume-past-conversations).

86* Средство выбора сеансов при запуске: сеанс, который вы выбираете из [средства выбора сеансов](#use-the-session-picker), независимо от того, открыли ли вы его с помощью `claude --resume` отдельно, `claude --from-pr` или имени, которое соответствует более чем одному сеансу. Claude Code не восстанавливает сохранённый режим разрешений. Он запускает сеанс в режиме разрешений, в котором он запустил бы новый сеанс из той же командной строки.86* Средство выбора сессий при запуске: сессия, которую вы выбираете в [средстве выбора сессий](#use-the-session-picker), независимо от того, открыли ли вы его с помощью одного `claude --resume`, `claude --from-pr` или имени, соответствующего нескольким сессиям. Claude Code запускает сессию в том режиме разрешений, в котором запустил бы новую сессию из той же командной строки, за исключением того, что сессия, завершившаяся в режиме планирования, возобновляется в режиме планирования, если вы не передали `--permission-mode`, `--dangerously-skip-permissions` или `--fork-session`. Никакой другой сохранённый режим разрешений не восстанавливается.

87* `/resume` внутри сеанса, с аргументом или без: Claude Code не восстанавливает сохранённый режим разрешений. Диалог, на который вы переключаетесь, продолжается в режиме разрешений, в котором находится ваш текущий сеанс.87* `/resume` внутри сессии, с аргументом или без: диалог, на который вы переключаетесь, продолжается в режиме разрешений вашей текущей сессии, за исключением того, что диалог, завершившийся в режиме планирования, возобновляется в режиме планирования, даже если вы запустили Claude Code с `--permission-mode` или `--dangerously-skip-permissions`. Если этот диалог уже открывался ранее в текущем запуске Claude Code, например диалог, с которого вы начали, или диалог, который вы покинули с помощью `/clear` или `/resume`, он вместо этого продолжается в вашем текущем режиме разрешений.

88 88 

89Восстановление режима Plan Mode на неинтерактивном пути и пути VS Code требует Claude Code v2.1.246 или более поздней версии. Каждая строка называет режим разрешений, в котором завершился сеанс, какой из путей терминала, неинтерактивного и VS Code вы его возобновляете, и режим разрешений, в котором Claude Code запускает возобновлённый сеанс.89Восстановление режима Plan Mode на неинтерактивном пути и пути VS Code требует Claude Code v2.1.246 или более поздней версии. Каждая строка называет режим разрешений, в котором завершился сеанс, какой из путей терминала, неинтерактивного и VS Code вы его возобновляете, и режим разрешений, в котором Claude Code запускает возобновлённый сеанс.

90 90 

91| Сеанс завершился в | Как вы возобновляете | Режим разрешений после возобновления |91| Сеанс завершился в | Как вы возобновляете | Режим разрешений после возобновления |

92| :- | :- | :- |92| :- | :- | :- |

93| `bypassPermissions` | Терминал | Режим разрешений, в котором запустился бы новый сеанс. Чтобы [пропустить разрешения](/docs/ru/permission-modes#skip-all-checks-with-bypasspermissions-mode) снова, включите его при запуске с одним из его флагов запуска или `permissions.defaultMode: "bypassPermissions"` в [пользовательских, `--settings` или управляемых параметрах](/docs/ru/settings-reference#permissions-defaultmode) |93| `bypassPermissions` | Терминал | Режим разрешений, в котором запустился бы новый сеанс. Чтобы [пропустить разрешения](/docs/ru/permission-modes#skip-all-checks-with-bypasspermissions-mode) снова, включите его при запуске с одним из его флагов запуска или `permissions.defaultMode: "bypassPermissions"` в [пользовательских, `--settings` или управляемых параметрах](/docs/ru/settings-reference#permissions-defaultmode) |

94| `plan` | Терминал | Режим разрешений, в котором запустился бы новый сеанс |94| `plan` | Терминал | Режим планирования. С `--fork-session` — режим разрешений, в котором запустилась бы новая сессия |

95| `auto` | Терминал | `auto`, только когда ваша учётная запись всё ещё соответствует [требованиям режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) |95| `auto` | Терминал | `auto`, только когда ваша учётная запись всё ещё соответствует [требованиям режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) |

96| Manual | Терминал | Manual, когда новый сеанс запустился бы в режиме auto из [встроенного значения по умолчанию](/docs/ru/permission-modes#which-mode-a-session-starts-in). Когда `defaultMode` из файла параметров [вступает в силу](/docs/ru/permission-modes#which-mode-a-session-starts-in), Claude Code запускает возобновлённый сеанс в этом режиме вместо этого |96| Manual | Терминал | Manual, когда новый сеанс запустился бы в режиме auto из [встроенного значения по умолчанию](/docs/ru/permission-modes#which-mode-a-session-starts-in). Когда `defaultMode` из файла параметров [вступает в силу](/docs/ru/permission-modes#which-mode-a-session-starts-in), Claude Code запускает возобновлённый сеанс в этом режиме вместо этого |

97| `plan` | Неинтерактивный, при [условиях ниже](#resume-in-plan-mode-with-p) | Режим Plan Mode |97| `plan` | Неинтерактивный, при [условиях ниже](#resume-in-plan-mode-with-p) | Режим Plan Mode |