Lambda + API Gateway로 Bedrock 호출해 보기

Lambda + API Gateway로 Bedrock 호출해 보기

Lambda + API Gateway로 Bedrock을 호출해 봤습니다.
2026.03.23

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번 블로그에서는 Lambda + API Gateway로 Bedrock을 호출해 봤습니다.

IAM Role 생성

먼저 Lambda에서 Bedrock을 호출하기 위한 권한이 필요하기 때문에 IAM Role을 생성합니다. IAM Role에 할당된 권한은 아래와 같습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel",
                "bedrock:InvokeModelWithResponseStream"
            ],
            "Resource": "*"
        }
    ]
}

Lambda 함수 생성

IAM Role을 생성했다면 Lambda 함수를 생성합니다.

  • 함수 이름 : lambda-bedrock
  • 런타임 : Python 3.14
  • 아키텍처 : x86_64
  • IAM Role : lambda-bedrock-role

Lambda 함수에 적용할 Python 코드는 다음과 같습니다.

import json
import boto3

def lambda_handler(event, context):

    # Bedrock 클라이언트 생성 (도쿄 리전)
    bedrock = boto3.client(
        service_name='bedrock-runtime',
        region_name='ap-northeast-1'
    )

    # 사용자 입력 받기
    user_message = event.get('message', '안녕하세요!')

    # 요청 Body 구성
    request_body = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1024,
        "system": "당신은 한국어로만 답변하는 AI 어시스턴트입니다. 항상 한국어로 답변하세요.",
        "messages": [
            {
                "role": "user",
                "content": user_message
            }
        ]
    }

    # Bedrock 호출
    response = bedrock.invoke_model(
        modelId='jp.anthropic.claude-sonnet-4-6',
        body=json.dumps(request_body)
    )

    # 응답 파싱
    response_body = json.loads(response['body'].read())
    result = response_body['content'][0]['text']

    return {
        'statusCode': 200,
        'body': json.dumps({
            'response': result
        }, ensure_ascii=False)
    }

마지막으로 Lambda 함수의 구성에서 제한 시간을 늘려줍니다.

기본 설정 값은 3초이지만, 3초로는 부족할 수 있기 때문에 넉넉하게 잡아줍시다.

test-2

API Gateway 생성

API Gateway 생성은 다음과 같습니다.

  • API 유형 : REST API
  • API 이름 : bedrock-api
  • API 엔드포인트 유형 : 지역

API Gateway를 생성했다면, API 배포에서 메서드 유형은 POST로 지정하고 조금 전 생성한 Lambda 함수를 선택하면 됩니다.

Lambda 함수에서 API Gateway가 추가된 것을 확인했다면 그걸로 OK입니다.

test-1

Lambda 함수 실행

Lambda 함수를 실행시켰을 때 다음과 같은 결과가 출력된다면 성공입니다.

Response:
{
  "statusCode": 200,
  "body": "{\"response\": \"안녕하세요! 😊 반갑습니다! 무엇을 도와드릴까요?\"}"
}

API Gateway 호출

Lambda 함수가 문제 없는 것을 확인했으므로 API를 호출해 봅시다.

Lambda 함수와 동일하게 출력되면 성공입니다.

curl -X POST https://API Gateway의 엔드포인트 \
  -H "Content-Type: application/json" \
  -d '{"message": "안녕하세요!"}'

{"statusCode": 200, "body": "{\"response\": \"안녕하세요! 😊 반갑습니다! 무엇을 도와드릴까요?\"}"}

주의점

Inference Profile 문제

모델 호출 시 Inference Profile 사용이 필수입니다.

처음에 아래와 같이 모델 ID를 직접 사용하면 오류가 발생합니다.

response = bedrock.invoke_model(
    modelId='anthropic.claude-sonnet-4-20250514-v1:0',
    body=json.dumps(request_body)
)

에러 발생
ValidationException: Invocation of model ID anthropic.claude-sonnet-4-20250514-v1:0 
with on-demand throughput isn't supported. 
Retry your request with the ID or ARN of an inference profile that contains this model.

AWS 정책 변경으로 인해 on-demand 방식으로 직접 모델 호출이 불가능합니다.
반드시 Inference Profile ID 를 사용해야 합니다.

아래 CLI 명령어로 사용 가능한 Inference Profile 목록을 확인합니다.

aws bedrock list-inference-profiles \
  --region ap-northeast-1 \
  --query 'inferenceProfileSummaries[*].[inferenceProfileId, inferenceProfileArn]' \
  --output table
결과 예시

| apac.anthropic.claude-3-sonnet-20240229-v1:0   |
| apac.anthropic.claude-3-5-sonnet-20240620-v1:0 |
| apac.anthropic.claude-3-7-sonnet-20250219-v1:0 |
| jp.anthropic.claude-sonnet-4-6                 |
| global.anthropic.claude-sonnet-4-6             |

도쿄 리전에서는 apac. / jp. / global. prefix를 사용합니다.

ap. prefix 문제

# 잘못된 방법 (ap. 는 존재하지 않음)
modelId='ap.anthropic.claude-3-5-sonnet-20241022-v2:0'

결과
ValidationException: The provided model identifier is invalid.

올바른 방법은 다음과 같습니다.

# 올바른 방법 (apac. / jp. / global. 사용)
modelId='jp.anthropic.claude-sonnet-4-6'

그 외에도 IAM 권한 문제나 타임아웃 문제가 발생할 수 있으니 주의가 필요합니다.

오류 원인 해결방법
on-demand throughput isn't supported 모델 ID 직접 사용 Inference Profile ID 사용
The provided model identifier is invalid ap. prefix 사용 apac. / jp. / global. 사용
AccessDeniedException IAM 권한 없음 bedrock:InvokeModel 권한 추가
Task timed out 타임아웃 3초 타임아웃 3초 이상으초로 변경

마무리

이번 블로그에서는 Lambda와 API Gateway를 이용하여 Amazon Bedrock을 호출하는 간단한 API를 구성해 보았습니다.
구성 자체는 비교적 단순하지만, 실제로 구현해보면 Inference Profile이나 권한 설정, 타임아웃과 같은 부분에서 예상치 못한 오류를 만날 수 있습니다.

특히 최근 정책 변경으로 인해 모델 ID를 직접 호출하는 방식이 아닌 Inference Profile을 사용해야 한다는 점은 반드시 알고 넘어가야 하는 중요한 포인트입니다.

이번 예제는 단순히 문자열을 입력받아 응답을 반환하는 구조이지만, 이를 확장하면 다음과 같은 형태로도 활용할 수 있습니다.

  • 간단한 챗봇 API 구성
  • 사내 업무 자동화 (요약, 번역 등)
  • 프론트엔드와 연동한 AI 서비스 백엔드

앞으로는 스트리밍 응답(InvokeModelWithResponseStream)을 활용하거나, API Gateway 대신 ALB / Lambda Function URL을 사용하는 방식도 비교해보면 좋을 것 같습니다.

간단한 구조부터 시작해서 점점 확장해 나가면 Bedrock을 활용한 다양한 아키텍처를 구성할 수 있으니, 직접 여러 케이스를 실험해 보시는 것을 추천드립니다.

この記事をシェアする

FacebookHatena blogX

関連記事