Enterprise MCP na Bedrock AgentCore z Okta SSO i Trino
Mózg Lambda OAuth, przekaźnik PKCE, brama i środowisko działania AgentCore oraz połączenia Trino dla poszczególnych użytkowników bez wycieku współdzielonych tokenów.
Źródła: Building Enterprise MCP on AWS Bedrock AgentCore: Okta SSO + Trino
To przewodnik pokazuje, jak odbudować proces od surowców do działającego systemu w celu stworzenia Enterprise MCP na AWS Bedrock AgentCore: Okta SSO + Trino. Skupia się on na krokach operacyjnych, wyraźnych sprawdzeniach oraz kodzie, który można bez problemu umieścić w repozytorium, bez konieczności domyślania się intencji. Aby uzyskać ogólny obraz, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności domyślania się ukrytego stanu. Należy rejestrować czas wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom, gdy proces przechodzi z środowiska demonstracyjnego do współdzielonych środowisk.
TL;DR
Krótko mówiąc, przed zmianą kodu należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Należy udostępniać narzędzia o wąskich schematach oraz z wyraźnymi etykietami efektów ubocznych. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim automatycznie je zatwierdzą.
MCP Client → Lambda OAuth Proxy → Bedrock AgentCore Gateway → AgentCore Runtime → Trino
Dlaczego przekazywanie surowego tokena narzędziu powoduje niepowodzenie weryfikacji na poziomie przedsiębiorstwa
Aby zrozumieć, dlaczego przekazywanie surowego tokena do narzędzia powoduje niepowodzenie kontrol korporacyjnych, należy przed modyfikacją kodu zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg działania, jak i ścieżkę naprawczą. Próby ponownych działań, kontrolne procedury ludzkie oraz obsługa wiadomości błędowych stanowią część produktu, a nie elementy dodawane później. Narzędzia o wąskich schematach i wyraźnych etykietach efektów ubocznych powinny być dostępne publicznie. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim dokonają automatycznej aprobaty.
Architektura w pigułce
Dla szybkiego zrozumienia architektury należy przed zmianą kodu określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Należy dostarczać narzędzia o wąskich schematach oraz z wyraźnymi oznaczeniami efektów ubocznych. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim dokonają automatycznej aprobaty. Dla szybkiego zrozumienia architektury należy przed zmianą kodu określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy proces przechodzi z środowiska demonstracyjnego do wspólnych środowisk.
1. Klient MCP
Dla klienta MCP należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury aplikacji. Autoryzacja powinna odbywać się przy bramce, a ponowna autoryzacja – na poziomie przetwarzania danych. Sam token nośny nie stanowi granicy między poszczególnymi użytkownikami.
2. Proxy Lambda MCP („mózg” OAuth)
Dla punktu 2: Proxy Lambda MCP („mózg” OAuth) wymaga zdefiniowania danych wejściowych, osoby odpowiedzialnej za dany krok oraz kryteriów zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu systemu. Należy udokumentować zarówno standardową ścieżkę działania, jak i ścieżkę naprawczą. Próby ponownego wykonania, kontrole ludzkie oraz obsługa wiadomości błędowych stanowią integralną część produktu, a nie elementy dodawane później. Autoryzacja powinna odbywać się przy bramce wejściowej, a ponowna autoryzacja – na poziomie warstwy danych. Sam token nośny nie stanowi granicy między poszczególnymi użytkownikami.
3. AWS Bedrock AgentCore Gateway
Dla punktu 3. – bramy AWS Bedrock AgentCore Gateway – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, łatwe do przetestowania jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powinno to wskazywać na konkretną przyczynę, a nie na skomplikowaną strukturę procesu. Autoryzuj się przy bramie, a ponownie udziel uprawnień na poziomie warstwy danych. Sam token nie stanowi granicy pomiędzy poszczególnymi użytkownikami. Dla punktu 3. – bramy AWS Bedrock AgentCore Gateway – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czas trwania operacji oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy proces przechodzi z środowiska demonstracyjnego do współdzielonych środowisk.
4. AWS Bedrock AgentCore Runtime
W przypadku AWS Bedrock AgentCore Runtime należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać oddzielnie od kodu aplikacji. Pliki środowiskowe, magazyny tajemnic oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Dla każdego wywołania należy rejestrować nazwę narzędzia, hash argumentów, czas opóźnienia oraz wynik. Bez takich informacji debugowanie pętli agenta trwa godzinami.
Proces autoryzacji od początku do końca
Dla pełnego procesu autoryzacji należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną etap oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić daną etap od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Zapisuj nazwę narzędzia, hash argumentów, czas opóźnienia oraz wynik każdego wywołania. Bez takich informacji debugowanie agenta trwa godzinami.
┌─────────────────────┐
│ MCP Client │
│ Claude / Claude Code│
└──────────┬──────────┘
│
│ OAuth 2.1 + PKCE
▼
┌─────────────────────┐
│ Lambda MCP Proxy │◄──────────────► Okta
│ OAuth / Identity │ Login + JWT
└──────────┬──────────┘
│
│ Bearer JWT
▼
┌─────────────────────────────┐
│ Bedrock AgentCore Gateway │
│ CUSTOM_JWT validation │
└────────────┬────────────────┘
│ SigV4
▼
┌─────────────────────────────┐
│ Bedrock AgentCore Runtime │
│ FastMCP Server │
│ │
│ list_catalogs │
│ describe_table │
│ execute_query │
└────────────┬────────────────┘
│
│ User JWT
▼
┌─────────────────────────────┐
│ Enterprise Query Engine │
│ Per-user authorization │
└─────────────────────────────┘
Szczegółowe omówienie 1: Nauczanie proxy Lambda mowy OAuth 2.1
Dla zagłębienia 1: Nauczanie proxy Lambda mówienia w języku OAuth 2.1 – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Lepiej używać małych, testowalnych jednostek niż rozbudowanych skryptów. Gdy dany krok zawiedzie, powód awarii powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesu. Zapisywać nazwę narzędzia, hash argumentów, czas reakcji oraz wynik każdego wywołania. Bez tych informacji debugowanie pętli agenta trwa godzinami. Dla zagłębienia 1: Nauczanie proxy Lambda mówienia w języku OAuth 2.1 – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Rejestrować czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom w trakcie realizacji procesu.
przechodzi z środowiska demonstracyjnego do współdzielonych środowisk.# GET /.well-known/protected-resource
{
"resource": f"{BASE_URL}/mcp",
"authorization_servers": [BASE_URL],
}
# GET /.well-known/oauth-authorization-server
{
"issuer": BASE_URL,
"authorization_endpoint": f"{BASE_URL}/authorize",
"token_endpoint": f"{BASE_URL}/token",
"registration_endpoint": f"{BASE_URL}/register",
"response_types_supported": ["code"],
"grant_types_supported": ["authorization_code", "refresh_token"],
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["none"],
}
Przekierowywanie PKCE bez jego uszkodzenia
Aby przekierowywać PKCE bez jego uszkodzenia, należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić tę czynność od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Należy udostępniać narzędzia o wąskich schematach oraz z wyraźnymi etykietami efektów ubocznych. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim dokonają automatycznej aprobaty.
relay_payload = json.dumps({"u": original_redirect, "s": original_state}).encode()
relay_state = base64.urlsafe_b64encode(relay_payload).decode().rstrip("=")
params = {
"client_id": OKTA_CLIENT_ID,
"response_type": "code",
"redirect_uri": f"{BASE_URL}/callback", # <- proxy's callback
"state": relay_state, # <- client's state, wrapped
"code_challenge": qs["code_challenge"], # <- untouched
"code_challenge_method": "S256",
}
Dynamiczna rejestracja klienta
Dla dynamicznej rejestracji klientów należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędowych stanowią część produktu, a nie elementy dodawane później. Należy udostępnić narzędzia o wąskich schematach oraz z wyraźnymi etykietami opisującymi efekty uboczne. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim dokonają automatycznej aprobaty.
def handle_register(event):
req = json.loads(event.get("body") or "{}")
return _json_resp(201, {
"client_id": OKTA_CLIENT_ID,
"redirect_uris": req.get("redirect_uris", []),
"grant_types": req.get("grant_types", ["authorization_code"]),
"response_types": req.get("response_types", ["code"]),
"token_endpoint_auth_method": "none",
})
Szczegółowe omówienie 2: Problemy występujące, gdy FastMCP znajdował się za AgentCore
Dla Deep dive 2: Zaobserwowano problemy, gdy FastMCP znajdował się za AgentCore – przed zmianą kodu należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, łatwe do przetestowania jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowaną strukturę procesu. Należy udostępniać narzędzia o wąskich schematach oraz z wyraźnymi etykietami efektów ubocznych. Hostowie muszą wiedzieć, które wywołania zmieniają stan, zanim automatycznie je zatwierdzą. Dla Deep dive 2: Zaobserwowano problemy, gdy FastMCP znajdował się za AgentCore – przed zmianą kodu należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić dany krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy rejestrować czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega problemom.
Niespodziewane rachunki po przeniesieniu ścieżki z wersji demo do środowisk współdzielonych.
Ostrze numer 1: Żadne niestandardowe nagłówki HTTP nie docierają do kontenera
W przypadku ostrza numer 1: Żadne niestandardowe nagłówki HTTP nie docierają do kontenera – należy zdefiniować dane wejściowe, właściciela kroku oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Autoryzacja powinna odbywać się przy bramce, a ponowna autoryzacja – na poziomie warstwy danych. Sam token nośny nie stanowi granicy między usługami.
meta = payload.setdefault("params", {}).setdefault("_meta", {})
meta["okta_token"] = token # the validated user identity
meta["trino_target"] = routing_hint # optional routing metadata
class CredentialExtractMiddleware:
async def __call__(self, scope, receive, send):
# buffer the whole body
body = await _read_full_body(receive)
# pull identity out of params._meta
meta = json.loads(body).get("params", {}).get("_meta", {})
token = meta.get("okta_token") # AgentCore also injects the validated caller token as a header —
# prefer that when present, fall back to _meta / Authorization otherwise
token = token or _caller_token_from_headers(scope) _req_okta_token.set(token) # replay the buffered body so the MCP app can read it too
await self.app(scope, _replay(body, receive), send)
Ostrze numer 2: AgentCore usuwa nagłówek Accept
Dla ostrego krawędzi nr 2: AgentCore usuwa nagłówek Accept, określa dane wejściowe, właściciela kroku oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Dokumentuj razem ścieżkę pomyślną oraz ścieżkę naprawczą. Próby ponowne, kontrola ludzka oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później.
Uwierzytelniaj się przy bramce, a ponownie autoryzuj na poziomie warstwy danych. Sam token nośny nie stanowi granicy dzierżawy.
class InjectAcceptMiddleware:
async def __call__(self, scope, receive, send):
if scope["type"] == "http":
headers = [(k, v) for k, v in scope["headers"] if k != b"accept"]
headers.append((b"accept", b"application/json, text/event-stream"))
scope = {**scope, "headers": headers}
await self.app(scope, receive, send)
Szczegółowe omówienie 3: Mapowanie tokenów dostępu Okta na izolowane sesje Trino
Dla Deep dive 3: Mapowanie tokenów dostępu Okta na izolowane sesje Trino – zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Wolno preferować małe, łatwe do przetestowania jednostki nad rozbudowanymi skryptami. Gdy dany krok zawiedzie, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Utwierdzaj się przy bramce dostępu, a ponownie udzielaj uprawnień na poziomie warstwy danych. Sam token nośny nie stanowi granicy między różnymi użytkownikami. Dla Deep dive 3: Mapowanie tokenów dostępu Okta na izolowane sesje Trino – zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega nieoczekiwanym rachunkom.
Gdy ścieżka przechodzi z środowiska demo do współdzielonych środowisk.
def get_connection():
token = _req_okta_token.get()
user = _jwt_email(token) # e.g. "alice@company.com"
return backend.connect(
host=BACKEND_HOST,
user=user, # identity for attribution/authorization
auth=JWTAuthentication(token), # the backend re-validates this itself
http_scheme="https",
)
Uprawnienia oraz wymuszanie trybu tylko odczytu należą ostatecznie do warstwy danych.
Aby uprawnienia oraz wymuszanie trybu tylko odczytu należały ostatecznie do warstwy danych, należy zdefiniować dane wejściowe, właściciela kroku oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Zapisuj nazwę narzędzia, hash argumentów, opóźnienie oraz wynik każdego wywołania. Bez takich informacji debugowanie agentów trwa godzinami.
forbidden = ("INSERT", "UPDATE", "DELETE", "DROP", "CREATE",
"ALTER", "TRUNCATE", "MERGE", "REPLACE", "GRANT", "REVOKE")
if any(query.strip().upper().startswith(kw) for kw in forbidden):
raise ValueError("Write operations are not allowed.")
Dwie metody łączenia z klientem
Aby istniały dwa sposoby połączenia z klientem, należy zdefiniować dane wejściowe, osobę odpowiedzialną za daną czynność oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić tę czynność od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Zapisuj nazwę narzędzia, hash argumentów, czas opóźnienia oraz wynik każdego wywołania. Bez takich informacji debugowanie pętli agenta trwa godzinami.
{ "mcpServers": { "data": { "type": "http", "url": "https://<lambda-url>/mcp" } } }
{ "mcpServers": { "data": { "type": "http", "url": "http://localhost:8766/mcp" } } }
Czego się nauczyliśmy
Zgodnie z tym, czego się nauczyliśmy, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy preferować małe, testowalne jednostki zamiast rozbudowanych skryptów. Gdy dany krok zawodzi, powinien wskazywać na konkretną odpowiedzialność, a nie na skomplikowany łańcuch operacji. Zapisywać należy nazwę narzędzia, hash argumentów, czas reakcji oraz wynik każdego wywołania. Bez takich informacji debugowanie zajmuje wiele godzin. Zgodnie z tym, czego się nauczyliśmy, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Obok wyników funkcjonalnych należy rejestrować czas wykonywania oraz koszt tokenów lub zapytań. Jasna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy proces przechodzi z środowiska demonstracyjnego do wspólnych środowisk.
Zakończenie
Aby to podsumować, należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury.
Lista kontrolna operacyjna
W ramach listy kontrolnej operacyjnej należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed zmianą kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu.
Rozpatruj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy artefaktom, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadania.
Zautoryzuj się przy bramie wejściowej oraz ponownie uzyskaj uprawnienia na poziomie warstwy danych. Sam token nie stanowi granicy między poszczególnymi usługami.
Utwórz punkt kontrolny po kosztownych krokach. System powinien unikać ponownego naliczania opłat za tę samą operację LLM, gdy operator próbuje ponownie wykonać późniejszy krok.
Przenoś dane identyfikacyjne od klienta do magazynu poniżej w łańcuchu przetwarzania, bez łączenia wszystkich użytkowników w jeden konto usługowe.
Gdy budżet na to pozwala, dodaj test sprawdzający kluczową ścieżkę w procesie CI, wykorzystując przy tym specjalne pliki konfiguracyjne, a nie rzeczywiste, płatne API.
Zanim rozpoczniesz promocję tej platformy, zamroź wersje, utwórz dokładny zapis procesu dla kluczowych etapów realizacji oraz potwierdź kroki odwracające zmiany. Środowiska współdzielone wymagają ograniczeń szybkości, weryfikacji użytkowników oraz wyraźnego właściciela odpowiedzialnego za rotację haseł. Wolimy nudną niezawodność od sprytnych, jednorazowych demonstracji.
Uwaga dotycząca wdrażania 1: ustal stałe wartości obrazów, określ limity żądań i sprawdź izolację użytkowników na wersji testowej przed szerszym wdrożeniem.
Uwaga dotycząca wdrażania 2: ustal stałe wartości obrazów, określ limity żądań i sprawdź izolację użytkowników na wersji testowej przed szerszym wdrożeniem.
Uwaga dotycząca wdrażania 3: ustal stałe wartości obrazów, określ limity żądań i sprawdź izolację użytkowników na wersji testowej przed szerszym wdrożeniem.
Uwaga dotycząca wdrażania 4: ustal stałe wartości obrazów, określ limity żądań i sprawdź izolację użytkowników na wersji testowej przed szerszym wdrożeniem.
Uwaga dotycząca wdrażania 5: ustal stałe wartości obrazów, określ limity żądań i sprawdź izolację użytkowników na wersji testowej przed szerszym wdrożeniem.
Uwaga dotycząca wdrażania 6: przytwierdź obrazy, ustaw budżety żądań i sprawdź izolację użytkowników na wersji canary przed szerszym wdrożeniem.
Literatura pokrewna
- Samoregenerujące się rozwiązania na problemy z schematem przy użyciu Airflow, LangGraph i żądań MCP — Jak wykrywać i klasyfikować zmiany w schemacie przy nieudanych operacjach ETL, tworzyć poprawki kodu, otwierać PR na GitHubie i informować zespół przez Slack — bez konieczności pisania kodu bezpośrednio do środowiska produkcyjnego.
- RAG: od podstaw do trzech agentów Bedrock — Dlaczego metody oparte na wagach zawodzą przy danych prywatnych, jak działają embeddingi i funkcje kosinusowe oraz trzy stopnie rozwoju agentów od zarządzanych bazy wiedzy do samodzielnej integracji danych.