API Gateway
리소스 생성
메소드 생성
메소스 요청 설정[Method Request]
1. 요청 검사기 설정
목적 : 클라이언트로부터 들어오는 요청을 검증합니다. 이를 통해 잘못된 요청을 사전에 필터링할 수 있습니다.
잘못된 요청에 대한 예시로 들자면, 필수 파라미터 누락, 잘못된 데이터 형식, 본문 형식 오류, 헤더 누락 또는 잘못된 헤더 등이 있습니다.
설정 : 본문, 쿼리 문자열 파라미터 및 헤더 검증을 선택하면, API GATEWAY는 유효성을 검증합니다.
2. URL 쿼리 문자열 파라미터 설정
목적 : 클라이언트가 요청시 제공해야 하는 쿼리 스트링 파라미터를 정의합니다.
설정 : user_input, role, student_name과 같은 파라미터를 추가하면, API GATEWAY는 이 파라미터들이 요청에
포함되어 있는 지 확인합니다.
CORS 설정
CORS는 보안 기능으로, 한 도메인에서 실행중인 웹 애플리케이션이 다른 도메인에서 리소스를 요청할 때
이를 제어하는 매커니즘입니다.
예를 들어, https://example.com에서 실행 중인 애플리케이션이 https://api.example.com에서 데이터를
요청할 때, 브라우저는 이러한 요청이 허용되는 지 확인하기 위해 CORS 정책을 사용합니다.
API Gateway에서 CORS 설정을 적용하면, OPTIONS 요청에 대한 응답과 모든 메소드 응답에
CORS 헤더를 추가합니다.
OPTIONS의 통합 응답에 헤더 매핑이 설정한 대로 되어있는 것을 확인할 수 있습니다.
람다 설정
솔직히 말해서 람다 설정 해주는 데만 5~6시간 걸린 것 같습니다..
이게 dependency 맞춰주는 게 생각보다 쉽지 않은 일이더라구요.
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'pydantic_core._pydantic_core'
Traceback (most recent call last)
ChatGPT API를 사용해서 응답해주는 간단한 프로그램을 개발하는데
람다 함수 설정에서 이러한 문제가 생기면 매우.. 골치아팠습니다.
[이것때문에 anaconda까지 날려먹은 건 안 비밀]
openai 모듈 같이 람다 환경에 추가하는 법 알려드릴게요.
은근 번거로운 부분이지만 그래도 한번 알아두면
계속 써먹을 수 있어서 유용합니다.
mkdir python
pip install -t python/ openai
cd python
zip -r9 openai.zip .
이런식으로 openai 모듈을 zip 파일로 압축합니다.
여기서 중요한 건 python 파일 안에 있어야 한다는 것이
매우 중요합니다.
업로드에 위에서 압축한 파일을 올려주면 됩니다.
하지만, 그렇지만, 위와 같은 에러가 발생하였습니다.
계속 pydatic_core가 없다라는 문구가 떴습니다.
그래서 저는 layer에 위와 동일한 방식으로 pydantic_core 모듈을 추가해줬습니다.
하지만.. 아래와 같은 dependency 오류가 계속 발생하였습니다.
그래서 반대로 pydantic_core 먼저 설치한 뒤, openai 모듈을 설치해보는 등
진짜 별 다양한 방법을 사용해서 해봤는데도 오류가 해결되지 않았습니다.
그러다 버전 별로 설치를 해야겠다라는 생각을 해보게 되었고,
버전 별로 설치를 하였습니다. 이거 꼭 이렇게 설치하십쇼..!
저의 람다 환경은 파이썬 3.10 버전입니다.
해결방법
conda create -n lambda_function python=3.10
conda activate lambda_function
pip install pydantic==1.10.11 openai==0.28 boto3
Python 3.10 환경으로 새로 생성하고, pydantic 1.10.11 버전과 openai 0.28 버전을 설치합니다.
mkdir -p lambda_layer/python
pip install pydantic==1.10.11 -t lambda_layer/python
pip install openai==0.28 -t lambda_layer/python
pip install boto3 -t lambda_layer/python
cd lambda_layer
zip -r9 layer.zip .
설치된 패키지를 Lambda 레이어로 패키징합니다.
하지만 모듈 3개를 넣다 보니까 용량이 커졌습니다.
10MB 넘어가는 파일은 S3를 사용해서 업로드를 하라고 적혀있어서
S3에 올려서 해당 URL을 가져와 파일을 업로드 하였습니다.
사용할 Lambda 함수에 들어가서 계층에
Add a layer를 추가해 줍니다.
방금 만들어 놓은 사용자 지정 계층을 선택해주고, 이름과 버전을 같이 입력해줍니다.
import json
import os
import boto3
import openai
from datetime import datetime
# DynamoDB 테이블 초기화
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('ChatHistory')
# OpenAI API 키 설정
# OPENAI_API_KEY = os.environ['OPENAI_API_KEY']
OPENAI_API_KEY = 'Your-OPENAI-API-Key'
openai.api_key = OPENAI_API_KEY
def lambda_handler(event, context):
# 요청 본문(body) 추출
body = json.loads(event['body'])
user_input = body.get('user_input')
role = body.get('role', '교육 컨설턴트')
student_name = body.get('student_name', '학생')
if not user_input:
return {
'statusCode': 400,
'headers': {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
},
'body': json.dumps({'message': 'user_input은 필수입니다.'})
}
# 프롬프트 엔지니어링 예시
prompt = f"""
너는 {role}야. 학생의 성적 데이터를 분석하고 다음 질문에 답변해줘:
- 학생의 현재 성적 수준은 어떤가?
- 학생의 출석 여부는 어떤가?
- 특정 과목의 성적을 향상시키기 위해 어떤 조언을 줄 수 있나?
데이터: {user_input}
학생 이름: {student_name}
"""
messages = [
{"role": "system", "content": "너는 교육 컨설턴트입니다. 학생의 성적 데이터를 분석하고 아래 질문에 답변해 주세요:"},
{"role": "user", "content": prompt}
]
# ChatGPT API 호출
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
max_tokens=512,
temperature=0
)
response_message = response['choices'][0]['message']['content']
# DynamoDB에 대화 기록 저장
table.put_item(Item={
'user_id': student_name,
'timestamp': datetime.utcnow().isoformat() + 'Z',
'response': response_message,
'user_input': user_input
})
return {
'statusCode': 200,
'headers': {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Methods': 'OPTIONS,POST,GET'
},
'body': json.dumps({"response": response_message})
}
Lambda 함수가 직접 응답을 반환하는 경우, Lambda 함수에서도 명시적으로 CORS 헤더를 추가해야 합니다.
Lambda 함수에서 CORS를 설정해주지 않으면 발생하는 오류입니다.
Lambda 함수가 직접 응답을 반환할 때, 응답에 CORS 헤더가 없으면
브라우저는 응답을 차단합니다.
그래서, 모든 응답에 CORS 헤더를 추가함으로써 브라우저가 응답을 수락할 수 있도록
합니다.
주요 CORS 헤더
1. Access-Control-Allow-Origin :
어떤 도메인에서 요청을 허용할지 지정합니다.
*는 모든 도메인에서의 요청을 허용합니다.
2. Access-Control-Allow-Headers :
클라이언트가 서버로 보낼 수 있는 헤더를 지정합니다.
Content-Type 등
3. Access-Control-Allow-Methods :
클라이언트가 서버로 보낼 수 있는 HTTP 메서드를 지정합니다.
OPTIONS, GET, POST 등
최종 결과물
사실 이걸 시작하게 된 계기가 제가 지금 하고 있는 프로젝트에서 ChatGPT API를 활용해서
이러한 챗봇 서비스도 하나의 서비스 중 하나입니다.
학생의 결과를 리포트 해주는 것이 하나의 서비스여서 이것을 클라우드 기반으로
프론트만 작성해서 이것이 잘 작동하는 지를 확인하는 작업을 진행해보았습니다.
이런식으로 Prompt Engineering을 진행해서 좀 더 말투라던지, 어떻게 하면
더 좋은 결과가 나올 수 있을 지에 대해서 고민해봐야겠습니다.
너무 길지만 봐주셔서 감사합니다 :)
오류를 해결해서 너무 다행인 것 같아요.
요즘 Spring도 지금 배우고 있는 입장에서 종종 올라올 예정이니까
많은 관심 부탁드립니당 ㅎㅎ
'개발 > AWS' 카테고리의 다른 글
[AWS] [Step - 1] VPC 부터 서브넷 구축 해보기 (0) | 2024.07.14 |
---|---|
[AWS] AWS RDS 사용해보기! (0) | 2024.07.13 |
[AWS] Amazon EKS로 웹 애플리케이션 구축하기 [Step 1 - 실습 환경 구축] (0) | 2024.07.06 |
[AWS] Face Rekognition:search_faces_by_image 를 활용해서 출석부 활용하기 (0) | 2024.07.05 |
[AWS] Github Actions S3와 github repository 연결하기 [Ver 2] (0) | 2024.07.04 |