AWS Bedrock으로 AI 모델 사용하기
요즘 AI 기능을 서비스에 통합하려는 기업이 정말 많죠. 그런데 OpenAI나 Anthropic 같은 AI 제공업체의 API를 직접 쓰려면 각 업체마다 별도로 계정을 만들고 API 키를 관리해야 하고 비용 청구도 따로 받게 됩니다. 이미 AWS 인프라를 쓰고 있는 조직이라면 이게 꽤 번거로운 일이에요.
AWS Bedrock은 이런 고민을 해결해주는 서비스입니다. 여러 AI 회사의 파운데이션 모델(Foundation Model)을 AWS 환경 안에서 통합된 API로 호출할 수 있게 해주거든요. 기존에 사용하던 IAM 권한 체계와 AWS 빌링이 그대로 적용되니까 별도의 인프라를 구축하지 않아도 바로 AI를 쓸 수 있습니다.
이번 글에서는 Bedrock이 뭔지 간단히 짚어보고, AWS CLI와 Python SDK로 직접 모델을 호출해보겠습니다.
Bedrock이란?
Amazon Bedrock은 여러 AI 회사의 파운데이션 모델을 하나의 관리형 서비스로 묶어서 제공하는 AWS의 서버리스 AI 플랫폼입니다. 직접 GPU 서버를 프로비전하거나 모델을 배포할 필요 없이 API 한 번 호출로 텍스트 생성, 이미지 생성, 임베딩 같은 AI 기능을 사용할 수 있어요.
직접 AI API를 쓸 때와 비교해서 어떤 차이가 있을까요?
OpenAI API를 직접 호출하면 OpenAI 계정으로 API 키를 발급받고, 발급받은 키를 애플리케이션에 하드코딩하거나 환경 변수로 관리해야 합니다. Bedrock을 쓰면 AWS IAM 역할과 정책으로 접근을 제어하기 때문에 API 키를 별도로 관리할 필요가 없어요. EC2 인스턴스나 Lambda 함수에 IAM 역할을 부여하면 자격 증명이 자동으로 순환되니까 보안 측면에서도 유리합니다.
비용도 AWS 통합 청구서에 포함되어 나오고, CloudWatch로 사용량을 모니터링할 수 있으니 기존 AWS 운영 방식을 그대로 이어갈 수 있는 거죠.
사용 가능한 모델
Bedrock에서 지원하는 모델은 꾸준히 늘어나고 있는데 대표적인 것들을 훑어볼게요.
Anthropic의 Claude 시리즈는 Bedrock에서 가장 인기 있는 모델 중 하나입니다.
Claude 4 Sonnet(us.anthropic.claude-sonnet-4-20250514-v1:0)은 코딩과 복잡한 추론에 강하고, Claude 3.5 Haiku(us.anthropic.claude-3-5-haiku-20241022-v1:0)는 빠른 응답이 필요할 때 적합해요.
Meta의 Llama 시리즈도 사용할 수 있습니다.
Llama 4 Scout(us.meta.llama4-scout-17b-instruct-v1:0)은 가벼운 작업에, Llama 4 Maverick(us.meta.llama4-maverick-17b-instruct-v1:0)은 좀 더 복잡한 작업에 쓸 수 있어요.
Amazon에서 직접 만든 Nova 모델도 있습니다.
Nova Micro(us.amazon.nova-micro-v1:0)는 텍스트 전용으로 가장 저렴하고, Nova Lite(us.amazon.nova-lite-v1:0)는 이미지와 비디오 입력까지 처리합니다.
Nova Pro(us.amazon.nova-pro-v1:0)는 정확도와 속도의 균형이 좋아서 범용적으로 쓰기 좋습니다.
이미지를 만들고 싶다면 Amazon Nova Canvas(amazon.nova-canvas-v1:0)나 Stability AI의 Stable Diffusion을 쓸 수 있어요.
임베딩 쪽에서는 Amazon Titan Embeddings와 Cohere Embed 모델을 제공합니다.
사용 가능한 모델은 리전마다 다르기 때문에 본인이 쓰는 리전에서 어떤 모델을 지원하는지 확인해볼 필요가 있어요.
모델 접근 권한 설정
Bedrock의 모델을 사용하려면 먼저 AWS 콘솔에서 해당 모델에 대한 접근 권한을 요청해야 합니다. 기본적으로 모든 모델이 비활성화되어 있거든요.
AWS 콘솔에서 Amazon Bedrock 서비스로 이동한 다음 왼쪽 메뉴에서 “Model access”를 클릭합니다. “Modify model access” 버튼을 누르면 사용 가능한 모델 목록이 나오는데, 여기서 원하는 모델을 선택하고 접근을 요청하면 돼요.
Amazon 자체 모델(Nova, Titan)은 보통 즉시 승인되고, 서드파티 모델(Claude, Llama 등)은 간단한 사용 목적을 기재하면 대부분 몇 분 안에 승인됩니다.
IAM 정책에서는 bedrock:InvokeModel 액션에 대한 권한이 필요합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:*::foundation-model/*"
}
]
}
모든 모델에 접근할 수 있도록 와일드카드(*)를 사용했지만 프로덕션 환경에서는 특정 모델 ARN만 허용하는 게 좋겠죠.
AWS CLI로 모델 호출하기
AWS CLI 설정이 되어 있다면 터미널에서 바로 Bedrock 모델을 호출해볼 수 있습니다.
먼저 사용 가능한 모델 목록을 확인해볼게요.
$ aws bedrock list-foundation-models \
--query "modelSummaries[?providerName=='Anthropic'].[modelId,modelName]" \
--output table
Claude 모델을 호출하려면 bedrock-runtime 서비스의 converse 명령어를 사용합니다.
$ aws bedrock-runtime converse \
--model-id us.anthropic.claude-sonnet-4-20250514-v1:0 \
--messages '[{
"role": "user",
"content": [{"text": "AWS Bedrock을 한 문장으로 설명해줘"}]
}]'
응답은 JSON 형태로 돌아옵니다.
{
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "AWS Bedrock은 다양한 AI 회사의 파운데이션 모델을 서버리스 API로 제공하는 관리형 서비스로, 별도의 인프라 관리 없이 텍스트 생성, 이미지 생성, 임베딩 등의 AI 기능을 AWS 환경에서 바로 활용할 수 있게 해줍니다."
}
]
}
},
"stopReason": "end_turn",
"usage": {
"inputTokens": 21,
"outputTokens": 84,
"totalTokens": 105
}
}
usage 필드에서 입력과 출력 토큰 수를 확인할 수 있어서 비용을 가늠하기 편합니다.
스트리밍 응답을 받고 싶다면 converse-stream 명령어를 쓰면 됩니다.
$ aws bedrock-runtime converse-stream \
--model-id us.anthropic.claude-sonnet-4-20250514-v1:0 \
--messages '[{
"role": "user",
"content": [{"text": "서버리스 컴퓨팅의 장단점을 간략히 알려줘"}]
}]'
실시간으로 텍스트가 조각조각 들어오기 때문에 채팅 인터페이스처럼 점진적으로 응답을 보여주는 애플리케이션에 적합합니다.
Python SDK로 모델 호출하기
실제 애플리케이션에서는 AWS SDK를 통해 Bedrock을 호출하는 경우가 더 많을 겁니다.
Python의 boto3 라이브러리를 사용해서 모델을 호출해보겠습니다.
먼저 boto3를 설치합니다.
$ pip install boto3
Converse API를 사용하면 모델 종류에 관계없이 동일한 인터페이스로 호출할 수 있어요.
import boto3
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "Python으로 피보나치 수열을 생성하는 함수를 작성해줘"}],
}
],
inferenceConfig={
"maxTokens": 1024,
"temperature": 0.7,
},
)
text = response["output"]["message"]["content"][0]["text"]
print(text)
inferenceConfig로 생성 옵션을 조정할 수 있는데, temperature는 0에 가까울수록 결정적인 응답이 나오고 1에 가까울수록 창의적인 응답이 나옵니다.
maxTokens는 생성할 최대 토큰 수를 제한합니다.
스트리밍 응답을 받으려면 converse_stream 메서드를 쓰면 됩니다.
import boto3
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.converse_stream(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "마이크로서비스 아키텍처의 장점을 설명해줘"}],
}
],
)
for event in response["stream"]:
if "contentBlockDelta" in event:
print(event["contentBlockDelta"]["delta"]["text"], end="")
print()
스트리밍을 사용하면 전체 응답이 완성될 때까지 기다리지 않아도 되니까 사용자 경험이 크게 좋아집니다.
시스템 프롬프트와 대화 이력
챗봇처럼 맥락을 유지하는 대화를 만들려면 시스템 프롬프트와 대화 이력을 함께 전달하면 됩니다.
import boto3
client = boto3.client("bedrock-runtime", region_name="us-east-1")
system = [{"text": "당신은 AWS 클라우드 전문가입니다. 기술 질문에 한국어로 답변합니다."}]
messages = []
def chat(user_message):
messages.append(
{"role": "user", "content": [{"text": user_message}]}
)
response = client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
system=system,
messages=messages,
inferenceConfig={"maxTokens": 1024},
)
assistant_message = response["output"]["message"]
messages.append(assistant_message)
return assistant_message["content"][0]["text"]
print(chat("S3와 EBS의 차이가 뭐야?"))
print(chat("방금 설명한 것 중 S3에 대해 더 자세히 알려줘"))
messages 리스트에 대화 기록을 쌓아가면서 매번 전체 이력을 전달하는 방식입니다.
Bedrock 자체는 상태를 유지하지 않기 때문에 대화 맥락은 클라이언트 쪽에서 관리해야 해요.
모델 갈아끼기
Converse API의 큰 장점은 modelId만 바꾸면 다른 모델로 쉽게 전환할 수 있다는 점입니다.
코드의 나머지 부분은 수정할 필요가 없어요.
# Claude Sonnet으로 호출
response = client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=messages,
)
# Llama로 전환
response = client.converse(
modelId="us.meta.llama4-scout-17b-instruct-v1:0",
messages=messages,
)
# Amazon Nova로 전환
response = client.converse(
modelId="us.amazon.nova-pro-v1:0",
messages=messages,
)
각 모델의 강점이 다르기 때문에 용도에 따라 모델을 바꿔가며 테스트해보는 게 좋습니다. 비용이 민감한 작업에는 Nova Micro나 Haiku 같은 가벼운 모델을 쓰고, 높은 품질이 필요한 작업에는 Claude Sonnet이나 Llama Maverick을 쓰는 식으로 나눌 수 있겠죠.
Knowledge Bases
Bedrock Knowledge Bases는 RAG(Retrieval-Augmented Generation) 파이프라인을 구축할 때 유용한 기능입니다. S3에 올려둔 문서를 자동으로 임베딩해서 벡터 데이터베이스에 저장하고, 사용자 질문에 관련 문서를 검색해서 모델에 전달해주거든요.
회사 내부 문서, 기술 매뉴얼, FAQ 같은 자료를 기반으로 질의응답 시스템을 만들 때 직접 임베딩 파이프라인을 구축하지 않아도 됩니다. 데이터 소스로 S3 버킷을 연결하면 Bedrock이 문서를 청크로 나누고 임베딩을 생성한 뒤, OpenSearch Serverless나 Pinecone 같은 벡터 저장소에 자동으로 인덱싱합니다.
client = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
response = client.retrieve_and_generate(
input={"text": "반품 정책이 어떻게 되나요?"},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": "XXXXXXXXXX",
"modelArn": "arn:aws:bedrock:us-east-1::foundation-model/us.anthropic.claude-sonnet-4-20250514-v1:0",
},
},
)
print(response["output"]["text"])
모델이 답변할 때 어떤 문서를 참고했는지 출처 정보도 함께 반환되기 때문에 답변의 신뢰성을 검증하기도 편합니다.
Guardrails
프로덕션 환경에서 AI 모델을 쓸 때 가장 걱정되는 게 모델이 부적절한 내용을 생성하거나 민감한 정보를 노출하는 거잖아요. Bedrock Guardrails는 이런 위험을 줄여주는 안전장치입니다.
콘텐츠 필터링으로 혐오 표현이나 폭력 묘사 같은 유해 콘텐츠를 차단할 수 있어요. 주민등록번호, 전화번호, 이메일 같은 개인 식별 정보(PII)를 자동으로 마스킹하는 기능도 있습니다. 특정 주제에 대한 응답을 아예 거부하도록 설정할 수도 있어서 예를 들어 고객 지원 챗봇에서 경쟁사 제품 추천이나 법률 조언 같은 범위 밖 질문을 차단하는 데 쓸 수 있습니다.
Guardrail을 생성한 후에는 Converse API 호출 시 guardrailConfig 파라미터로 적용합니다.
response = client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "내 주민번호는 901231-1234567인데 이걸 기반으로 뭘 알 수 있어?"}],
}
],
guardrailConfig={
"guardrailIdentifier": "my-guardrail-id",
"guardrailVersion": "1",
},
)
비용
Bedrock의 비용은 크게 온디맨드(On-Demand)와 프로비전드 처리량(Provisioned Throughput) 두 가지 방식이 있습니다.
온디맨드는 사용한 만큼만 내는 방식입니다. 입력 토큰과 출력 토큰에 대해 각각 과금되며, 모델마다 단가가 다릅니다. 예를 들어 Claude Sonnet 4의 경우 입력 1,000 토큰당 $0.003, 출력 1,000 토큰당 $0.015 정도이고 Amazon Nova Micro는 입력 $0.000035, 출력 $0.00014로 훨씬 저렴합니다. 이미지 생성 모델은 생성된 이미지당 과금되는 구조예요.
프로비전드 처리량은 일정한 처리 용량을 예약하는 방식으로 트래픽이 안정적이고 예측 가능할 때 비용을 절감할 수 있습니다. 1개월 또는 6개월 약정으로 계약하면 온디맨드 대비 상당한 할인을 받을 수 있어요.
처음에는 온디맨드로 시작해서 사용 패턴을 파악한 다음에 트래픽이 안정화되면 프로비전드 처리량으로 전환해보세요.
마치며
AWS Bedrock은 이미 AWS 인프라를 사용하고 있는 조직이 AI를 도입할 때 가장 자연스러운 선택지입니다. IAM 기반 접근 제어, CloudWatch 모니터링, 통합 청구서까지 기존 운영 패턴을 그대로 쓸 수 있으니까요.
Converse API 덕분에 모델 전환이 쉬워서 처음에는 저렴한 모델로 시작하고 필요에 따라 더 강력한 모델로 올리는 전략도 부담 없이 시도해볼 수 있습니다. Knowledge Bases와 Guardrails 같은 부가 기능까지 더하면 프로덕션 수준의 AI 애플리케이션도 빠르게 만들 수 있을 거예요. Google Cloud를 쓰고 있다면 비슷한 역할을 하는 Vertex AI도 살펴보세요.
더 자세한 내용은 Amazon Bedrock 공식 문서를 참고하세요.
This work is licensed under
CC BY 4.0