Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Leitfaden erfahren Sie, wie Sie einen Amazon Bedrock-Agent mithilfe des Microsoft Entra Auth SDK (Sidecar) zur Authentifizierung bei downstream-APIs sichern. Das Sidecar wird als separater Container ausgeführt und übernimmt die Verwaltung der Anmeldeinformationen sowie den Austausch der Tokens mit Microsoft Entra ID. Ihr Agent fordert einen Autorisierungsheader vom Sidecar an und der Sidecar führt den OAuth 2.0-Austausch mit Microsoft Entra ID durch.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes haben:
- Ein Microsoft Entra-Mandant.
- Ein Azure-Abonnement.
- Docker Desktop (macOS/Windows) oder Docker Engine mit Compose v2 (Linux).
- PowerShell 7+.
- Azure CLI.
- AWS CLI v2.
- Ein AWS-Konto mit Bedrock-Modellzugriff, das für Anthropic Claude 3 Haiku (oder Ihr bevorzugtes Modell) aktiviert ist. Aktivieren Sie den Zugriff in der AWS Bedrock-Konsole unter "Modellzugriff>".
- Global Administrator Rolle für das erstmalige Microsoft Entra Setup. Verwenden Sie Privileged Identity Management (PIM), um diese Rolle just-in-time zu aktivieren.
Klonen des Beispiel-Repositorys
Klonen Sie das Repository, und wechseln Sie zum AWS-Beispielverzeichnis:
git clone https://github.com/microsoft/entra-agentid-samples.git cd entra-agentid-samples/sidecar/aws
Architektur
Das Microsoft Entra Auth SDK (Sidecar) befindet sich zwischen Ihrem Agent und Microsoft Entra ID. Der Agent spricht nie direkt mit Microsoft Entra ID und verwaltet niemals Anmeldeinformationen. Es fordert das Sidecar auf, einen Authorization Header anzufordern, um eine Downstream-API aufzurufen. Amazon Bedrock verarbeitet LLM-Rückschlüsse separat, ohne sich gedanken über Identität zu machen.
Im Beispiel werden drei Container in einem Docker-Bridge-Netzwerk ausgeführt.
-
llm-agent-aws: Flask-App mit einer Chat-Benutzeroberfläche und einem LangGraph ReAct-Agenten, der Amazon Bedrock (Claude) zur Begründung aufruft. Verfügbar gemacht am Port 3001. -
agent-id-sidecar-aws: Der offizielle Microsoft Entra Auth SDK-Container. Dient zum Abrufen und Zwischenspeichern von Token. Kein Hostport, erreichbar nur innerhalb des Docker-Netzwerks. -
weather-api-aws: Eine nachgelagerte API, die das JWT des Agenten (Signatur, Herausgeber, Ablauf, Zielgruppe) bei jeder Anfrage überprüft und Wetterdaten zurückgibt.
Die Anforderung fließt durch die folgenden Schritte:
- Sie geben eine Abfrage in die Chat-UI ein unter
http://localhost:3001. - Die Flask-App sendet die Abfrage über den LangGraph ReAct-Agent an AWS Bedrock (Claude).
- Wenn Claude entscheidet, dass wetterdaten benötigt werden, ruft sie das
get_weatherTool auf. - Das Tool fragt das Sidecar nach einem Autorisierungsheader, indem es
GET /AuthorizationHeader?AgentIdentity={agentId}aufruft. - Der Sidecar authentifiziert sich bei Microsoft Entra ID mit OAuth 2.0 (Anmeldeinformationen des Clients oder OBO-Austausch).
- Microsoft Entra ID gibt das angeforderte Token (TR) an das Sidecar zurück.
- Der Agent ruft die Wetter-API mit
Authorization: Bearer TR. - Die Wetter-API überprüft TR und gibt die JSON-Antwort des Wetters zurück.
Verständnis des Tokenflusses
Drei Token sind an dem Identitätsaustausch beteiligt:
| Token | Ausgestellt an | Wenn | Wie? |
|---|---|---|---|
| Tc | Angemeldeter Benutzer | Nur OBO-Flow | MSAL.js im Browser |
| T1 | Blueprint-App | Beide Flüsse | Sidecar (Clientanmeldeinformationen) |
| TR | Agent (Downstream-API) | Beide Flüsse | Nur-Sidecar-App (autonom) oder OBO-Austausch |
Im autonomen Fluss ruft der Sidecar mithilfe der Anmeldeinformationen des Clients T1 ab und tauscht es dann gegen TR aus, das auf die Downstream-API ausgerichtet ist. Im OBO-Fluss empfängt der Sidecar auch Tc (das Token des Benutzers) und führt einen OBO-Austausch durch, um TR abzurufen, das im Namen des angemeldeten Benutzers handelt.
In diesem Setup wird nur die Chat-Ui (Port 3001) für Ihren Host verfügbar gemacht. Die Sidecar- und Wetter-API sind nur innerhalb des Docker-Netzwerks erreichbar, wodurch eine klare Sicherheitsgrenze festgelegt wird.
Auswählen eines Ausführungsmodus und eines Identitätsflusses
Das Beispiel unterstützt zwei Ausführungsmodi und zwei Identitätsflüsse, die Sie kombinieren können:
| Autonom (nur App) | OBO (im Namen des Benutzers) | |
|---|---|---|
| Direct (kein LLM) | Schneller Demopfad. Token abgerufen und Wetter-API direkt aufgerufen. | Identisch, aber verwendet den authentifizierten Sidecar-Endpunkt mit dem Benutzertoken. |
| Bedrock + LangChain | Der LangGraph ReAct-Agent entscheidet, wann der Anruf erfolgt get_weather. |
Identisch, aber der Agent übergibt das Benutzertoken, wenn das Tool ausgeführt wird. |
Verwenden Sie den direkten Modus, um ihren Tokenfluss end-to-End zu überprüfen, ohne AWS Bedrock-Zugriff zu benötigen. Wechseln Sie zum Bedrock-Modus für die vollständige Agent-Erfahrung.
Auswählen einer AWS-Authentifizierungsstufe
Das Beispiel unterstützt drei Möglichkeiten zur Authentifizierung bei Amazon Bedrock. Wählen Sie die Ebene aus, die Ihrer Umgebung entspricht:
-
Temporäre STS-Anmeldeinformationen: Am besten für die lokale Entwicklung mit AWS SSO. Legen Sie
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYundAWS_SESSION_TOKENin Ihrer.env-Datei fest. Diese Anmeldeinformationen laufen nach ungefähr einer Stunde ab. -
Bedrock-API-Schlüssel: Am besten für Demos und Workshops. Legen Sie
AWS_BEARER_TOKEN_BEDROCKin der Datei.envfest. Gilt nur für Bedrock mit einer konfigurierbaren Lebensdauer. -
OIDC federation: Am besten geeignet für Produktionsbereitstellungen auf Azure App Service. Verwendet
AWS_ROLE_ARNundAWS_WEB_IDENTITY_TOKEN_FILE, die von der Plattform festgelegt werden. Keine geheimen Schlüssel werden überall gespeichert.
Tipp
Für Produktbereitstellungen finden Sie eine Schritt-für-Schritt-Anleitung zur Einrichtung der OIDC-Föderation zwischen Azure und AWS ohne gespeicherte Geheimnisse im Bereitstellungshandbuch für Azure App-Dienste.
Auswählen eines Bedrock-Modells
Das Beispiel ist standardmäßig auf us.anthropic.claude-3-haiku-20240307-v1:0 festgelegt, da es das billigste Anthropic Modell auf Bedrock ist und Toolanrufe unterstützt. Das us.-Präfix gibt ein regionsübergreifendes Inferenzprofil an, das zwischen Regionen in den USA routet, um eine höhere Verfügbarkeit zu gewährleisten.
Andere unterstützte Modelle:
| Modell-ID | Kosten pro 1K-Eingabetoken | Hinweise |
|---|---|---|
us.anthropic.claude-3-haiku-20240307-v1:0 |
$0.00025 | Standard. Schnell, günstigst, unterstützt Werkzeugaufrufe. |
us.anthropic.claude-3-5-haiku-20241022-v1:0 |
$0.0008 | Neuer, intelligenter, immer noch erschwinglicher. |
us.anthropic.claude-3-5-sonnet-20241022-v2:0 |
$0,003 | Bestes Qualitäts-/Kostenverhältnis. |
Überschreiben Sie die Standardeinstellungen, indem Sie BEDROCK_MODEL_ID auf .env setzen. Sie müssen jedes Modell im AWS Bedrock-Konsolenmodellzugriff> aktivieren, bevor es aufgerufen werden kann.
Erstellen der Entra-Objekte (erstmaliges Einrichten)
Wenn Sie schon über eine .env Datei aus einer vorherigen Ausführung verfügen, bei der BLUEPRINT_APP_ID ausgefüllt ist, fahren Sie mit Umgebungsvariablen konfigurieren fort.
Führen Sie die folgenden Befehle einmal pro Mandant aus, um die Blueprint-App, die Agent-ID und die SPA-App zu erstellen, die für die OBO-Anmeldung verwendet wird.
Erstellen Sie die Blueprint-App und die Agent-ID für den autonomen Fluss, indem Sie den PowerShell-Workflow in " Erstellen eines Agentidentitäts-Blueprints " und "Erstellen von Agentidentitäten" ausführen. Am Ende haben Sie:
-
TENANT_ID: Ihr Entra-Mandant. -
BLUEPRINT_APP_ID: Blueprint-App-Registrierung. -
BLUEPRINT_CLIENT_SECRET: Geheimer Clientschlüssel für den Blueprint. -
AGENT_CLIENT_ID: Die agent-ID, die aus dem Blueprint erstellt wurde.
-
(Optional) Erstellen Sie die SPA-App, und konfigurieren Sie OBO. Dieser Schritt ist nur erforderlich, wenn Sie den OBO-Identitätsfluss verwenden möchten:
Bash:
bash ../../scripts/setup-obo-client-app.sh bash ../../scripts/setup-obo-blueprint.shPowerShell:
pwsh ../../scripts/setup-obo-client-app.ps1 pwsh ../../scripts/setup-obo-blueprint.ps1 ` -TenantId '<TENANT_ID>' ` -BlueprintAppId '<BLUEPRINT_APP_ID>' ` -AgentAppId '<AGENT_CLIENT_ID>' ` -ClientSpaAppId '<CLIENT_SPA_APP_ID>'
Der SPA-Umleitungs-URI für dieses Beispiel lautet http://localhost:3001 (Port 3001, nicht 3003). Stellen Sie sicher, dass dieser URI registriert ist.
Umgebungsvariablen konfigurieren
Das Sidecar unterstützt mehrere Anmeldedatentypen über die AzureAd__ClientCredentials__0__SourceType Einstellungen in docker-compose.yml:
-
ClientSecret: Nur lokale Entwicklung. Das Beispiel enthält diesen Typ. -
SignedAssertionFromManagedIdentity: Auf Azure bereitgestellt. Null Geheimnisse, empfohlen für die Produktion. -
KeyVault: Zertifikat von Azure Key Vault. -
StoreWithThumbprint: Zertifikat aus dem lokalen Computerspeicher.
Kopieren Sie die Umgebungsvorlage, und öffnen Sie sie in Ihrem Editor:
Bash:
cp .env.example .envPowerShell:
Copy-Item .env.example .envLegen Sie die folgenden Variablen in Ihrer
.envDatei fest:-
TENANT_ID: Ihre Entra-Mandanten-ID. -
BLUEPRINT_APP_ID: Blueprint-App-Registrierung. Der Sidecar authentifiziert sich als diese App. -
BLUEPRINT_CLIENT_SECRET: Geheimer Blueprint-Clientschlüssel (nur lokale Entwicklung). -
AGENT_CLIENT_ID: Ihre Agent-ID. Wird alsAgentIdentityAbfrageparameter angezeigt. -
CLIENT_SPA_APP_ID: SPA-App-ID, die von MSAL.js für die Browseranmeldung verwendet wird (nur OBO). -
AWS_REGION: AWS-Region für Bedrock, z. B.us-east-2. -
BEDROCK_MODEL_ID: Modell-ID. Standardwert:us.anthropic.claude-3-haiku-20240307-v1:0. -
VALIDATE_TOKEN_SIGNATURE: Standardtrue. Legen Siefalsefest, um die JWKS-Signaturüberprüfung in der Wetter-API zu überspringen (nur Debugging).
-
Fügen Sie Ihre AWS-Anmeldeinformationen basierend auf der ausgewählten Ebene hinzu:
-
Ebene A (STS): auf
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYundAWS_SESSION_TOKENgesetzt. -
Stufe B (API-Schlüssel): Set
AWS_BEARER_TOKEN_BEDROCK. -
Stufe C (OIDC): Konfiguriert über Plattform-App-Einstellungen, nicht in
.env.
-
Ebene A (STS): auf
Tipp
Wenn Sie bereits über eine .env vorherige Sitzung verfügen, müssen Sie Ihre AWS-Anmeldeinformationen nur aktualisieren (STS-Token laufen nach etwa einer Stunde ab). Springen Sie direkt zum Start des Stapels.
Starten des Stacks
Stellen Sie sicher, dass Docker ausgeführt wird, und starten Sie dann alle Container:
docker compose up --build -dÜberprüfen Sie, ob der Stapel bereit ist:
Bash:
curl http://localhost:3001/api/statusPowerShell:
Invoke-RestMethod http://localhost:3001/api/statusEs wird eine Antwort angezeigt, die
bedrock_available: trueangibt (oderfalsewenn Sie den Direct-Modus ohne AWS-Anmeldeinformationen verwenden).
Wichtig
Wenn Sie .env aktualisieren (z. B. um abgelaufene STS-Anmeldeinformationen zu aktualisieren), lädt docker compose restart die Umgebungsvariablen nicht neu. Verwenden Sie stattdessen docker compose up -d --force-recreate llm-agent-aws.
Senden einer Abfrage über die Chat-Ui
Öffnen Sie
http://localhost:3001in Ihrem Browser.Verwenden Sie die Kopfzeile, um Ihre Demo zu konfigurieren:
-
Ausführungsmodus:
Direct(LLM überspringen) oderBedrock(LangChain ReAct-Agent auf Claude). -
Identitätsfluss:
Autonomous(nur App-Token) oderOBO(fungiert für einen angemeldeten Benutzer).
-
Ausführungsmodus:
Wenn Sie OBO auswählen, wählen Sie "Anmelden " aus, um sich über das Popup MSAL.js zu authentifizieren.
Geben Sie eine Abfrage wie "Wetter in Dallas?" ein, und wählen Sie "Senden" aus.
Sehen Sie sich den Bereich "Identitätsablaufverfolgung " auf der rechten Seite für eine schrittweise Aufschlüsselung jedes Tokenaustauschs und API-Aufrufs an. Das Panel zeigt farbcodierte JWT-Karten für jedes Token (Tc, T1, TR) mit decodierten Ansprüchen.
Häufige Probleme beheben
Wenn etwas nicht wie erwartet funktioniert, überprüfen Sie die folgende Tabelle auf häufige Probleme und Korrekturen:
| Symptom | Wahrscheinliche Ursache | Beheben |
|---|---|---|
/api/status Zeigt bedrock_available: false |
AWS-Anmeldeinformationen fehlen oder abgelaufen oder Modellzugriff nicht gewährt. | Überprüfen Sie docker logs llm-agent-aws. Aktualisieren Sie STS-Anmeldeinformationen mit aws sso login. Aktivieren Sie das Modell in der Bedrock-Konsole. |
ExpiredTokenException aus Bedrock |
Das STS-Sitzungstoken (Ebene A) ist abgelaufen. | Fügen Sie neue Anmeldeinformationen in .env ein, und führen Sie dann docker compose up -d --force-recreate llm-agent-aws aus. |
AccessDeniedException am InvokeModel |
Dem IAM-Prinzipal fehlt die bedrock:InvokeModel-Berechtigung, oder der Zugriff auf das Modell ist nicht aktiviert. |
Gewähren Sie bedrock:InvokeModel für das Modell und die Inferenzprofil-ARNs. |
ValidationException: invalid model identifier |
Region hostt das Modell nicht, oder Sie haben anstelle des us. Rückschlussprofils eine bare Modell-ID verwendet. |
Verwenden Sie das mit us. präfixierte Profil-ID (z. B. us.anthropic.claude-3-haiku-20240307-v1:0). |
Wetter-API gibt zurück 401 Unauthorized |
Diskrepanz zwischen Token und Mandant, abgelaufenes Geheimnis oder Signaturprüfung fehlgeschlagen. | Überprüfen Sie, dass TENANT_ID mit dem Mandanten des Blueprints übereinstimmt. Überprüfen Sie die Sidecar-Protokolle. |
| LLM antwortet ohne Aufrufen des Tools | Die Abfrage war nicht eindeutig toolförmig, oder das Modell unterstützt keine Toolaufrufe. | Verwenden Sie Claude 3 Haiku oder neuer. Geben Sie die Anfrage als "Was ist das Wetter in der <Stadt>?". |
| OBO-Anmeldepopup blockiert | Browser-Popup-Blocker | Popups zulassen für localhost:3001. |
4xx von Sidecar während OBO |
CLIENT_SPA_APP_ID Fehlende oder nicht übereinstimmende SPA-Umleitungs-URI. |
Erneutes Ausführen setup-obo-client-app. Stellen Sie sicher, dass http://localhost:3001 in den Umleitungs-URIs der SPA enthalten ist. |
Anzeigen von Containerprotokollen zum Debuggen:
docker logs llm-agent-aws
docker logs agent-id-sidecar-aws
docker logs weather-api-aws
Bereinigen von Ressourcen
Stoppen Sie die Container und entfernen Sie sie, wenn Sie fertig sind.
# Stop containers but keep volumes and images
docker compose down
# Remove everything including volumes and images
docker compose down -v --rmi all
Die Entra-Objekte (Agenten-Blueprint, Agenten-ID, SPA-App-Registrierung) sind als mandantenseitiger Status gespeichert, sodass die Verwendung von docker compose down sie nicht entfernt. Entfernen Sie sie manuell im Microsoft Entra Admin Center, wenn sie nicht mehr benötigt werden.