본문 바로가기

AWS bedrock 사용기

@정소민fan2025. 8. 5. 22:05

nestJS에서 aws bedrock을 사용한 깃허브 레포

https://github.com/B1A4-NMM/Remotion-Server

 

GitHub - B1A4-NMM/Remotion-Server

Contribute to B1A4-NMM/Remotion-Server development by creating an account on GitHub.

github.com

 

AWS Bedrock이란 무엇인가

AWS에서 제공하는 AI 서비스이다. 여기에는 Anthropic, meta 등 여러 기업들의 모델들을 제공하는데, 사용자의 입맛대로 골라서 사용할 수 있다.

여러 모델들이 있는데, STT, 이미지 생성, 텍스트 등 원하는 작업에 따라 모델을 선택하면 되겠다.

그러면 aws에 접속해서 Bedrock 페이지를 둘러보자

Bedrock 둘러보기

Bedrock 메뉴의 홈페이지이다. 여기서 좌상단의 Model Catalog로 들어가보자

Model catalog에는 우리가 사용할 수 있는 모델들이 여럿 나온다. 좌측의 Model collection의 Serverless가 AWS가 제공하는 모델들이다. Bedrock Marketplace는 모델들을 만드는 기업들이 등록한 모델 스토어 같은 개념이다. 비용이 훨씬 많이 들어가니까 웬만하면 Serverless 서비스만 사용하자. 

근데 사용할수 있는 서버리스 모델들이 좀 적다. 서울 리전이라서 그런데, 리전을 us-east-1으로 바꾸면...

이렇게 훨씬 많은 서버리스 모델들을 사용할 수 있다... 아무튼 이건 사용자가 필요에 따라 선택해야 하니까 어느 리전의 모델을 사용할지는 자유이다.

Bedrock 사용해보기

Bedrock을 사용하려면 먼저 모델 액세스 권한을 신청해야 한다.

메뉴의 모델 액세스에 들어가보자.

그리고 모델 액세스 권한 수정 버튼을 눌러주자.

모델 액세스 권한 편집에서 사용하고 싶은 모델을 체크하고 다음을 눌러주자. 그러면 액세스 권한이 부여되고, 사용할 수 있게 된다.

access key 만들기

우리는 aws의 서비스를 사용하기 위해 access key를 만들어야 한다. Bedrock에 접근할 수 있는 IAM을 만드는 것이 정석이지만, 과정을 스킵하기 위해 root 계정의 access key를 만들겠다.

우상단의 계정 이름을 누르고 Security credentials (보안 자격 증명) 페이지로 이동하자

해당 페이지에서 액세스 키 만들기 버튼을 눌러 액세스 키와 시크릿 키를 만들어주자.

참고로 이 키는 절대절대절대 외부로 유출되어서는 안된다. root 계정이기에 이 액세스 키로 뭐든 건드리고 만들수 있기 때문에 당신의 카드가 털리는 건 순식간일거다.

환경변수 설정

아무튼 만들어둔 액세스 키와 시크릿 키를 nestjs 프로젝트의 .env 파일에 고이 모셔두자.

나는 이 키들의 이름을 AWS_ACCESS_KEY, AWS_SECRET_ACCESS_KEY로 저장해두었다.

그리고 위에서 액세스 권한을 얻은 모델의 리전 또한 .env 파일에 AWS_REGION으로 박아두자.

nestJS로 사용하기

먼저 필요한 라이브러리를 설치해주자

npm install @aws-sdk/client-bedrock-runtime

그리고 BedrockRuntimeClient를 만들어주자

@Injectable()
export class ClaudeService {
  private readonly client: BedrockRuntimeClient;

  constructor(
    private readonly configService: ConfigService,
    private readonly utilService: CommonUtilService,
  ) {
    // @ts-ignore
    this.client = new BedrockRuntimeClient({
      region: this.configService.get<string>('AWS_REGION'),
      credentials: {
        accessKeyId: this.configService.get<string>('AWS_ACCESS_KEY_ID'),
        secretAccessKey: this.configService.get<string>(
          'AWS_SECRET_ACCESS_KEY',
        ),
      },
    });
    }

ConfigService는 환경변수를 꺼내오기 위한 라이브러리이다.

 

그럼 이제 AWS 측으로 프롬프트와 함께 요청을 보내주기만 하면 된다. 참고로 내가 여기서 사용할 모델은 claude sonnet 4이고, 텍스트만 보낼 것이다. 이미지나 STT같은 부분은 아직 사용해보지 못했다.

 

우선 AWS Bedrock 페이지로 돌아가서 어떻게 요청을 보내면 될까? 각 모델마다 example을 제공하니 모델 카탈로그의 모델 상세 페이지에서 각각 확인해보자. claude 모델의 경우는 https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-runtime_example_bedrock-runtime_InvokeModel_AnthropicClaude_section.html 이 페이지에서 확인할 수 있다.

 

modelId도 필요한데, 이 경우는 모델 상세 페이지에서 각각 확인 가능하고, 편하게 복사해서 쓰라고 복사 버튼도 있으니 꼭 확인하자.

꼭 복사하자

private async getResponseToSonnet4(processedPrompt: string) {
    const command = new InvokeModelCommand({
      modelId: 'apac.anthropic.claude-sonnet-4-20250514-v1:0',
      contentType: 'application/json',
      accept: 'application/json',
      body: JSON.stringify({
        anthropic_version: 'bedrock-2023-05-31',
        messages: [{ role: 'user', content: processedPrompt }],
        max_tokens: 4000,
        temperature : 0.05,
      }),
    });

    const response = await this.client.send(command);
    const body = await response.body.transformToString();
    const parsed = JSON.parse(body);

    let responseText = parsed?.content?.[0]?.text || 'No response';
    return responseText;
  }

하지만 주의할 점이 있다. modelId의 경우에는 항상 apac. 을 붙여야만 제대로 요청이 간다... 이것때문에 다른 레퍼런스 참고하면서 구현하다가 시간을 정말 많이 썼던 기억이 난다.

그리고 답변이 텍스트로만 오는 것도 아니다 !! 여러 중괄호에 감싸져서 응답이 오기 때문에 이를 파싱하는 과정도 필요하다.

 

코드가 좀 복잡한데, LangChain이라는 프레임워크를 같이 사용하면 훨씬 편할수도 있다고 한다. 이 부분도 한번 써보고 다음에 포스팅하도록 하겠다.

'NestJS' 카테고리의 다른 글

RAG 구현기  (4) 2025.08.09
NestJS + Qdrant 사용해보자 !!  (6) 2025.08.08
반환 정보 편집하기  (1) 2025.06.15
입력 정보 검증하기  (0) 2025.06.15
TypeORM 간단 사용법  (0) 2025.06.15
정소민fan
@정소민fan :: 코딩은 관성이야

코딩은 관성적으로 해야합니다 즐거운 코딩 되세요

목차