안녕하세요.
오늘은 AWS Bedrock에 대해 포스팅해 보겠습니다.

# AWS Bedrock 이란?
별도의 인프라 관리 없이 API를 통해 Amazon Nova 및 파트너사(Anthropic, Stability AI 등)의 파운데이션 모델(FM)에 접근할 수 있는 서버리스 서비스입니다.
완전 관리형 서버리스 서비스이다 보니 별도의 배포 없이 바로 호출이 가능합니다.
# 엔드포인트
AWS Bedrock은 bedrock-runtime과 bedrock-mantle이라는 두 엔드포인트를 지원합니다.
📌 bedrock-runtime
▶ 특징 : AWS 환경에서 기본적으로 사용하는 런타임 엔드포인트로 EC2나 Lambda에 IAM Role을 부여하고 boto3 같은 AWS SDK를 통해 호출할 때 사용합니다.
▶ Endpoint : bedrock-runtime.{region}.amazonaws.com
📌 bedrock-mantle
▶ 특징 : 기존에 OpenAI(openai 패키지)나 Anthropic SDK로 짜여진 애플리케이션 코드가 있다면, 코드 구조를 뜯어고칠 필요 없이 base_url과 api_key만 Bedrock Mantle 주소로 교체하여 바로 Bedrock 모델을 서빙할 수 있습니다.
즉, 기존에 사용하던 OpenAI, Claude SDK가 있다면 mantle 엔드포인트를 이용하여 호출 가능합니다.
▶ Endpoint : bedrock-mantle.{region}.api.aws
# API 메서드
Amazon Bedrock은 각각 서로 다른 통합 패턴 및 사용 사례에 맞게 설계된 4가지 런타임 APIs 지원합니다.
📌 Invoke
▶ 가장 원초적이고 기본적인 API로 모델이 요구하는 고유의 JSON 페이로드 구조를 그대로 맞춰서 1회성 요청을 보낼 때 씁니다.
📌 Converse
▶ 모델마다 JSON 구조가 다른 단점을 해결하기 위해, AWS가 만든 공통 대화 규격입니다.
(Claude든 Nova든 똑같은 코드로 호출 가능)
📌 Chat Completions
▶ OpenAI SDK 문법(client.chat.completions.create)을 그대로 Bedrock 런타임에서 사용할 수 있게 래핑 된 인터페이스입니다.
📌 Responses
▶ Mantle 전용 응답 API로 새로운 bedrock-mantle 엔드포인트에서 초고도 보안(ZOA) 환경 기반으로 결과를 받아오는 표준 인터페이스입니다.
📌 Messages
▶ Anthropic 호환 API로 Anthropic Claude의 고유 메시지 API 규격을 Bedrock 엔드포인트에서 그대로 수용할 수 있도록 지원하는 인터페이스입니다.
# 리전별 가용성
AWS Bedrock에는 세 가지 추론 옵션(리전 내, 지리적 교차 리전, 글로벌 교차 리전)이 존재하며 각 옵션에 따라 데이터가 처리되는 지리적 경계와 최대 가용 처리량이 달라지므로 애플리케이션의 요구사항에 맞춘 유연한 아키텍처 설계가 가능합니다."
1. 리전 내 (In-Region)
- 방식: 요청이 사용자가 지정한 단일 AWS 리전 내에서만 처리됩니다.
- 데이터 레지던시: 데이터(프롬프트 및 출력)가 해당 리전 내에만 엄격하게 머무릅니다.
- 처리량: 단일 리전의 컴퓨팅 용량으로 제한되며, 리전별 서비스 할당량(Quota)의 영향을 받습니다.
- 요금: 해당 리전의 표준 온디맨드 요금이 부과됩니다.
- modelId 형식: 접두사 없는 직접 모델 ID 형태를 사용합니다. (예: anthropic.claude-3-5-sonnet-20241022-v2:0)
즉, 입출력이 리전 밖으로 절대 빠져나가선 안 되는 경우에 적합합니다.
2. 지리적 교차 리전 (Geographic Cross-Region)
- 작동 방식: AWS가 사전에 정의한 특정 지리적 권역(미국, EU, APAC, JP, AU 등) 내에서 가장 최적의 리전으로 요청을 자동 라우팅합니다.
- 데이터 레지던시: 지정된 지리적 경계(예: 모든 EU 리전) 안에서만 데이터가 이동할 수 있으며, 권역 외부로는 나가지 않습니다.
- 처리량: 단일 리전 내의 급증하는 트래픽을 주변 리전으로 분산 흡수하므로 리전 내 옵션보다 처리량이 높습니다.
- 요금: 요청을 보낸 소스 리전의 요금으로 책정되며, 리전 간 라우팅에 따른 추가 요금은 없습니다.
- modelId 형식: 지역 접두사 + 모델 ID 형태를 사용합니다. (예: us.anthropic.claude-3-5-sonnet-20241022-v2:0)
즉, 데이터가 전 세계로 퍼지는 것이 아니라 아시아 태평양(APAC), 유럽(EU), 미국(US)과 같이 AWS가 지정한 특정 지리적 권역(대륙) 내의 리전들 사이에서만 라우팅 되어 처리됩니다.
만약 서울 리전에서 교차 리전 모델을 사용하면 아시아 태평양 밖으로는 데이터가 나가지 않지만 아시아 태평양 내에서는 데이터가 라우팅 됩니다.
그렇다고 아시아 태평양 내에서 누구나 볼 수 있는 형태로 데이터가 돌아다닌 다는 의미는 절대 아닙니다.
AWS 전용 백본 네트워크 통해 데이터가 암호화되어 전송됩니다.
3. 글로벌 교차 리전 (Global Cross-Region)
- 작동 방식: 최적의 성능을 발휘할 수 있도록 지리적 제한 없이 전 세계 모든 상용 리전으로 요청을 자동 라우팅 합니다.
- 데이터 레지던시: 지리적 제한이 없으며, 모든 상용 리전에서 데이터를 처리할 수 있습니다.
- 처리량: 전 세계의 모든 가용 용량을 활용하므로 처리량이 가장 높습니다.
- 요금: 소스 리전 요금으로 책정되며, 리전 간 라우팅에 대한 추가 요금은 발생하지 않습니다.
- modelId 형식: 글로벌 접두사 + 모델 ID 형태를 사용합니다. (예: global.anthropic.claude-3-5-sonnet-20241022-v2:0)
Bedrock은 가장 높은 처리량과 가장 저렴한 비용으로 전 세계 모든 상용 리전을 라우팅합니다. 데이터 레지던시 제약 조건이 없고 최상의 성능과 가격을 원하는 경우 이 옵션을 사용합니다.
# 호출 테스트
이제 실제로 호출 테스트를 해보겠습니다.
호출 방식에는 여러 가지가 있지만 저는 간단하게 API 키를 이용한 curl 명령어를 이용하여 테스트해보겠습니다.
참고로 저는 서울 리전입니다.

먼저 Bedrock에 들어온 뒤 "API 키"를 클릭합니다.

"단기 API 키 생성"을 클릭합니다.

바로 키가 생성되는데요.
"API 키 복사"를 클릭 후 따로 메모장에 저장해 둡니다.
이제 API 키 까지 준비가 되었으니 마지막으로 url이 필요합니다.
하지만 안타깝게도 AWS Bedrock은 친절하게 쓰고 싶은 모델의 url을 따로 표기해 두고 있지 않아 저희가 직접 만들(?)어야 합니다.
(사실 제가 못 찾을 것일 수도 있습니다. ㅎㅎ...;;)
예를 들어 이런 식입니다.
{엔드포인트}.{리전}.amazonaws.com/model/{접두사}.{모델 ID}/{API 메서드}
각 {중괄호} 안에 들어갈 내용을 저희가 사용할 모델과 API 메서드 리전에 따라 알아서 넣어야 합니다.
일단 사용할 API 모델부터 정해야 합니다.
저는 "Nova 2 Lite" 모델을 사용할 예정입니다.
(Nova Lite인 이유는 그냥 저렴하고 서울리전에서 사용 가능하기 때문입니다.)
먼저 엔드포인트부터 찾아보겠습니다.
아래 사이트에서 ctrl + f로 찾으시면 됩니다.
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-endpoint-availability.html
모델별 엔드포인트 가용성 - Amazon Bedrock
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com

위 사진에 나오듯이 "Nova 2 Lite"는 bedrock-runtime 만을 지원합니다.
엔드포인트는 찾았습니다.
bedrock-runtime.{리전}.amazonaws.com/model/{접두사}.{모델 ID}/{API 메서드}
다음은 {리전} 입니다.
리전은 자신이 테스트하는 리전으로 선택하면 됩니다.
저는 서울 리전 이기 때문에 ap-northeast-2 입니다.
bedrock-runtime.ap-northeast-2.amazonaws.com/model/{접두사}.{모델 ID}/{API 메서드}
다음은 {접두사} 입니다.
아래 사이트에서 ctrl + f로 찾으시면 됩니다.
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-region-compatibility.html
모델별 리전별 가용성 - Amazon Bedrock
AWS GovCloud(미국)에서 Bedrock 파운데이션 모델에 액세스하려면 GovCloud 계정에 연결된 표준 AWS 계정을 통해 액세스 요청을 시작해야 합니다. 먼저 표준 리전( 또는 )에서 모델의 최종 사용자 라이선
docs.aws.amazon.com

서울 리전의 경우 Global 모델만을 지원합니다.
bedrock-runtime.ap-northeast-2.amazonaws.com/model/global.{모델 ID}/{API 메서드}
다음은 {모델 ID} 입니다.

AWS 콘솔에서 Bedrock에 들어간 뒤 "Nova 2 Lite"를 검색 후 클릭합니다.

중앙에 세부 정보에 "모델 ID"를 복사합니다.
bedrock-runtime.ap-northeast-2.amazonaws.com/model/global.amazon.nova-2-lite-v1:0/{API 메서드}
마지막으로 {API 메서드} 입니다.
아래 사이트에서 ctrl + f로 찾으시면 됩니다.
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-api-compatibility.html
모델별 API 호환성 - Amazon Bedrock
* 스트리밍 지원: 별표(*)로 표시된 모델은 응답을 실시간 스트림으로 반환InvokeModelWithResponseStream하는 도 지원합니다.
docs.aws.amazon.com

Nova 2 Lite는 간접 호출 및 Converse 만 지원하네요.
저는 Converse로 하겠습니다.
(Converse는 앞서 설명했듯이 AWS가 만든 공통 대화 규격입니다.)
bedrock-runtime.ap-northeast-2.amazonaws.com/model/global.amazon.nova-2-lite-v1:0/converse
이제 모두 완성되었습니다.
호출해 보겠습니다.

먼저 앞서 복사한 단기 API 변수 선언 명령어를 Bash 터미널 환경에서 입력합니다.
curl -X POST "https://bedrock-runtime.ap-northeast-2.amazonaws.com/model/global.amazon.nova-2-lite-v1:0/converse" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AWS_BEARER_TOKEN_BEDROCK" \
-d '{
"messages": [
{
"role": "user",
"content": [{"text": "Hello"}]
}
]
}'
완성한 url을 위 코드에 넣고 그대로 호출합니다.

정상적으로 호출되는 것을 확인 가능합니다.
*참고 문서
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-region-compatibility.html
모델별 리전별 가용성 - Amazon Bedrock
AWS GovCloud(미국)에서 Bedrock 파운데이션 모델에 액세스하려면 GovCloud 계정에 연결된 표준 AWS 계정을 통해 액세스 요청을 시작해야 합니다. 먼저 표준 리전( 또는 )에서 모델의 최종 사용자 라이선
docs.aws.amazon.com
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-endpoint-availability.html
모델별 엔드포인트 가용성 - Amazon Bedrock
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
https://docs.aws.amazon.com/ko_kr/bedrock/latest/userguide/models-api-compatibility.html
모델별 API 호환성 - Amazon Bedrock
* 스트리밍 지원: 별표(*)로 표시된 모델은 응답을 실시간 스트림으로 반환InvokeModelWithResponseStream하는 도 지원합니다.
docs.aws.amazon.com
* 다음 포스팅 예고

감사합니다.