View a markdown version of this page

Crie seu primeiro agente autenticado - Base da Amazônia AgentCore

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Crie seu primeiro agente autenticado

Este tutorial de introdução orienta você na criação de um agente autenticado completo do zero usando o Amazon Bedrock AgentCore Identity e ajudará você a começar a implementar recursos de identidade em seus aplicativos de agente. Você aprenderá a configurar seu ambiente de desenvolvimento, criar uma infraestrutura de autenticação com o Cognito, implantar seu agente no AgentCore Runtime e testar todo o fluxo de trabalho de autenticação.

Ao final deste tutorial, você terá um agente totalmente implantado que pode autenticar usuários por meio de fluxos do OAuth2, obter tokens de acesso com segurança e demonstrar o ciclo de vida completo do gerenciamento de identidades. Seu agente será executado no AgentCore Runtime com as permissões adequadas do IAM, criando um ambiente de laboratório de teste no qual você poderá demonstrar e testar os recursos de integração.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma AWS conta com as permissões apropriadas

  • Python 3.10+ instalado

  • Uv instalado

  • A AWS CLI mais recente e instalada jq

  • Node.js Mais de 20 instalados (para a AgentCore CLI)

  • AWS credenciais e região configuradas () aws configure

Este tutorial exige que você tenha um servidor de autorização OAuth 2.0. Se você não tiver um, a Etapa 1 criará um para você usando grupos de usuários do Amazon Cognito. Se você tiver um servidor de autorização OAuth 2.0 com um ID de cliente, segredo do cliente e um usuário configurados, você pode prosseguir para a etapa 2. Esse servidor de autorização atuará como um provedor de credenciais de recursos, representando a autoridade que concede ao agente um token de acesso OAuth 2.0 de saída.

Instale o SDK e as dependências

Crie uma pasta para este guia, crie um ambiente virtual Python e instale o AgentCore SDK e o SDK do AWS Python (boto3).

mkdir agentcore-identity-quickstart cd agentcore-identity-quickstart python3 -m venv .venv source .venv/bin/activate pip install bedrock-agentcore boto3 strands-agents pyjwt

Etapa 1: criar um grupo de usuários do Cognito (opcional)

Este tutorial requer um servidor de autorização OAuth 2.0. Se você não tiver um disponível para teste, ou se quiser manter seu teste separado do seu servidor de autorização, esse script usará suas AWS credenciais para configurar uma instância do Amazon Cognito para você usar como servidor de autorização. O script criará:

  • Um grupo de usuários do Cognito

  • Um cliente OAuth 2.0 e um segredo de cliente para esse grupo de usuários

  • Um usuário e uma senha de teste nesse grupo de usuários do Cognito

A exclusão do grupo de usuários do Cognito AgentCoreIdentityQuickStartPool também excluirá o client_id e o usuário associados.

Você pode escolher salvar esse script como create_cognito.sh e executá-lo na sua linha de comando ou colar o script na sua linha de comando.

#!/bin/bash REGION=$(aws configure get region) # Create user pool USER_POOL_ID=$(aws cognito-idp create-user-pool \ --pool-name AgentCoreIdentityQuickStartPool \ --query 'UserPool.Id' \ --no-cli-pager \ --output text) # Create user pool domain DOMAIN_NAME="agentcore-quickstart-$(LC_ALL=C tr -dc 'a-z0-9' < /dev/urandom | head -c 5)" aws cognito-idp create-user-pool-domain \ --domain $DOMAIN_NAME \ --no-cli-pager \ --user-pool-id $USER_POOL_ID > /dev/null # Create user pool client with secret and hosted UI settings CLIENT_RESPONSE=$(aws cognito-idp create-user-pool-client \ --user-pool-id $USER_POOL_ID \ --client-name AgentCoreQuickStart \ --generate-secret \ --allowed-o-auth-flows "code" \ --allowed-o-auth-scopes "openid" "profile" "email" \ --allowed-o-auth-flows-user-pool-client \ --supported-identity-providers "COGNITO" \ --query 'UserPoolClient.{ClientId:ClientId,ClientSecret:ClientSecret}' \ --output json) CLIENT_ID=$(echo $CLIENT_RESPONSE | jq -r '.ClientId') CLIENT_SECRET=$(echo $CLIENT_RESPONSE | jq -r '.ClientSecret') # Generate random username and password USERNAME="AgentCoreTestUser$(printf "%04d" $((RANDOM % 10000)))" PASSWORD="$(LC_ALL=C tr -dc 'A-Za-z0-9!@#$%^&*()_+-=[]{}|;:,.<>?' < /dev/urandom | head -c 16)$(LC_ALL=C tr -dc '0-9' < /dev/urandom | head -c 1)" # Create user with permanent password aws cognito-idp admin-create-user \ --user-pool-id $USER_POOL_ID \ --username $USERNAME \ --output text > /dev/null aws cognito-idp admin-set-user-password \ --user-pool-id $USER_POOL_ID \ --username $USERNAME \ --password $PASSWORD \ --output text > /dev/null \ --permanent # Get region ISSUER_URL="https://cognito-idp.$REGION.amazonaws.com/$USER_POOL_ID/.well-known/openid-configuration" HOSTED_UI_URL="https://$DOMAIN_NAME.auth.$REGION.amazoncognito.com" # Output results echo "User Pool ID: $USER_POOL_ID" echo "Client ID: $CLIENT_ID" echo "Client Secret: $CLIENT_SECRET" echo "Issuer URL: $ISSUER_URL" echo "Hosted UI URL: $HOSTED_UI_URL" echo "Test User: $USERNAME" echo "Test Password: $PASSWORD" echo "" echo "# Copy and paste these exports to set environment variables for later use:" echo "export USER_POOL_ID='$USER_POOL_ID'" echo "export CLIENT_ID='$CLIENT_ID'" echo "export CLIENT_SECRET='$CLIENT_SECRET'" echo "export ISSUER_URL='$ISSUER_URL'" echo "export HOSTED_UI_URL='$HOSTED_UI_URL'" echo "export COGNITO_USERNAME='$USERNAME'" echo "export COGNITO_PASSWORD='$PASSWORD'"

Etapa 2: criar um provedor de credenciais

Os provedores de credenciais são a forma como seu agente acessa serviços externos. Crie um provedor de credenciais e configure-o com um cliente OAuth 2.0 para seu servidor de autorização.

Se você estiver usando seu próprio servidor de autorização, defina as variáveis ISSUER_URL de ambiente e CLIENT_SECRET com seus valores apropriados no seu servidor de autorização. CLIENT_ID Se você estiver usando o script anterior para criar um servidor de autorização para você com o Cognito, copie as instruções EXPORT da saída em seu terminal para definir as variáveis de ambiente.

Esse provedor de credenciais será usado pelo código do seu agente para obter tokens de acesso para agir em nome do seu usuário.

exemplo
AgentCore CLI
  1. Se você tiver um projeto de AgentCore CLI, poderá adicionar o provedor de credenciais usando a CLI. A CLI criará o provedor durante a implantação.

    agentcore add credential \ --name AgentCoreIdentityQuickStartProvider \ --type oauth \ --discovery-url "$ISSUER_URL" \ --client-id "$CLIENT_ID" \ --client-secret "$CLIENT_SECRET"

    O provedor de credenciais será criado quando você executar agentcore deploy na Etapa 4. Observe o URL de retorno de chamada da saída de implantação.

AWS CLI
  1. #!/bin/bash # please note the expected ISSUER_URL format for Bedrock AgentCore is the full url, including .well-known/openid-configuration OAUTH2_CREDENTIAL_PROVIDER_RESPONSE=$(aws bedrock-agentcore-control create-oauth2-credential-provider \ --name "AgentCoreIdentityQuickStartProvider" \ --credential-provider-vendor "CustomOauth2" \ --oauth2-provider-config-input '{ "customOauth2ProviderConfig": { "oauthDiscovery": { "discoveryUrl": "'$ISSUER_URL'" }, "clientId": "'$CLIENT_ID'", "clientSecret": "'$CLIENT_SECRET'" } }' \ --output json) OAUTH2_CALLBACK_URL=$(echo $OAUTH2_CREDENTIAL_PROVIDER_RESPONSE | jq -r '.callbackUrl') echo "OAuth2 Callback URL: $OAUTH2_CALLBACK_URL"

Etapa 2.5: Adicionar o URL de retorno de chamada ao seu servidor de autorização OAuth 2.0

Para evitar redirecionamentos não autorizados, adicione o URL de retorno de chamada recuperado de CreateOauth2CredentialProvider ou GetOauth2CredentialProvider para seu servidor de autorização OAuth 2.0.

Se você estiver usando o script anterior para criar um servidor de autorização com o Cognito, copie as instruções EXPORT da saída em seu terminal para definir as variáveis de ambiente e atualizar o cliente do grupo de usuários do Cognito com a URL de retorno de chamada do provedor de credenciais OAuth2.

#!/bin/bash aws cognito-idp update-user-pool-client \ --user-pool-id $USER_POOL_ID \ --client-id $CLIENT_ID \ --client-name AgentCoreQuickStart \ --allowed-o-auth-flows "code" \ --allowed-o-auth-scopes "openid" "profile" "email" \ --allowed-o-auth-flows-user-pool-client \ --supported-identity-providers "COGNITO" \ --callback-urls "$OAUTH2_CALLBACK_URL"

Etapa 3: criar um agente de amostra que inicie um fluxo do OAuth 2.0

Nesta etapa, criaremos um agente que inicia um fluxo de autorização do OAuth 2.0 para fazer com que os tokens ajam em nome do usuário. Para simplificar, o agente não fará chamadas reais para serviços externos em nome de um usuário, mas provará que obteve consentimento para agir em nome do nosso usuário de teste.

Código do agente

Crie um arquivo chamado agentcoreidentityquickstart.py e salve esse código.

""" AgentCore Identity Outbound Token Agent This agent demonstrates the USER_FEDERATION OAuth 2.0 flow. It handles the OAuth 2.0 user consent flow and inspects the resulting OAuth 2.0 access token. """ from bedrock_agentcore.runtime import BedrockAgentCoreApp from bedrock_agentcore.identity import requires_access_token import asyncio import jwt import logging app = BedrockAgentCoreApp() logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def decode_jwt(token): try: decoded = jwt.decode(token, options={"verify_signature": False}) return decoded except Exception as e: return {"error": f"Error decoding JWT: {str(e)}"} class StreamingQueue: def __init__(self): self.finished = False self.queue = asyncio.Queue() async def put(self, item): await self.queue.put(item) async def finish(self): self.finished = True await self.queue.put(None) async def stream(self): while True: item = await self.queue.get() if item is None and self.finished: break yield item queue = StreamingQueue() async def handle_auth_url(url): await queue.put(f"Authorization URL, please copy to your preferred browser: {url}") @requires_access_token( provider_name="AgentCoreIdentityQuickStartProvider", scopes=["openid"], auth_flow="USER_FEDERATION", on_auth_url=handle_auth_url, # streams authorization URL to client force_authentication=True, callback_url='insert_oauth2_callback_url_for_session_binding', ) async def introspect_with_decorator(*, access_token: str): """Introspect token using decorator""" logger.info("Inside introspect_with_decorator - decorator succeeded") await queue.put({ "message": "Successfully received an access token to act on behalf of your user!", "token_claims": decode_jwt(access_token), "token_length": len(access_token), "token_preview": f"{access_token[:50]}...{access_token[-10:]}" }) await queue.finish() @app.entrypoint async def agent_invocation(payload, context): """Handler that uses only the decorator approach""" logger.info("Agent invocation started") # Start the agent task and immediately begin streaming task = asyncio.create_task(introspect_with_decorator()) # Stream items as they come in async for item in queue.stream(): yield item # Wait for task completion await task if __name__ == "__main__": app.run()
nota

Para obter um exemplo de implementação de servidor de retorno de chamada local para lidar com a vinculação de sessão, consulte oauth2_callback_server.py https://github.com/awslabs/amazon-bedrock-agentcore-samples/blob/main/01-features/05-authenticate-and-authorize/02-outbound-auth/02-outbound-auth-3lo/oauth2_callback_server.py

Etapa 4: implantar o agente no AgentCore Runtime

Hospedaremos esse agente no AgentCore Runtime. Podemos fazer isso facilmente com a AgentCore CLI.

No seu terminal, instale a AgentCore CLI e crie um projeto de agente Python Strands. As opções explícitas criam um agente baseado em código em vez de um equipamento:

npm install -g @aws/agentcore agentcore create --name IdentityQuickstart --language Python --framework Strands \ --model-provider Bedrock --memory none

Copie o script do agente para o diretório de agentes do projeto, substituindo o agente padrão:

cp agentcoreidentityquickstart.py IdentityQuickstart/app/IdentityQuickstart/main.py

Adicione a dependência do JWT ao projeto gerado:

cd IdentityQuickstart/app/IdentityQuickstart uv add pyjwt cd ../..

Em seguida, implante seu projeto:

agentcore deploy

A CLI sintetiza uma pilha de AWS CDK e implanta seu agente no Runtime. AgentCore Isso leva aproximadamente de 2 a 3 minutos.

Atualize a política de IAM do agente para poder acessar o token, o cofre e o segredo do cliente

A AgentCore CLI cria a função de execução do agente durante a implantação, mas a função não inclui automaticamente permissões para acesso ao cofre de tokens. Você precisa anexar uma política adicional para permitir que o agente recupere os tokens do OAuth 2.0 em tempo de execução.

Esse script recupera sua conta e região da AWS CLI, localiza a função de execução do agente na CloudFormation pilha e anexa a política apropriada. Você pode copiar e colar esse script ou salvá-lo em um arquivo e executá-lo.

#!/bin/bash # Get account and region from AWS CLI AWS_ACCOUNT=$(aws sts get-caller-identity --query Account --output text) REGION=$(aws configure get region) # Get execution role from CloudFormation stack outputs EXECUTION_ROLE=$(aws cloudformation describe-stack-resources \ --stack-name AgentCore-IdentityQuickstart-prod \ --query "StackResources[?ResourceType=='AWS::IAM::Role'].PhysicalResourceId" \ --output text | head -1) echo "Parsed values:" echo "Execution Role: $EXECUTION_ROLE" echo "Account: $AWS_ACCOUNT" echo "Region: $REGION" # Create the policy document with proper variable substitution cat > agentcore-identity-policy.json << EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "AccessTokenVault", "Effect": "Allow", "Action": [ "bedrock-agentcore:GetResourceOauth2Token", "secretsmanager:GetSecretValue" ], "Resource": ["arn:aws:bedrock-agentcore:$REGION:$AWS_ACCOUNT:workload-identity-directory/default/workload-identity/*", "arn:aws:bedrock-agentcore:$REGION:$AWS_ACCOUNT:token-vault/default/oauth2credentialprovider/AgentCoreIdentityQuickStartProvider", "arn:aws:bedrock-agentcore:$REGION:$AWS_ACCOUNT:workload-identity-directory/default", "arn:aws:bedrock-agentcore:$REGION:$AWS_ACCOUNT:token-vault/default", "arn:aws:secretsmanager:$REGION:$AWS_ACCOUNT:secret:bedrock-agentcore-identity!default/oauth2/AgentCoreIdentityQuickStartProvider*" ] } ] } EOF # Create the policy POLICY_ARN=$(aws iam create-policy \ --policy-name AgentCoreIdentityQuickStartPolicy$(LC_ALL=C tr -dc '0-9' < /dev/urandom | head -c 4) \ --policy-document file://agentcore-identity-policy.json \ --query 'Policy.Arn' \ --output text) # Extract role name from ARN and attach policy ROLE_NAME=$(echo $EXECUTION_ROLE | awk -F'/' '{print $NF}') aws iam attach-role-policy \ --role-name $ROLE_NAME \ --policy-arn $POLICY_ARN echo "Policy created and attached: $POLICY_ARN" # Cleanup rm agentcore-identity-policy.json

Etapa 5: invocar o agente

Agora que tudo está configurado, você pode invocar o agente. Para esta demonstração, usaremos o agentcore invoke comando e nossas credenciais do IAM. Precisaremos passar os --session-id argumentos --user-id e ao usar a autenticação IAM.

agentcore invoke "TestPayload" --runtime IdentityQuickstart --user-id "SampleUserID" --session-id "ALongThirtyThreeCharacterMinimumSessionIdYouCanChangeThisAsYouNeed"

Em seguida, o agente retornará uma URL para seu agentcore invoke comando. Copie e cole esse URL em seu navegador preferido e você será redirecionado para a página de login do seu servidor de autorização. O --user-id parâmetro é a ID do usuário que você está apresentando à AgentCore Identity. O --session-id parâmetro é o ID da sessão, que deve ter pelo menos 33 caracteres.

Importante

O --user-id parâmetro usa o caminho da GetWorkloadAccessTokenForUserId API, que trata o UserID como uma string opaca sem verificá-lo em relação a uma identidade autenticada do usuário final. Isso é apropriado para cenários de início rápido e desenvolvimento em que você não tem um token de IdP disponível. Para implantações de produção nas quais você tem um JWT identificando o usuário final, use o caminho de JWT-based autenticação (GetWorkloadAccessTokenForJWT), que valida o emissor, a assinatura e a expiração do token. Para obter mais informações, consulte Obter token de acesso à carga de trabalho.

Insira o nome de usuário e a senha do usuário no servidor de autorização quando solicitado no navegador ou use o método de autenticação preferido que você configurou. Se você usou o script da Etapa 1 para criar uma instância do Cognito, poderá recuperá-la do histórico do seu terminal.

Seu navegador deve redirecionar para a URL de retorno de chamada do OAuth2 configurada, que manipula o fluxo de vinculação da sessão. https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/oauth2-authorization-url-session-binding.html Certifique-se de que seu servidor de retorno de chamada do OAuth2 forneça respostas claras de sucesso e erro para indicar o status da autorização.

nota

Se você interromper uma invocação sem concluir a autorização, talvez seja necessário solicitar um novo URL usando um novo ID de sessão (--session-idparâmetro).

Depuração

Se você encontrar algum erro ou comportamento inesperado, a saída do agente será capturada nos CloudWatch registros da Amazon. Um comando log tailing é fornecido após a execuçãoagentcore deploy.

Fazer a limpeza.

Depois de terminar, execute agentcore remove all e, em seguida, agentcore deploy do diretório do seu projeto para eliminar os recursos do AgentCore Runtime implantados. Em seguida, exclua o grupo de usuários do Amazon Cognito, desanexe e exclua a política do IAM que você criou e exclua o provedor de credenciais.

Práticas recomendadas de segurança

Ao trabalhar com informações de identidade:

  1. Nunca codifique credenciais no código do seu agente

  2. Use variáveis de ambiente ou a SageMaker IA da Amazon para informações confidenciais

  3. Aplique o princípio do menor privilégio ao configurar as permissões do IAM

  4. Alterne regularmente as credenciais para serviços externos

  5. Audite os registros de acesso para monitorar a atividade do agente

  6. Implemente o tratamento adequado de erros para falhas de autenticação