본문으로 건너뛰기

© 2026 Molayo

Zenn헤드라인2026. 05. 24. 23:09

Gennai Web에 접속하는 생성형 AI 앱(메트릭스 체커)을 만들어 보았다

요약

디지털청의 오픈소스인 Gennai Web과 API를 활용하여 서로 다른 AWS 계정 간에 통신하는 생성형 AI 앱 구현 사례를 다룹니다. 계정 A의 메트릭스를 Bedrock으로 분석하는 메트릭스 체커 앱을 구축하고 배포하는 과정을 설명합니다.

핵심 포인트

  • Gennai Web의 API 사양을 활용한 외부 AI 앱 연동 방법
  • 서로 다른 AWS 계정 간의 보안 통신 및 IAM 역할 설정
  • AWS Bedrock을 이용한 시스템 메트릭스 분석 구현
  • CDK를 활용한 Gennai Web 환경 구축 및 배포 절차

개요

디지털청(Digital Agency)이 생성형 AI (Generative AI) 활용 기반으로서 Gennai Web과 Gennai AI 앱을 OSS (Open Source Software)로 공개하고 있습니다.

Gennai Web에는 웹 애플리케이션과 내장된 생성형 AI 채팅 등이 포함되어 있습니다.

이 Gennai Web은 별도로 제작된 생성형 AI 앱과 접속할 수 있도록 API 사양이 공개되어 있습니다.

Gennai AI 앱은 이 API 사양에 기반한 생성형 AI 앱의 구현 예시로, AWS, Azure, Google Cloud의 생성형 AI 앱이 공개되어 있습니다.

이번 검증에서는 퍼블릭한 AWS(가버넌스 클라우드가 아닌) 계정 A에 Gennai Web을 배포하고, 다른 AWS(계정 B)에 생성형 AI 앱을 배포하여, 계정 A에서 계정 B의 생성형 AI 앱을 이용하는 검증을 실시합니다.

작성할 생성형 AI 앱은 액세스 원 계정인 계정 A의 메트릭스(Metrics)를 Bedrock으로 읽어 들여, 가동 상황을 체크하는 것입니다.

참고로, Gennai Web은 v1.0.7에서 동작을 확인했습니다.

작성한 코드류

작성한 코드류는 GitHub에 저장되어 있습니다.

Gennai Web과 생성형 AI 앱의 배포·설정·실행 확인

Gennai Web의 배포

Gennai Web의 배포는 Gennai Web의 Readme를 참고하여 실시합니다.

본 기사에서는 상세 내용은 생략하지만, packages/cdk/env-parameters/self-hosting-dev.ts는 다음과 같이 수정했습니다.

12행은 이후 설정할 packages/cdk/parameter.ts의 기재 내용과 맞출 필요가 있으므로, 공개된 절차에 맞춰 변경했습니다.

diff packages/cdk/env-parameters/{self-hosting-template.ts,self-hosting-dev.ts}
12c12
< export const selfHostingTemplateParams: Partial<StackInput> = {
...

packages/cdk/parameter.ts에서 packages/cdk/env-parameters/self-hosting-dev.ts에서 설정한 selfHostingDevParams를 import합니다.

diff --git a/packages/cdk/parameter.ts b/packages/cdk/parameter.ts
index 515a773..dc38d88 100644
--- a/packages/cdk/parameter.ts
...

임시 인증 정보 취득

계정 A와 계정 B의 임시 인증 정보를 취득합니다.

account-a 프로파일은 Gennai Web을 배포한 AWS 계정이며, account-b는 생성형 AI 앱을 배포할 AWS 계정입니다.

aws login --profile account-a
aws login --profile account-b

계정 A의 IAM 역할(Role) 설정

다음 명령으로 환경 변수 ACCOUNT_A_IDACCOUNT_B_ID에 AWS 계정 ID를 설정합니다.

export ACCOUNT_A_ID=$(aws --profile account-a sts get-caller-identity --query Account --output text)
export ACCOUNT_B_ID=$(aws --profile account-b sts get-caller-identity --query Account --output text)
echo "ACCOUNT_A_ID=${ACCOUNT_A_ID}"
...

다음 명령으로 계정 A에 IAM 역할(Role)을 만듭니다.

EXTERNAL_ID=tenant-a-external-id PROFILE_A=account-a npm run deploy:account-a

IAM 역할(Role)이 정상적으로 생성되면 다음과 같이 출력됩니다.

MetricsSourceAccountStack.RequiredExternalId = tenant-a-external-id
MetricsSourceAccountStack.SourceRoleArn = arn:aws:iam::${계정A의 ID}:role/MetricsSourceAccountStack-MetricsReadRole2EDEAB43-Ubie04dK4bfD

계정 B에 생성형 AI 앱 배포

config/tenants.sample.json을 복사하여 config/tenants.json을 생성하고, 생성형 AI 앱을 사용할 수 있도록 하는 AWS 계정 A의 정보를 기재합니다.

cp config/tenants.sample.json config/tenants.json

tenants.json은 다음과 같은 파일입니다.

[
{
"tenantId": "tenant-a",
...

tenants.json은 다음 내용으로 수정합니다.

KeyValue 설정값
tenantId테넌트를 식별하기 위한 고유한 임의의 ID
...

생성형 AI 앱을 배포하기 전에, 배포 대상 계정의 ID를 확인합니다.

echo ${ACCOUNT_B_ID}
${계정 B의 ID}

다음과 같이 명령어를 실행하여 생성형 AI 앱을 계정 B에 배포합니다.

PROFILE_B=account-b TENANTS_FILE=config/tenants.json ALLOWED_SOURCE_CIDRS=198.51.100.10/32,198.51.100.11/32 npm run deploy:account-b

배포가 완료되면, 계정 B에 배포된 API Gateway의 API 키 ID를 사용하여 API 키 값을 가져옵니다.

여기서 가져온 API 키를 사용하여, Gennai Web에 생성형 AI 앱을 등록합니다.

AWS_PROFILE=account-b aws apigateway get-api-key --api-key ${API 키의 ID} --include-value --query value --output text --region ap-northeast-1
Gxu**********************************

Gennai Web에 생성형 AI 앱 등록

Gennai Web에서 공개된 문서에 따라 AI 앱 생성 화면으로 이동하면, 다음과 같은 화면이 표시됩니다.

AIアプリの作成画面

AI 앱 생성 화면

다음 내용을 입력합니다.

항목명입력 내용
API 엔드포인트 URL계정 B 구축 시 ReportEndpointUrl 출력값
API 키위에서 가져온 API 키 값

API 요청 데이터 형식 (JSON)에는 다음과 같은 내용을 입력합니다.

{
"question": {
"title": "질문",
...

그 외의 필수 항목을 입력하고, 생성 버튼을 클릭합니다.

생성에 성공하면, AI 앱에 생성한 메트릭스 체커가 표시됩니다.

AIアプリ画面

AI 앱 화면

생성형 AI 앱 이용

메트릭스 체커에 접속하니 다음과 같은 화면이 표시되어, 질문 부분을 다음 문장으로 수정했습니다.

Lambda의 메트릭스를 확인하고, 주의해야 할 점이 있다면 알려주세요.

メトリクスチェッカー画面

메트릭스 체커 화면

실행 버튼을 누르자 다음과 같이 답변해 주었습니다.

### Lambda 메트릭스 확인
**요약:**
Lambda의 메트릭스를 확인했습니다. 에러 수는 0이며, Lambda 함수가 정상적으로 실행되고 있음을 나타냅니다.
...

生成AIアプリ実行結果

생성형 AI 앱 실행 결과

구축 시 allowedMetricNamespaces로 지정하지 않은 AWS/Cognito 네임스페이스에 대해 실행하려고 하면 에러가 발생했습니다.

実行不可なネームスペースでの確認

실행 불가능한 네임스페이스에서의 확인

주의할 점

계정 B에서 계정 A의 CloudWatch 메트릭스 참조

크로스 어카운트 (Cross-account) 환경에서 CloudWatch 메트릭스를 확인하는 데 사용할 수 있는 주요 방식 및 선택지는 다음과 같은 3가지가 있습니다.

  • AssumeRole
  • CloudWatch 크로스 어카운트 관측성 (CloudWatch cross-account observability)
  • 크로스 어카운트 크로스 리전 CloudWatch 콘솔 (Cross-account cross-region CloudWatch console)

이 생성형 AI 앱을 여러 개의 Gennai Web과 연결하는 상황을 고려했을 때, CloudWatch 크로스 어카운트 관측성처럼 모니터링 계정에서 여러 소스 계정의 메트릭스를 횡단 참조할 수 있는 구성에서는 앱 측에서 테넌트 경계 (Tenant boundary)를 더욱 엄격하게 다룰 필요가 있습니다.

이번에는 요청마다 참조 대상 계정을 명확하게 전환할 수 있도록, AssumeRole을 통해 CloudWatch 읽기용 IAM 역할 (IAM role)을 수임하는 방침을 택했습니다.

AssumeRole을 위한 정보는 Gennai Web으로부터 전송된 API 키를 API Gateway가 검증한 후, apiKeyId를 키로 하여 대응하는 IAM 역할과 ExternalId를 취득하고 있습니다.

API Gateway의 액세스 제한

API Gateway에 AWS WAF를 적용하면 API Gateway로의 액세스를 제한할 수 있지만, 검증 환경에서 비용을 절감하고자 WAF를 사용하지 않는 방침으로 정하고 다음 사항들을 조합했습니다.

  • API Gateway 엔드포인트는 API 키를 필수화하여, API 키를 모르거나 설정되지 않은 통신에 대해 API Gateway에 통합된 Lambda가 실행되지 않도록 설정
  • API 키가 유출되었을 때 대량 액세스를 방지하기 위해, 사용량 계획 (Usage plan)에서 10 액세스/초로 제한
  • 리소스 정책 (Resource policy)을 통해 액세스 원본 IP 주소를 계정 A의 NAT Gateway EIP로 제한

참고

다음 기사를 참고하였습니다.

Discussion

AI 자동 생성 콘텐츠

본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0