

# 예: AgentCore CLI에서 생성한 기본 게이트웨이 및 대상에 대한 권한 부여
<a name="gateway-using-auth-ex-starter"></a>

AgentCore CLI를 사용하여 게이트웨이와 Lambda 대상을 생성한 경우 CLI는 JWT 기반 인바운드 권한 부여 및 IAM 기반 아웃바운드 권한 부여를 자동으로 구성합니다.

**참고**  
를 사용하여 게이트웨이를 호출하면 CLI`agentcore invoke`가 인증을 자동으로 처리합니다. 아래 단계는 게이트웨이를 프로그래밍 방식으로 호출하려는 경우에만 필요합니다(예: AWS SDK 또는 사용`curl`).

프로그래밍 방식 액세스를 위해 다음을 사용하여 권한을 부여합니다.
+  **JWT를 사용한 인바운드 권한** 부여 - 자동으로 설정된 Amazon Cognito 권한 부여에서 액세스 토큰을 가져와 권한 부여 헤더에 포함합니다. 토큰을 얻는 방법을 알아보려면 아래 예제를 참조하세요.
+  **IAM을 사용한 아웃바운드 권한 부여** - AgentCore CLI는 다음 권한을 구성하므로 추가 설정이 필요하지 않습니다.
  + 게이트웨이 서비스 역할에는 Lambda의 모든 함수를 호출할 수 있는 권한이 있습니다( [BedrockAgentCoreFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/BedrockAgentCoreFullAccess.html) 관리형 정책에서 제공됨).
  + 생성된 Lambda 함수는 게이트웨이 서비스 역할을 호출할 수 `Principal` 있는 로 구성됩니다.

다음 정보를 수집하여 Amazon Cognito의 도움을 받아 AgentCore CLI에서 게이트웨이에 대해 생성한 액세스 토큰을 얻을 수 있습니다.
+  **토큰 엔드포인트** - 게이트웨이에 대한 권한 부여자 구성의 **검색 URL**에서를 찾습니다. API를 사용하는 경우 게이트웨이에 대한 [ListGateways](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_ListGateways.html) 요청 또는 [GetGateway](https://docs.aws.amazon.com/bedrock-agentcore-control/latest/APIReference/API_GetGateway.html) 요청을 전송하여 검색 URL을 찾을 수 있습니다.
+  **클라이언트 ID** - Amazon Cognito 사용자 풀 정보에서를 찾습니다. API를 사용하는 경우 게이트웨이와 연결된 사용자 풀에 대해 [ListUserPools](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUserPools.html) 요청 또는 [DescribeUserPool](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPool.html) 요청을 보낼 수 있습니다.
+  **클라이언트 보안 암호** - Amazon Cognito 사용자 풀 앱 클라이언트 정보에서를 찾습니다. API를 사용하는 경우 게이트웨이와 연결된 클라이언트 ID 및 사용자 풀 ID를 지정하여 [DescribeUserPoolClient](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_DescribeUserPoolClient.html) 요청을 보낼 수 있습니다.

먼저 다음 방법 중 하나를 사용하여 이러한 값을 수집합니다. 다음 방법 중 하나를 선택합니다.

**Example**  

1. **토큰 엔드포인트** 가져오기:

   1. [https://console.aws.amazon.com/bedrock-agentcore/home](https://console.aws.amazon.com/bedrock-agentcore/home#) AgentCore 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **게이트웨이를** 선택합니다.

   1. **게이트웨이** 섹션에서 게이트웨이를 선택합니다.

   1. **인바운드 자격 증명** 섹션에서 다음 값을 기록해 둡니다.
      +  **허용된 클라이언트** - 게이트웨이에 액세스할 수 있는 클라이언트 IDs.
      +  **검색 URL** - 형식은 `https://cognito-idp.${Region}.amazonaws.com/${UserPoolId}/.well-known/openid-configuration` 이어야 합니다. 다음 값을 저장합니다.
        +  `${UserPoolId}` - 검색 URL에서 추출합니다.
        +  **토큰 엔드포인트** - 검색 URL 링크를 선택하고 `token_endpoint` 필드에서 값을 찾습니다.

1. **클라이언트 ID** 및 **클라이언트 보안** 암호 가져오기:

   1. [https://console.aws.amazon.com/cognito](https://console.aws.amazon.com/cognito)에서 Amazon Cognito 콘솔을 엽니다.

   1. 왼쪽 탐색 창에서 **사용자 풀을** 선택합니다.

   1. 게이트웨이와 연결된 사용자 풀 ID를 선택합니다.

   1. 왼쪽 탐색 창에서 **앱 클라이언트**를 선택합니다.

   1. **클라이언트 ID**가 토큰 엔드포인트에 허용된 클라이언트와 일치하는 앱 클라이언트를 선택합니다. ID 값을 저장합니다.

   1. **클라이언트 보안 암호**에서 **클라이언트 보안 암호 표시를** 선택하고 해당 값을 저장합니다.

1. 터미널에서 AgentCore `get-gateway` 명령을 실행하고 다음 예제와 같이 `--gateway-identifier` 인수에 게이트웨이 ID를 지정합니다.

   ```
   aws bedrock-agentcore-control get-gateway --gateway-identifier my-gateway-id
   ```

1. 응답에서 `authorizerConfiguration` 필드의 `discoveryUrl`를 기록해 둡니다.
   + URL`${UserPoolId}`에서를 저장합니다. 형식은 여야 합니다`https://cognito-idp.${Region}.amazonaws.com/${UserPoolId}/.well-known/openid-configuration`.
   + `allowedClients` 값을 저장합니다. 토큰 엔드포인트에 액세스할 수 있는 클라이언트 IDs입니다.
   + 브라우저`discoveryUrl`에서 로 이동하여 `token_endpoint` 값을 저장합니다.

1. 터미널에서 Amazon Cognito `describe-user-pool-client` 명령을 실행하고 다음 예제와 같이 `--user-pool-id` 인수에 사용자 풀 ID를 지정하고 `--client-id` 필드에 허용되는 클라이언트 ID를 지정합니다.

   ```
   aws cognito-idp describe-user-pool-client --user-pool-id my-user-pool-id --client-id my-client-id
   ```

1. `ClientSecret` 값을 저장합니다.

1. 다음 Python 코드를 실행하여 토큰 엔드포인트, 클라이언트 ID 및 클라이언트 암호를 변수로 저장합니다.

   ```
   import requests
     import boto3
   
     # Initialize AWS clients
     agentcore_client = boto3.client("bedrock-agentcore-control")
     cognito_client = boto3.client("cognito-idp")
   
     # Replace with your actual gateway ID
     gateway_id = "my-gateway-id"
   
     # Get discovery URL and first allowed client
     auth_config = agentcore_client.get_gateway(gatewayIdentifier=gateway_id)["authorizerConfiguration"]["customJWTAuthorizer"]
     discovery_url, client_id = auth_config["discoveryUrl"], auth_config["allowedClients"][0]
   
     # Get token endpoint from discovery URL
     discovery_url_json = requests.get(discovery_url).json()
     token_endpoint, user_pool_id = discovery_url_json["token_endpoint"], discovery_url_json["issuer"].split("/")[-1]
   
     # Get client secret
     client_secret = cognito_client.describe_user_pool_client(
         UserPoolId=user_pool_id,
         ClientId=client_id
     )["UserPoolClient"]["ClientSecret"]
   ```

둘째, 수집한 값을 사용하여 토큰 엔드포인트에서 토큰에 액세스합니다. 다음 방법 중 하나를 선택합니다.

**Example**  

1. 터미널에서 다음 명령을 실행하여 토큰 엔드포인트, 클라이언트 ID 및 클라이언트 보안 암호 값을 바꿉니다.

   ```
   curl --http1.1 -X POST ${TokenEndpoint} \
       -H "Content-Type: application/x-www-form-urlencoded" \
       -d "grant_type=client_credentials&client_id=${ClientId}&client_secret=${ClientSecret}"
   ```

   토큰은 응답의 `access_token` 필드에 있지만 `token_type` 필드는를 지정해야 합니다`Bearer`.

1. 다음 Python 코드를 실행하여 액세스 토큰을 가져옵니다. 코드는 이전 단계의 `token_endpoint` , `client_id` 및 `client_secret` 값을 저장했다고 가정합니다.

   ```
   import requests
     import json
   
     def get_access_token(token_endpoint, client_id, client_secret):
         headers={
             "Content-Type": "application/x-www-form-urlencoded"
         }
   
         payload={
             "grant_type": "client_credentials",
             "client_id": client_id,
             "client_secret": client_secret
         }
   
         response = requests.post(token_endpoint, headers=headers, data=payload)
         return response.json()
   
     # Replace the argument values as necessary, if you didn't previously store them as these variables
     access_token_response = get_access_token(
         token_endpoint=token_endpoint,
         client_id=client_id,
         client_secret=client_secret
     )
   
     access_token = access_token_response["access_token"]
   ```