View a markdown version of this page

인바운드 인증 및 아웃바운드 인증으로 인증 및 권한 부여 - Amazon Bedrock AgentCore

인바운드 인증 및 아웃바운드 인증으로 인증 및 권한 부여

이 섹션에서는 AgentCore 자격 증명이 있는 OAuth 및 JWT 보유자 토큰을 사용하여 에이전트 런타임에 대한 인증 및 권한 부여를 구현하는 방법을 보여줍니다. Cognito 사용자 풀을 설정하고, JWT 인증을 위한 에이전트 런타임을 구성하고(인바운드 인증), 타사 리소스에 대한 OAuth 기반 액세스(아웃바운드 인증)를 구현하는 방법을 알아봅니다.

전체 예제는 섹션을 참조하세요https://github.com/awslabs/amazon-bedrock-agentcore-samples/.

MCP 서버에서 OAuth를 사용하는 방법에 대한 자세한 내용은 AgentCore 런타임에서 MCP 서버 배포를 참조하세요.

Amazon Bedrock AgentCore 런타임은 호스팅 에이전트를 위한 두 가지 인증 메커니즘을 제공합니다.

IAM SigV4 인증

다른 AWS APIs.

X-Amzn-Bedrock-AgentCore-Runtime-User-Id 헤더

솔루션에 호스팅된 에이전트가 최종 사용자를 대신하여 OAuth 토큰을 검색해야 하는 경우(권한 부여 코드 부여 사용) 요청에 X-Amzn-Bedrock-AgentCore-Runtime-User-Id 헤더를 포함하여 사용자 식별자를 지정할 수 있습니다. 이 헤더는 내부적으로 GetWorkloadAccessTokenForUserId 경로를 사용합니다.

참고

를 사용하여 InvokeAgentRuntime을 호출X-Amzn-Bedrock-AgentCore-Runtime-User-Id header하려면 기존 작업 외에도 새 IAM bedrock-agentcore:InvokeAgentRuntime 작업 bedrock-agentcore:InvokeAgentRuntimeForUser가 필요합니다.

이 헤더와 JWT 베어러 토큰 인증을 사용해야 하는 경우

이 헤더는 다음 사용 사례를 위해 설계되었습니다.

  • 고객 관리형 사용자 식별자가 있는 엔터프라이즈 고객 - 자체 사용자 자격 증명 문자열을 유지하고 자격 증명 바인딩을 위해 이를 AgentCore 자격 증명으로 전달해야 하는 조직입니다.

  • 개발 및 빠른 시작 시나리오 - 아직 IdP 토큰을 사용할 수 없고 사용자 범위 자격 증명 흐름을 테스트하는 빠른 경로가 필요한 빌더입니다.

    자격 증명 공급자가 구성된 프로덕션 배포의 경우 대신 JWT Bearer Token 인증을 사용합니다. JWT 경로(GetWorkloadAccessTokenForJWT)는 토큰의 발급자, 서명 및 만료를 검증하여 사용자 자격 증명의 암호화 증명을 제공합니다. X-Amzn-Bedrock-AgentCore-Runtime-User-Id 헤더 경로는 인증된 최종 사용자 자격 증명에 대해 userId를 확인하지 않습니다. 호출 워크로드를 사용하여 올바른 값을 전달하고 IAM 정책을 사용하여 제공할 수 있는 사용자를 제한합니다.

    X-Amzn-Bedrock-AgentCore-Runtime-User-Id 헤더의 보안 모범 사례

    작은 정보

    모든 런타임 보안 권장 사항에 대한 통합 보기는 AgentCore 런타임의 보안 모범 사례를 참조하세요.

    AgentCore는 헤더 값을 인증된 자격 증명에 대해 확인하지 않고 불투명 식별자로 취급하므로 보안 경계를 유지하려면 다음 제어를 적용해야 합니다.

  • IAM 권한 제한 - 신뢰할 수 있는 보안 주체만 bedrock-agentcore:InvokeAgentRuntimeForUser 권한을 가져야 합니다. IAM 리소스 조건을 사용하여이 권한의 범위를 특정 런타임 리소스로 지정합니다. 관리형 정책 또는 와일드카드 리소스 문을 통해 광범위하게 부여하지 마세요.

  • 인증된 보안 주체에서 사용자 ID 도출 - 사용자 ID 값은 임의의 클라이언트 제공 값을 수락하는 대신 인증된 보안 주체의 컨텍스트(예: IAM 호출자 자격 증명 또는 사용자 토큰 클레임)에서 파생되어야 합니다. 이렇게 하면 인증된 사용자가 다른 user-id를 수동으로 지정하여 다른 사용자를 가장하는 것을 방지할 수 있습니다.

  • 감사 로깅 구현 - 인증된 IAM 보안 주체(SigV4 컨텍스트에서)와 전달되는 user-id 값 간의 관계를 로깅합니다. AWS CloudTrail을 사용하여 runtimeUserId 파라미터가 포함된 InvokeAgentRuntime 호출을 모니터링합니다.

  • 신뢰할 수 없는 컨텍스트에서 헤더 거부 - 사용자 ID 위임이 필요하지 않은 런타임의 경우 헤더가 수락되지 않도록 IAM 정책에서 bedrock-agentcore:InvokeAgentRuntimeForUser 작업을 명시적으로 거부합니다.

    { "Statement": [ { "Sid": "DenyUserIdDelegation", "Effect": "Deny", "Action": "bedrock-agentcore:InvokeAgentRuntimeForUser", "Resource": "arn:aws:bedrock-agentcore:REGION:ACCOUNT_ID:runtime/*" } ] }
JWT 베어러 토큰 인증

에이전트 생성 중에 권한 부여자 구성을 제공하여 JWT 보유자 토큰을 수락하도록 에이전트 런타임을 구성할 수 있습니다.

이 구성에는 다음이 포함됩니다.

  • 검색 URL - ^.+/\.well-known/openid-configuration$ OpenID Connect 검색 URLs의 패턴과 일치해야 하는 문자열

  • 허용된 대상 - JWT 토큰의 aud 클레임에 대해 검증될 허용된 대상 목록입니다.

  • 허용된 클라이언트 - JWT 토큰의 client_id 클레임에 대해 검증될 허용된 클라이언트 식별자 목록입니다.

  • 허용된 범위 - JWT 토큰의 범위 클레임에 대해 검증될 허용된 범위 목록입니다. allowedScopes 권한 부여 필드는 문자열 목록으로 구성됩니다.

  • 필수 사용자 지정 클레임 - 수신 JWT 토큰에 포함된 클레임 이름 및 값에 대해 검증할 필수 클레임 목록입니다. 권한 부여자 구성에 대한 자세한 내용은 인바운드 JWT 권한 부여자 구성을 참조하세요.

참고

AgentCore 런타임은 IAM SigV4 또는 JWT 베어러 토큰 기반 인바운드 인증을 지원할 수 있지만 둘 다 동시에 지원할 수는 없습니다. 항상 다양한 버전의 AgentCore 런타임을 생성하고 다양한 인바운드 권한 부여 유형에 맞게 구성할 수 있습니다. Amazon Bedrock AgentCore를 사용하여 런타임을 생성하면 AgentCore Identity 서비스를 사용하여 런타임에 대한 워크로드 자격 증명이 자동으로 생성됩니다.

게이트웨이에 대한 IAM(SigV4) 인바운드 호출 제한

게이트웨이가 런타임에 대한 단일 관리형 진입점이 되도록 AgentCore 게이트웨이로 AgentCore 런타임을 앞당길 수 있습니다. 이를 통해 정책 기반 권한 부여, Amazon Bedrock Guardrails, 요청 및 응답 인터셉터, 통합 관찰성을 모두 에이전트의 자체 환경 외부에서 적용할 수 있습니다. 전체 근거와 이를 설정하는 방법은 AgentCore Gateway를 사용하여 런타임 전달을 참조하세요.

그러나 이는 호출자가 게이트웨이를 직접 우회하여 런타임에 도달할 수 없는 경우에만 유용합니다. 런타임이 기본 IAM(SigV4) 인바운드 권한 부여를 사용하는 경우 트래픽이 게이트웨이를 통해서만 런타임에 도달하도록 게이트웨이에 대한 호출을 제한할 수 있습니다. 이를 위해 게이트웨이의 실행 역할에 대한 호출을 제한하는 리소스 기반 정책을 런타임에 연결합니다. 게이트웨이는 서비스 역할을 수임하여 런타임에 대한 요청에 서명하므로 게이트웨이 역할은 런타임을 호출하는 보안 주체입니다. 허용 자격 증명 기반 정책이 있더라도 다른 자격 증명이 런타임을 호출할 수 없도록 해당 역할을 허용하고 다른 모든 보안 주체에 Deny 대해 명시적를 추가합니다. 런타임의 리소스 기반 정책에 대한 자세한 내용은 Amazon Bedrock AgentCore의 리소스 기반 정책을 참조하세요.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowOnlyGatewayRole", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/MyGatewayExecutionRole" }, "Action": "bedrock-agentcore:InvokeAgentRuntime", "Resource": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/RUNTIME_ID" }, { "Sid": "DenyOtherPrincipals", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "bedrock-agentcore:InvokeAgentRuntime", "Resource": "arn:aws:bedrock-agentcore:us-west-2:111122223333:runtime/RUNTIME_ID", "Condition": { "ArnNotEquals": { "aws:PrincipalArn": "arn:aws:iam::111122223333:role/MyGatewayExecutionRole" } } } ] }
작은 정보

명시적는 Deny 항상 동일한 계정의 자격 증명 기반 정책을 Allow포함하여 모든를 재정의합니다. Deny에서를 입력aws:PrincipalArn하면 계정에 있는 다른 권한에 관계없이 게이트웨이의 실행 역할만 런타임을 호출할 수 있습니다.

중요

런타임을 게이트웨이의 실행 역할로 제한하는 것은 해당 역할을 수임할 수 있는 사용자를 제어하는 것만큼만 강력합니다. 게이트웨이 실행 역할을 수임할 수 있는 보안 주체는 마치 게이트웨이인 것처럼 런타임을 호출할 수 있습니다. 게이트웨이만 수임할 수 있도록 게이트웨이 실행 역할의 신뢰 정책에 aws:SourceArnaws:SourceAccount 조건을 추가하여 역할을 잠급니다. 혼동된 대리자 방지 지침은 런타임의 실행 역할에 적용된 것과 동일한 기법을 보여줍니다. 여기에 동일한 패턴을 적용하되 게이트웨이 실행 역할 및 범위에 대한 신뢰 정책을 게이트웨이 ARNaws:SourceArn으로 설정합니다.

JWT 인바운드 권한 부여 및 OAuth 아웃바운드 액세스 샘플

이 안내서에서는 JWT 형식을 사용하여 OAuth 준수 액세스 토큰으로 호출하도록 에이전트 런타임을 설정하는 프로세스를 안내합니다. 샘플 에이전트는 AWS Cognito 액세스 토큰을 사용하여 권한이 부여됩니다. 나중에 에이전트 코드가 사용자를 대신하여 Google 토큰을 가져와 Google Drive를 확인하고 콘텐츠를 가져오는 방법도 알아봅니다.

학습할 내용

이 가이드에서는 다음을 수행하는 방법을 알아봅니다.

  • Cognito 사용자 풀 설정, 사용자 추가, 사용자에 대한 보유자 토큰 가져오기

  • 권한 부여에 Cognito 사용자 풀을 사용하도록 에이전트 런타임 설정

  • 사용자를 대신하여 OAuth 토큰을 가져와 도구를 호출하도록 에이전트 코드를 설정합니다.

사전 조건

시작하기 전에, 다음 사항을 확인해야 합니다.

  • 적절한 권한이 있는 AWS 계정

  • Python 프로그래밍에 대한 기본 이해

  • Docker 컨테이너에 대한 지식(고급 배포용)

  • 런타임을 사용하여 기본 에이전트를 성공적으로 설정

  • 최신 AWS CLI 및 jq 설치됨

  • OAuth 권한 부여, 주로 JWT 보유자 토큰, 클레임 및 다양한 권한 부여 흐름에 대한 기본 이해

1단계: 에이전트 프로젝트 생성

agentcore create 명령을 사용하여 선택한 프레임워크로 스켈레톤 에이전트 프로젝트를 설정합니다.

agentcore create

명령을 실행하면 다음과 같은 메시지가 표시됩니다.

  • 프레임워크 선택(이 자습서에서는 Strands 에이전트 선택)

  • 프로젝트 이름 제공

  • 추가 옵션 구성

다음이 생성됩니다.

  • 선택한 프레임워크가 있는 에이전트 코드

  • agentcore/agentcore.json 구성 파일

  • requirements.txt 필요한 종속성이 있는

참고

생성된 에이전트 코드는 다음 단계에서 OAuth 인증을 구현하기 위한 기반 역할을 합니다.

2단계: AWS Cognito 사용자 풀 설정 및 사용자 추가

Cognito 사용자 풀을 설정하고 사용자를 생성하려면 프로세스를 자동화하는 셸 스크립트를 사용합니다.

자세한 내용은 2단계: 자격 증명 및 인증 모듈 가져오기를 참조하세요.

Cognito 사용자 풀을 설정하고 사용자를 생성하려면

  • 다음 콘텐츠가 포함된 setup_cognito.sh이라는 파일을 생성합니다.

    #!/bin/bash # Create User Pool and capture Pool ID directly export POOL_ID=$(aws cognito-idp create-user-pool \ --pool-name "MyUserPool" \ --policies '{"PasswordPolicy":{"MinimumLength":8}}' \ --region $REGION | jq -r '.UserPool.Id') # Create App Client and capture Client ID directly export CLIENT_ID=$(aws cognito-idp create-user-pool-client \ --user-pool-id $POOL_ID \ --client-name "MyClient" \ --no-generate-secret \ --explicit-auth-flows "ALLOW_USER_PASSWORD_AUTH" "ALLOW_REFRESH_TOKEN_AUTH" \ --region $REGION | jq -r '.UserPoolClient.ClientId') # Create User aws cognito-idp admin-create-user \ --user-pool-id $POOL_ID \ --username $USERNAME \ --region $REGION \ --message-action SUPPRESS > /dev/null # Set Permanent Password aws cognito-idp admin-set-user-password \ --user-pool-id $POOL_ID \ --username $USERNAME \ --password $PASSWORD \ --region $REGION \ --permanent > /dev/null # Authenticate User and capture Access Token export BEARER_TOKEN=$(aws cognito-idp initiate-auth \ --client-id "$CLIENT_ID" \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD \ --region $REGION | jq -r '.AuthenticationResult.AccessToken') # Output the required values echo "Pool id: $POOL_ID" echo "Discovery URL: https://cognito-idp.$REGION.amazonaws.com/$POOL_ID/.well-known/openid-configuration" echo "Client ID: $CLIENT_ID" echo "Bearer Token: $BEARER_TOKEN"

    터미널 창을 열고 다음 환경 변수를 설정합니다.

    • 리전 - 사용하려는 AWS 리전

    • USERNAME - 새 사용자의 사용자 이름

    • 암호 - 새 사용자의 암호

      export REGION=us-east-1 // set your desired Region export USERNAME=USER NAME export PASSWORD=PASSWORD

      터미널 창에서 스크립트를 실행합니다.

      source setup_cognito.sh

      스크립트의 출력을 기록해 둡니다. 다음 단계에서는 이러한 값이 필요합니다.

이 스크립트는 사용자 풀 클라이언트인 Cognito 사용자 풀을 생성하고 사용자를 추가하며 사용자에 대한 보유자 토큰을 생성합니다. 토큰은 기본적으로 60분 동안 유효합니다.

3단계(선택 사항): AgentCore 게이트웨이를 사용하여 런타임 전달

게이트웨이가 런타임에 대한 단일 관리형 진입점이 되도록 AgentCore 게이트웨이로 AgentCore 런타임을 앞당길 수 있습니다. 이를 통해 정책 기반 권한 부여, Amazon Bedrock Guardrails, 요청 및 응답 인터셉터, 통합 관찰성을 모두 에이전트의 자체 환경 외부에서 적용할 수 있습니다. 전체 근거와 이를 설정하는 방법은 AgentCore Gateway를 사용하여 런타임 전달을 참조하세요.

이 런타임을 전달하려면 다음 단계에서 런타임을 배포하기 전에 지금 게이트웨이를 생성합니다. 배포한 후 런타임을 게이트웨이 대상으로 추가합니다.

호출자가 게이트웨이를 우회할 수 없도록 하려면 해당 게이트웨이로부터의 호출만 허용하도록 런타임을 제한합니다. 다음 단계에서 권한 부여자의 일부로를 사용하여 이를 구성합니다allowedWorkloadConfiguration( allowedWorkloadConfiguration: 게이트웨이에 대한 호출 제한 참조).

4단계: 에이전트 배포

중요

2025년 10월 13일부터 Amazon Bedrock AgentCore는 새 에이전트에 대한 수동 IAM 정책 구성이 필요한 대신 워크로드 자격 증명 권한에 서비스 연결 역할(SLR)을 사용합니다.

서비스 연결 역할 세부 정보:

  • 이름: AWSServiceRoleForBedrockAgentCoreRuntimeIdentity

  • 서비스 보안 주체: runtime-identity.bedrock-agentcore.amazonaws.com

  • 용도: 워크로드 자격 증명 액세스 토큰 및 OAuth 자격 증명을 관리합니다.

AgentCore Control APIs를 호출하는 데 사용하는 역할에 서비스 연결 역할을 생성할 수 있는 권한이 있는지 확인합니다.

{ "Sid": "CreateBedrockAgentCoreIdentityServiceLinkedRolePermissions", "Effect": "Allow", "Action": "iam:CreateServiceLinkedRole", "Resource": "arn:aws:iam::*:role/aws-service-role/runtime-identity.bedrock-agentcore.amazonaws.com/AWSServiceRoleForBedrockAgentCoreRuntimeIdentity", "Condition": { "StringEquals": { "iam:AWSServiceName": "runtime-identity.bedrock-agentcore.amazonaws.com" } } }

이점: 서비스 연결 역할은 수동 정책 구성 없이 워크로드 자격 증명 액세스에 필요한 권한을 자동으로 제공합니다.

서비스 연결 역할에 대한 자세한 내용은 자격 증명 서비스 연결 역할을 참조하세요.

이제 생성한 Cognito 사용자 풀을 사용하여 JWT 권한 부여로 에이전트를 배포합니다. 권한 부여자 구성을 사용하여 에이전트를 생성해야 합니다. 다음 표는 다양한 권한 부여자 구성 파라미터와 이를 사용하여 수신 토큰을 검증하는 방법을 나타냅니다.

authorizer_configuration 디코딩된 토큰의 클레임 참고

검색 URL → 발급자

iss

검색 URL은 발급자 URL을 가리켜야 합니다. 이는 디코딩된 토큰의 iss 클레임과 일치해야 합니다.

allowedClients

client_id

토큰의 client_id는 권한 부여자에 지정된 허용된 클라이언트 중 하나와 일치해야 합니다.

allowedAudience

aud

토큰의 aud 클레임 값 중 하나는 권한 부여자에 지정된 허용된 대상 중 하나와 일치해야 합니다.

allowedWorkloadConfiguration

internal

선택 사항. 시작 시 AgentCore Gateway만 런타임을 호출하도록 허용하는 데 사용됩니다. 게이트웨이에 대한 호출 제한을 참조하세요.

client_id와 aud가 모두 제공된 경우 에이전트 런타임 권한 부여자는 둘 다 확인합니다.

allowedWorkloadConfiguration: 게이트웨이에 대한 호출 제한

allowedWorkloadConfiguration 필드는 요청의 자격 증명 체인에서 런타임을 호출할 수 있는 워크로드를 customJWTAuthorizer 제한합니다. 자격 증명 체인에 해당 게이트웨이가 포함된 경우에만 런타임이 요청을 수락하도록 허용된 워크로드를 게이트웨이로 설정합니다. 이렇게 하면 OAuth(JWT) 런타임이 3단계에서 설정한 게이트웨이를 통해서만 트래픽이 도착하도록 적용합니다.

다음 필드 중 하나를 사용하여 허용된 워크로드를 제공합니다. 하나 또는 둘 다를 지정할 수 있습니다. 자격 증명 체인이 필드의 항목과 일치하면 요청이 수락되므로 둘 다 제공할 필요가 없습니다.

  • hostingEnvironments - 워크로드가 대상을 호출할 수 있는 호스팅 환경 목록입니다. 각 항목은가 있는 객체입니다arn. 시작 시 지원되는 유일한 호스팅 환경은 AgentCore Gateway이므로 각 환경은 AgentCore Gateway ARN이어야 arn 합니다.

  • workloadIdentities - 대상을 호출할 수 있는 워크로드 자격 증명 이름 목록입니다. 워크로드 자격 증명 이름은 ARN이 아닙니다. 게이트웨이 워크로드 자격 증명 ARN의 마지막 세그먼트로, GetGateway 응답의 workloadIdentityDetails 필드에서 찾을 수 있습니다. 예를 들어 workloadIdentityDetails.workloadIdentityArn가 인 경우 arn:aws:bedrock-agentcore:us-east-1:111122223333:workload-identity-directory/default/workload-identity/my-gateway-workload-identity워크로드 자격 증명 이름은 입니다my-gateway-workload-identity.

다음 예제에서는 ARN을 기준으로 호출을 특정 AgentCore Gateway로 제한하는 에이전트 런타임을 생성합니다. 게이트웨이를 허용하는 가장 간단한 방법은 hostingEnvironments 단독으로 지정하는 것입니다.

{ "authorizerConfiguration": { "customJWTAuthorizer": { "discoveryUrl": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_example/.well-known/openid-configuration", "allowedClients": ["your-client-id"], "allowedWorkloadConfiguration": { "hostingEnvironments": [ { "arn": "arn:aws:bedrock-agentcore:us-east-1:111122223333:gateway/my-gateway-id" } ] } } } }

또는 워크로드 자격 증명 이름으로 게이트웨이를 식별하거나 두 필드를 모두 지정할 수 있습니다. 둘 다 있는 경우 두 필드의 항목과 일치하는 경우 요청이 허용됩니다. 다음 allowedWorkloadConfiguration 코드 조각은 두 개의 서로 다른 게이트웨이를 허용합니다. 하나는 ARN으로 식별되고 다른 하나는 워크로드 자격 증명 이름으로 식별됩니다.

"allowedWorkloadConfiguration": { "hostingEnvironments": [ { "arn": "arn:aws:bedrock-agentcore:us-east-1:111122223333:gateway/my-gateway-1-id" } ], "workloadIdentities": [ "my-gateway-2-workload-identity" ] }
참고

시작 시 allowedWorkloadConfiguration는 AgentCore 런타임 대상에 대해서만 지원되며 허용되는 워크로드는 AgentCore 게이트웨이입니다.

에이전트 런타임 생성 및 배포

권한 부여자 구성을 준비한 상태에서 에이전트 런타임을 생성하고 배포합니다. 다음 예제에서는 AgentCore CLI 또는 AWS SDK for Python(Boto3)을 사용하여이 작업을 수행하는 방법을 보여줍니다. 출력의 에이전트 런타임 ARN을 기록해 둡니다. 다음 단계에서 에이전트를 호출하려면이 ARN이 필요합니다.

AgentCore CLI

에이전트를 구성하고 배포하려면

  1. AgentCore CLI를 사용하여 에이전트 프로젝트를 생성합니다.

    agentcore create

    메시지가 표시되면 프레임워크를 선택합니다(이 자습서에서는 Strands Agents 선택).

  2. 에이전트를 배포합니다.

    agentcore deploy
  3. 출력의 에이전트 런타임 ARN을 기록해 둡니다. 다음 단계에서이 정보가 필요합니다.

    작은 정보

    또한 플래그 없이 agentcore create 명령을 실행하여 프로젝트 설정을 안내하는 완전 대화형 환경을 제공할 수 있습니다.

Python
  1. import boto3 # Create the client client = boto3.client('bedrock-agentcore-control', region_name="us-east-1") # Call the CreateAgentRuntime operation response = client.create_agent_runtime( agentRuntimeName='HelloAgent', agentRuntimeArtifact={ 'containerConfiguration': { 'containerUri': '111122223333.dkr.ecr.us-east-1.amazonaws.com/my-agent:latest' } }, authorizerConfiguration={ "customJWTAuthorizer": { "discoveryUrl": 'COGNITO_DISCOVERY_URL', "allowedClients": ['COGNITO_CLIENT_ID'] } }, networkConfiguration={"networkMode":"PUBLIC"}, roleArn='arn:aws:iam::111122223333:role/AgentRuntimeRole', lifecycleConfiguration={ 'idleRuntimeSessionTimeout': 300, # 5 min, configurable 'maxLifetime': 1800 # 30 minutes, configurable }, )

5단계: 보유자 토큰을 사용하여 에이전트 간접 호출

에이전트가 JWT 권한 부여로 배포되었으므로 이제 보유자 토큰을 사용하여 에이전트를 호출할 수 있습니다.

참고

3단계에서 런타임에 게이트웨이를 적용한 경우, 호출하기 전에 배포된 런타임을 게이트웨이 대상으로 추가하고 AgentCore 런타임 대상을 참조한 다음 런타임 엔드포인트가 아닌 다음 예제에 표시된 게이트웨이 엔드포인트를 통해 호출합니다.

중요

기존 사용자에게 중요: 2025년 10월 13일 이전에 생성된 에이전트는 자격 증명 권한에 에이전트 실행 역할을 계속 사용하며 이전 정책을 에이전트의 실행 역할에 연결해야 합니다.

새 에이전트 : 2025년 10월 13일 이후에 생성된 에이전트의 경우 권한이 서비스 연결 역할에서 자동으로 처리되므로이 정책은 필요하지 않습니다.

{ "Sid": "GetAgentAccessToken", "Effect": "Allow", "Action": [ "bedrock-agentcore:GetWorkloadAccessToken", "bedrock-agentcore:GetWorkloadAccessTokenForJWT", "bedrock-agentcore:GetWorkloadAccessTokenForUserId" ], # point to the workload identity for the runtime; the workload identity can be found in # the GetAgentRuntime response and has your agent name in it. "Resource": [ "arn:aws:bedrock-agentcore:region:account-id:workload-identity-directory/default", "arn:aws:bedrock-agentcore:region:account-id:workload-identity-directory/default/workload-identity/agentname-*" ] }

에이전트 호출

Amazon Cognito로 생성한 사용자의 보유자 토큰을 가져옵니다.

# use the password and other details used when you created the cognito user export TOKEN=$(aws cognito-idp initiate-auth \ --client-id "$CLIENT_ID" \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME='testuser',PASSWORD='PASSWORD' \ --region us-east-1 | jq -r '.AuthenticationResult.AccessToken')

다음 지침의 나머지 부분을 사용하여 에이전트를 호출합니다.

OAuth를 사용하여 에이전트를 호출합니다.

Use cURL
  1. // Invoke with OAuth token export PAYLOAD='{"prompt": "hello what is 1+1?"}' export BEDROCK_AGENT_CORE_ENDPOINT_URL="https://bedrock-agentcore.us-east-1.amazonaws.com" # If you fronted the runtime with a gateway (Step 3), the core endpoint URL is now your gateway URL # export BEDROCK_AGENT_CORE_ENDPOINT_URL="https://${GATEWAY_ID}.gateway.bedrock-agentcore.us-east-1.amazonaws.com/${TARGET_NAME}" export INVOKE_URL="${BEDROCK_AGENT_CORE_ENDPOINT_URL}/runtimes/${ESCAPED_AGENT_ARN}/invocations?qualifier=DEFAULT" # If you fronted the runtime with a gateway (Step 3), the preceding URL works but there is also a simpler alternative: # export INVOKE_URL="${BEDROCK_AGENT_CORE_ENDPOINT_URL}/invocations" curl -v -X POST "${INVOKE_URL}" \ -H "Authorization: Bearer ${TOKEN}" \ -H "X-Amzn-Trace-Id: your-trace-id" \ -H "Content-Type: application/json" \ -H "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id: your-session-id" \ -d ${PAYLOAD}
Use Python
  1. boto3는 보유자 토큰을 사용한 호출을 지원하지 않으므로 Python의 요청 라이브러리와 같은 HTTP 클라이언트를 사용해야 합니다.

    보유자 토큰으로 에이전트를 호출하려면

  2. 다음 콘텐츠invoke_agent.py로 라는 Python 스크립트를 생성합니다.

    import requests import urllib.parse import json import os # Configuration Constants REGION_NAME = "AWS_REGION" # === Agent Invocation Demo === invoke_agent_arn = "YOUR_AGENT_ARN_HERE" auth_token = os.environ.get('TOKEN') print(f"Using Agent ARN from environment: {invoke_agent_arn}") # URL encode the agent ARN escaped_agent_arn = urllib.parse.quote(invoke_agent_arn, safe='') # Construct the URL — invoke the runtime directly url = f"https://bedrock-agentcore.{REGION_NAME}.amazonaws.com/runtimes/{escaped_agent_arn}/invocations?qualifier=DEFAULT" # If you are fronting the runtime with a gateway (see Step 3), invoke through # the gateway target instead (replace GATEWAY_ID and my-target): # url = f"https://GATEWAY_ID.gateway.bedrock-agentcore.{REGION_NAME}.amazonaws.com/my-target/invocations" # Set up headers headers = { "Authorization": f"Bearer {auth_token}", "X-Amzn-Trace-Id": "your-trace-id", "Content-Type": "application/json", "X-Amzn-Bedrock-AgentCore-Runtime-Session-Id": "testsession123" } # Enable verbose logging for requests import logging logging.basicConfig(level=logging.DEBUG) logging.getLogger("urllib3.connectionpool").setLevel(logging.DEBUG) invoke_response = requests.post( url, headers=headers, data=json.dumps({"prompt": "Hello what is 1+1?"}) ) # Print response in a safe manner print(f"Status Code: {invoke_response.status_code}") print(f"Response Headers: {dict(invoke_response.headers)}") # Handle response based on status code if invoke_response.status_code == 200: response_data = invoke_response.json() print("Response JSON:") print(json.dumps(response_data, indent=2)) elif invoke_response.status_code >= 400: print(f"Error Response ({invoke_response.status_code}):") error_data = invoke_response.json() print(json.dumps(error_data, indent=2)) else: print(f"Unexpected status code: {invoke_response.status_code}") print("Response text:") print(invoke_response.text[:500])
  3. 3단계의 AWS_REGION을 사용 중인 AWS 리전으로 바꿉니다.

  4. YOUR_AGENT_ARN_HERE를 3단계의 실제 에이전트 런타임 ARN으로 바꿉니다.

  5. 스크립트를 실행합니다.

    python invoke_agent.py

OAuth 오류 응답

OAuth로 구성된 에이전트는 RFC 6749(OAuth 2.0) 인증 표준을 따릅니다. 인증이 누락된 경우 서비스는 클라이언트가 GetRuntimeProtectedResourceMetadata API를 통해 권한 부여 서버 엔드포인트를 검색할 수 있도록 (RFC 7235에 따라) WWW-Authenticate 헤더와 함께 401 무단 응답을 반환합니다.

401 무단 - 인증 누락

권한 부여 헤더에 베어러 토큰이 제공되지 않은 경우 응답은 다음과 같습니다.

HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer resource_metadata="https://bedrock-agentcore.{region}.amazonaws.com/runtimes/{ESCAPED_ARN}/invocations/.well-known/oauth-protected-resource?qualifier={QUALIFIER}"

WWW 인증 헤더의 resource_metadata URL은 보호된 리소스 메타데이터(PRM) API를 가리킵니다. PRM API를 사용하면 클라이언트가이 에이전트와 OAuth 엔드포인트 URLs.

참고

검색된 엔드포인트를 사용하기 client_id 전에를 얻으려면 (콘 AWS 솔 또는 CLI를 통해) Cognito에 OAuth 클라이언트를 사전 등록해야 합니다. Amazon Cognito는 동적 클라이언트 등록(RFC 7591)을 지원하지 않습니다.

6단계: OAuth를 사용하여 도구에 액세스하도록 에이전트 설정

이 섹션에서는 OAuth2 인증을 사용하여 외부 리소스에 안전하게 액세스하기 위해 에이전트 코드를 AgentCore 자격 증명 공급자와 연결하는 방법을 알아봅니다.

다음 예제에서는 에이전트 런타임에서 실행되는 에이전트가 사용자에게 OAuth 동의를 요청하여 Google 계정으로 인증하고 에이전트가 Google Drive 콘텐츠에 액세스할 수 있도록 권한을 부여하는 방법을 보여줍니다.

자격 증명 설정에 대한 자세한 내용은 AgentCore 자격 증명 시작하기를 참조하세요.

6.1단계: 자격 증명 공급자 설정

Google 자격 증명 공급자를 설정하려면 다음을 수행해야 합니다.

  1. Google에 애플리케이션을 등록하여 클라이언트 ID 및 클라이언트 보안 암호를 가져옵니다.

  2. AWS CLI를 사용하여 OAuth 자격 증명 공급자를 생성합니다. your-client-idyour-client-secret을 실제 Google OAuth2 클라이언트 ID 및 클라이언트 보안 암호로 바꿉니다.

    OAUTH2_CREDENTIAL_PROVIDER_RESPONSE=$(aws bedrock-agentcore-control create-oauth2-credential-provider \ --name "google-provider" \ --credential-provider-vendor "GoogleOauth2" \ --oauth2-provider-config-input '{ "googleOauth2ProviderConfig": { "clientId": "your-client-id", "clientSecret": "your-client-secret" } }' \ --output json) OAUTH2_CALLBACK_URL=$(echo $OAUTH2_CREDENTIAL_PROVIDER_RESPONSE | jq -r '.callbackUrl') echo "OAuth2 Callback URL: $OAUTH2_CALLBACK_URL"
    참고

    CreateOauth2CredentialProvider 응답callbackUrl에서를 가져오고 Google 애플리케이션의 리디렉션 URI 목록에 URI를 추가합니다. 콜백 URL은 https://bedrock-agentcore.us-east-1.amazonaws.com/identities/oauth2/callback/********-****-****-****-****-********와 같아야 합니다.

호출 역할에 자격 증명 공급자에 액세스하는 데 필요한 권한이 있는지 확인합니다.

6.2단계: 에이전트가 Google Drive 콘텐츠를 읽을 수 있도록 활성화

다음 예제와 같이 에이전트 코어 SDK 주석이 있는 도구를 생성하여 3각 OAuth 프로세스를 자동으로 시작합니다. 에이전트가이 도구를 호출하면 브라우저에서 권한 부여 URL을 열고 에이전트가 Google Drive에 액세스하는 데 동의하라는 메시지가 표시됩니다.

import asyncio from bedrock_agentcore.identity.auth import requires_access_token, requires_api_key # This annotation helps agent developer to obtain access tokens from external applications @requires_access_token( provider_name="google-provider", scopes=["https://www.googleapis.com/auth/drive.metadata.readonly"], # Google OAuth2 scopes auth_flow="USER_FEDERATION", # 3LO flow on_auth_url=lambda x: print("Copy and paste this authorization url to your browser: ", x), # prints authorization URL to console force_authentication=True, callback_url='insert_oauth2_callback_url_for_session_binding' ) async def read_from_google_drive(*, access_token: str): print(access_token) #You can see the access_token # Make API calls... main(access_token) asyncio.run(read_from_google_drive(access_token=""))

백그라운드에서 일어나는 일

이 코드가 실행되면 다음 프로세스가 발생합니다.

  1. 에이전트 런타임은 구성된 권한 부여자에 따라 인바운드 토큰을 승인합니다.

  2. 에이전트 런타임은이 토큰을 bedrock-agentcore:GetWorkloadAccessTokenForJWT API를 통해 워크로드 액세스 토큰과 교환하고 페이로드 헤더를 통해 에이전트 코드로 전달합니다WorkloadAccessToken.

  3. 도구 호출 중에 에이전트는이 워크로드 액세스 토큰을 사용하여 토큰 볼트 API를 호출bedrock-agentcore:GetResourceOauth2Token하고 3LO 인증 URL을 생성합니다.

  4. 에이전트는 on_auth_url 메서드에 지정된 대로이 URL을 클라이언트 애플리케이션에 전송합니다.

  5. 클라이언트 애플리케이션은 에이전트가 Google Drive에 액세스하는 데 동의하는 사용자에게이 URL을 제공합니다.

  6. AgentCore Identity 서비스는 만료될 때까지 Google 액세스 토큰을 안전하게 수신하고 캐시하므로 사용자가 모든 요청에 동의할 필요 없이 사용자의 후속 요청이이 토큰을 사용할 수 있습니다.

참고

AgentCore Identity Service는 에이전트 워크로드 자격 증명 및 사용자 ID( AWS Cognito 토큰과 같은 인바운드 JWT 토큰)를 바인딩 키로 사용하여 AgentCore 토큰 볼트에 Google 액세스 토큰을 저장하므로 Google 토큰이 만료될 때까지 반복되는 동의 요청을 제거합니다.

7단계: (선택 사항) AgentCore 런타임에 JWT 토큰 전파

선택적으로 AgentCore 런타임에 권한 부여 헤더를 전달하여 클레임을 추출할 수 있습니다. 요청 헤더 허용 목록 구성을 사용하여이 작업을 수행할 수 있습니다. 자세한 내용은 RequestHeaderConfiguration을 참조하세요.

7.1단계: 헤더를 읽도록 에이전트 코드 수정

이 단계에서는 에이전트 코드를 변경하여 PyJWT 라이브러리를 사용하여 JWT 토큰에서 클레임을 디코딩하고 추출할 수 있습니다.

requirements.txt

생성된 프로젝트의 requirements.txt 파일에 PyJWT 종속성을 추가합니다.

PyJWT

에이전트 코드 업데이트

다음 코드와 같이 생성된 프로젝트(일반적으로 src/main.py 또는 프레임워크 선택에 따라 유사)에서 기본 에이전트 파일을 수정합니다. 인바운드 권한 부여가 완료될 때 AgentCore 런타임에서 이미 검증되었으므로 여기에서 토큰 서명 검증을 건너뛸 수 있습니다.

import jwt import json .... @app.entrypoint def invoke(payload, context): auth_header = context.request_headers.get('Authorization') if not auth_header: return None # Remove "Bearer " prefix if present token = auth_header.replace('Bearer ', '') if auth_header.startswith('Bearer ') else auth_header try: # Skip signature validation as agent runtime has validated the token already. claims = jwt.decode(token, options={"verify_signature": False}) app.logger.info("Claims: %s", json.dumps(claims)) except jwt.InvalidTokenError as e: app.logger.exception("Invalid JWT token: %s", e) .....

7.2단계: 요청 헤더 허용 목록으로 에이전트 생성

AgentCore CLI를 사용하여 요청 헤더 허용 목록으로 에이전트를 구성합니다. 생성된 프로젝트 디렉터리로 이동하여 다음을 실행합니다.

agentcore create --name HelloAgent --framework Strands --model-provider Bedrock --memory none # Now deploy the agent runtime agentcore deploy
참고

AgentCore CLI는 프로젝트 구조 및 구성 파일을 생성합니다. 프레임워크 선택에 따라 agentcore/agentcore.json에서 에이전트 구성을 조정합니다.

7.3단계: 에이전트 호출

OAuth를 사용하여 에이전트를 호출하면 CloudWatch Logs의 에이전트 로그에 클레임이 표시됩니다.

문제 해결

토큰 관련 문제를 디버깅하는 방법

토큰 인증에 문제가 발생하면 토큰을 디코딩하여 내용을 검사할 수 있습니다.

echo "$TOKEN" | cut -d '.' -f2 | tr '_-' '/+' | awk '{ l=4 - length($0)%4; if (l<4) printf "%s", $0; for (i=0; i<l; i++) printf "="; print "" }' | base64 -D | jq

이렇게 하면 토큰의 페이로드가 출력되며, 이는 다음과 유사합니다.

{ "sub": "subid", "iss": "https://cognito-idp.us-east-1.amazonaws.com/userpoolid", "client_id": "clientid", "origin_jti": "originjti", "event_id": "eventid", "token_use": "access", "scope": "aws.cognito.signin.user.admin", "auth_time": 1752275688, "exp": 1752279288, "iat": 1752275688, "jti": "jti", "username": "username" }

토큰 문제를 해결할 때 다음을 확인합니다.

  • 에이전트 권한 부여자의 검색 URL이 가리키는 발급자 URL은 토큰의 발급자 클레임과 일치해야 합니다. 다음을 수행하여 일치하는지 확인합니다.

    • 에이전트를 생성할 때 권한 부여자 구성에 제공한 검색 URL을 선택합니다. 예를 들면 다음과 같습니다. https://cognito-idp.us-east-1.amazonaws.com/us-east-1_nnnnnnnnn/.well-known/openid-configuration

      • 발급자 URL - "issuer": "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_12345566"를 확인합니다. 토큰의 iss 클레임 값과 일치해야 합니다.

  • client_id 토큰의 클레임은 제공된 경우 권한 부여자 allowedClients 항목 중 하나와 일치해야 합니다.

    • 에이전트를 생성할 때 제공한 클라이언트 ID를 기록해 둡니다.

    • 디코딩된 토큰의 client_id 클레임과 일치하는지 확인합니다.

  • aud 토큰의 클레임은 제공된 경우 권한 부여자 allowedAudience 항목 중 하나와 일치해야 합니다.

    • 에이전트를 생성할 때 제공한 대상 목록을 기록해 둡니다.

    • 디코딩된 토큰의 aud 클레임과 일치하는지 확인합니다.

  • 토큰은 몇 분 동안만 유효합니다(기본 Amazon Cognito 만료 시간은 60분). 필요에 따라 새 토큰을 가져옵니다.