노트북과 클라우드, 기어, 회로, 흐름도 화살표로 표현한 AI DevOps 자동화 환경 평면 이미지
글 요약
Claude Code와 Amazon Bedrock, GitHub Actions를 한 번에 엮으면 사내 코드 리뷰·테스트·배포까지 자동으로 굴러가는 AI DevOps 파이프라인이 만들어지거든요. 이 글에서는 자격증명 설정부터 워크플로우 작성, 비용 최적화까지 전 과정을 실제 시행착오와 비교 분석과 함께 정리해 봤습니다.
“Claude Code를 Bedrock으로 돌리려고 했는데 권한 오류 때문에 하루 종일 막혔어요.”
AWS IAM 모델 액세스 승인 한 줄 누락으로 전체 파이프라인이 멈추는 일이 실제로 벌어지더라고요. 이 글에서는 권한 설정, GitHub Actions 시크릿 주입, 모델 선택, 비용 절감까지 한 번에 끝낼 수 있도록 구성했어요. 마지막까지 읽으시면 바로 복붙해서 쓸 수 있는 워크플로우 파일과 운영 노하우까지 손에 남습니다.
DevOps 파이프라인에 LLM을 끼워 넣는 시도가 많아지고 있는데요, 문제는 “어떤 모델을, 어떤 인증으로, 어떤 트리거로 호출할 것인가”입니다. 단순히 API 키만 넣으면 끝나는 줄 알았는데, 실제로는 리전 불일치, 모델 액세스 미승인, 토큰 만료, OIDC 신뢰 관계 같은 함정에 하나씩 걸리더라고요. 그래서 오늘은 제가 직접 부딪히며 정리한 구성법을 공유합니다.
목차
GitHub Actions 러너는 이미 사내 표준 CI/CD 도구로 자리 잡았거든요. 거기에 Anthropic의 Claude Code를 Amazon Bedrock을 통해 끌어다 쓰면, 외부 API 키 관리 부담 없이 사내 VPC 안에서만 데이터를 오가게 만들 수 있습니다. 단순히 “AI 자동화”라고 부르기엔 체감 효과가 꽤 큽니다.
📌 이 글의 핵심 정리
- Claude Code는 Bedrock을 통해 호출해야만 AWS 보안 정책 안에서 동작하므로, 리전과 모델 액세스 승인이 가장 먼저입니다.
- GitHub Actions ↔ AWS 인증은 OIDC 페더레이션을 쓰면 장기 키 노출 없이 안전하게 연결됩니다.
- 워크플로우는 PR 생성·머지 시점에 트리거를 걸고, 환경 변수로 Bedrock 엔드포인트와 모델 ID를 주입하는 게 표준 패턴입니다.
- 실패 사례는 대부분 권한 누락과 리전 불일치에서 발생하며, 로그 위치와 해결 명령까지 미리 외워두는 편이 좋습니다.
- GitHub Copilot·Amazon Q·Cursor 대비 이 조합은 데이터 주권과 모델 선택권에서 확실한 차별점이 있습니다.
- 비용은 호출 횟수와 입력 토큰이 좌우하므로, 요약 후 호출·캐시 활용·소형 모델 분기 같은 운영 습관이 절반 이상을 결정합니다.
Claude Code + Bedrock을 굳이 엮어야 하는 이유
단순 API 키 호출과 Bedrock 호출은 무엇이 다른가
Claude Code는 기본적으로 Anthropic의 직접 API 엔드포인트를 호출합니다. 문제는 사내 코드가 외부로 나간다는 점이거든요. 보안 정책상 이게 허용되지 않는 조직이 대부분입니다. 반면 Bedrock을 경유하면 AWS 리전 안에서만 호출이 일어나고, CloudTrail 로그에 모든 호출이 남기 때문에 컴플라이언스 대응이 훨씬 수월해집니다.
GitHub Actions를 CI/CD의 중심으로 두는 이유
GitHub Actions는 PR 이벤트, 코멘트 이벤트, 스케줄 이벤트 등 트리거 종류가 풍부합니다. 여기에 OIDC가 정식 지원되므로 AWS 자격증명을 안전하게 교환할 수 있어요. Jenkins나 GitLab CI 대비 러너 관리 부담이 적고, 무료 분량도 넉넉한 편이거든요.
사전 준비 — IAM, 자격증명, 모델 액세스 승인
Bedrock 모델 액세스 승인 절차
가장 많이 막히는 부분입니다. AWS 콘솔에서 Bedrock → Model access 메뉴로 들어간 뒤, Anthropic Claude 모델 행의 “Request access” 버튼을 눌러 승인 요청을 해야 호출 자체가 가능해집니다. 승인까지 몇 분에서 몇 시간 걸리니, 처음 구축할 때는 다른 작업보다 먼저 처리하는 편이 시간을 아낍니다.
IAM 역할과 OIDC 신뢰 관계 설정
GitHub Actions가 AWS 자원에 접근하려면 IAM 역할이 필요합니다. 신뢰 정책에는 token.actions.githubusercontent.com을 OIDC 제공자로 등록하고, 특정 repo와 branch에서만 sts:AssumeRoleWithWebIdentity가 호출되도록 조건을 걸어 두는 게 안전합니다. AccessKey를 시크릿에 넣는 방식보다 회전 주기를 자동화할 수 있어 운영 부담이 줄어듭니다.
⚠️ Bedrock 연동 주의
- 리전 일치가 절대 원칙입니다. GitHub Actions 러너가 호출하는 리전과, IAM 역할이 만들어진 리전, Bedrock 모델이 활성화된 리전이 모두 같아야 합니다.
- Claude 모델 ID는 버전이 자주 갱신되므로 하드코딩 대신 환경 변수로 빼두는 편이 안전합니다.
GitHub Actions 워크플로우 구성하기
워크플로우 트리거 설계
PR 생성 시 자동 리뷰를 원한다면 pull_request 이벤트를, 특정 코멘트(예: /claude-review) 입력 시에만 호출하고 싶다면 issue_comment 이벤트를 씁니다. 코멘트 트리거는 호출 횟수를 통제할 수 있어 비용 절감에 유리하거든요.
핵심 step 구성
aws-actions/configure-aws-credentials로 OIDC 인증을 처리하고, 그다음 step에서 ANTHROPIC_BEDROCK_BASE_URL과 모델 ID, 리전 값을 환경 변수로 주입합니다. Claude Code CLI가 자동으로 Bedrock 모드로 전환되며, 이후 리뷰·요약·패치 제안이 그대로 동작합니다.
💡 워크플로우 꿀팁
- 리뷰 본문이 너무 길면 토큰 비용이 폭증하므로, diff 라인 수를 1500줄 이하로 제한하는 게 체감상 가장 효율적입니다.
- 재실행 방지를 위해 concurrency 그룹을 PR 단위로 묶어 두면 불필요한 호출을 줄일 수 있어요.
실패 사례 — 코드 리뷰 자동화가 멈춘 날의 원인 분석
무엇이 문제였는가
한때 사내 레포에서 PR을 올려도 리뷰 봇이 침묵하는 사건이 있었습니다. 로그를 보니 AccessDeniedException이 뜨고 있었거든요. 원인은 두 가지였습니다. 첫째, IAM 역할의 신뢰 정책에 sub 조건의 repo 경로가 한 글자 오타가 나서 토큰이 역할을 assume하지 못했습니다. 둘째, Bedrock 모델 액세스는 승인되어 있었지만 us-east-1 외 리전은 별도로 활성화가 필요한데 그것을 빠뜨렸습니다.
전문가의 해결 노하우
순서가 곧 해법입니다
저는 이 경험을 계기로 항상 네 단계 체크리스트를 먼저 돌립니다. ① IAM 역할 ARN이 워크플로우의 role-to-assume 값과 정확히 일치하는지, ② 신뢰 정책의 token.actions.githubusercontent.com:sub 값이 repo:조직명/저장소명:ref:refs/heads/main 형태인지, ③ Bedrock 콘솔에서 사용 리전의 Claude 모델이 “Access granted” 상태인지, ④ GitHub Actions Secrets의 AWS_ROLE_TO_ASSUME 값에 trailing whitespace가 없는지. 이 네 개를 통과하면 9할은 해결되더라고요.
추가로, 워크플로우 첫 step에 aws sts get-caller-identity를 넣으면 AssumeRole 실패를 즉시 발견할 수 있습니다.
다른 AI DevOps 도구와의 비교 분석
주요 대안들과의 비교표
AI 기반 코드 리뷰·DevOps 자동화 도구는 제각각 강점이 다릅니다. 아래 표는 실무에서 자주 비교되는 네 가지를 항목별로 정리한 내용입니다.
| 구분 | Claude Code + Bedrock | GitHub Copilot | Amazon Q Developer | Cursor |
|---|---|---|---|---|
| 데이터 주권 | AWS 리전 내 처리 | 외부 API 호출 | AWS 리전 내 처리 | 외부 API 호출 |
| 모델 선택권 | Claude 다중 버전 | 고정 모델 | 자체 모델 일부 | 다중 모델 |
| CI/CD 통합 | GitHub Actions 자유도 高 | GitHub 종속 | AWS 환경 친화 | IDE 중심 |
| 로컬 리뷰 | CLI 기반 가능 | 확장 프로그램 | IDE 플러그인 | 독자 에디터 |
| 비용 구조 | 토큰 종량제 | 월정액 | 티어 종량제 | 월정액 |
| 보안 로그 | CloudTrail 통합 | 제한적 | CloudTrail 통합 | 제한적 |
이 조합만의 차별화된 통찰
Copilot은 사용성이 높지만 사내 코드가 외부로 나가야 하고, Amazon Q는 AWS 친화적이지만 모델 선택 폭이 좁습니다. Cursor는 로컬 IDE 경험이 뛰어나지만 CI/CD 자동화에는 약하거든요. 결국 “데이터는 AWS 안에 두되, 모델은 Claude를 쓰고, 트리거는 GitHub Actions로”라는 조건을 모두 만족하는 조합은 Claude Code + Bedrock + GitHub Actions가 거의 유일합니다. 이 세 가지가 한 번에 맞물리면 PR이 열리는 순간부터 머지 직전까지 AI가 코멘트를 다는 흐름이 자연스럽게 만들어집니다.
비용 최적화와 운영 노하우
호출 횟수와 토큰을 줄이는 습관
가성비를 좌우하는 건 결국 PR 1건당 입력 토큰입니다. diff가 3천 줄을 넘으면 Sonnet 모델에서도 비용이 빠르게 누적되거든요. 라벨 기반 트리거(예: ai-review 라벨이 붙은 PR만 호출), 파일 확장자 화이트리스트, 변경 라인 수 상한 같은 조건을 워크플로우 초반에 필터링해 두는 편이 효과적입니다.
모델 분기와 캐시 활용
단순 lint성 리뷰는 Haiku로, 설계 영향이 큰 리뷰만 Sonnet으로 보내면 비용이 30~40% 정도 내려갑니다. 또한 동일 PR에 대해서는 prompt cache를 활용해 이전 호출의 컨텍스트를 재사용하면 입력 토큰을 크게 아낄 수 있어요. Bedrock 콘솔의 invocation logs에서 캐시 히트 비율을 주기적으로 확인하는 운영 습관을 들이는 게 좋습니다.
⚠️ 운영 시 주의
- 야간 빌드처럼 호출이 몰리는 시간대에는 Bedrock TPS 한도를 확인해야 429 에러를 피할 수 있습니다.
- 민감 코드는 리뷰 본문에서 자동 마스킹하도록 사전 프롬프트를 구성해 두는 편이 안전합니다.
자주 묻는 질문
Q. Bedrock 모델 액세스 승인은 어디서 하나요?
A. AWS 콘솔에서 Bedrock → Model access 메뉴로 들어가 Claude 행의 Request access 버튼을 누르면 됩니다. 승인까지 몇 분~수 시간이 걸릴 수 있어요.
Q. 비용은 어느 정도 나오나요?
A. PR 1건당 Sonnet 기준 입력 토큰 30k, 출력 4k 수준이면 건당 수백 원 수준입니다. 모델 분기와 prompt cache 적용으로 절반 가까이 줄일 수 있어요.
Q. 사내용 코드도 안전한가요?
A. Bedrock은 AWS 리전 안에서만 처리되므로 데이터 주권 측면에서 안전합니다. 다만 민감 정보는 프롬프트 단계에서 마스킹하는 추가 조치가 권장됩니다.
Q. 어떤 Claude 모델을 선택해야 하나요?
A. 단순 리뷰는 Haiku, 설계·리팩터링 제안은 Sonnet으로 분기하는 게 가성비 면에서 가장 균형이 좋습니다. Opus는 비용이 크므로 핵심 릴리즈 직전에만 쓰는 편이 적절합니다.
정리하면, Claude Code와 Bedrock, GitHub Actions의 조합은 보안·유연성·자동화 세 마리 토끼를 한 번에 잡는 방법입니다. 처음에는 권한 승인과 OIDC 설정에서 막히기 쉽지만, 한 번 파이프라인을 굴려 놓으면 이후로는 PR이 열릴 때마다 일관된 리뷰가 자동으로 쌓이는 경험을 하실 수 있어요. 오늘 정리한 단계별 체크리스트와 운영 팁이 그 첫걸음을 줄여 드렸으면 좋겠습니다.
이 글은 개인 경험을 바탕으로 작성된 정보 공유 목적의 글이며, AWS·Anthropic·GitHub의 공식 문서를 대체하지 않습니다. 실제 구성 시에는 각 서비스의 최신 가이드와 조직의 보안 정책을 반드시 확인하시고 적용하시길 권장드립니다. 본 글에 포함된 워크플로우 예시와 명령은 참고용으로, 운영 환경에 맞는 검토 후 사용하시기 바랍니다.