본 내용은 기업인턴과정에서 발생했던 내용을 정리한 내용입니다.
layer를 이용하는 방식
layer를 이용하는 방식으로 먼저 접근
1) pip install psycopg2 -t .
명령어로 pip install이후 zip파일로 만들어 layer에 올려서 적용
⇒ import error
2) psycopg2 라이브러리말고 psycopg2-binary, aws_psycopg2 라이브러리가 존재
(a)의 방식과 동일하게 진행
⇒ psycopg2-binary, aws_psycopg2 둘다실패
3) (1),(2) 방식을 lambda에 아키텍처를 바꿔가면서 시도
⇒ 결론 : psycopg2 라이브러리는 layer방식으로는 정상적으로 import가 안됨을 확인
라이브러리를 직접 업로드하는 방식으로 시도
1) c - (1), (2), (3)방식과 동일하지만 바로 직접업로드 하는방식 진행
⇒ import error
pip install의 다른접근
pip3.9 install --platform=manylinux1_x86_64 --only-binary=:all: psycopg2-binary -t .
명령어를 통해 pip install 진행psycopg2라이브러리와 AWS_lambda 에서의 결론
RDS에 database와 table 생성
lambda에서 제공하는 환경변수 기능을 사용하여 RDS와 연결하는 코드 작성
conn = psycopg2.connect(
host = os.environ["db_host"],
database = os.environ["db_name"],
user = os.environ["db_username"],
password = os.environ["db_password"]
)
os.environ[”환경변수key값”]
으로 사용가능 하다.cursor메소드 활용하여 psycopg2라이브러리의 execute_batch를 활용하여 한번의 쿼리호출로 여러개의 데이터를 insort하는 방식으로 정의
cur = conn.cursor()
query = "INSERT INTO name (name ) VALUES (%s);"
vals = []
for i in range(len(event['Records'])):
a = json.loads(event['Records'][i]['body'])
b = a["name"]
c = (b,)
vals.append(c)
psycopg2.extras.execute_batch(cur,query, vals)
conn.commit()
cur.close()
conn.close()
부하테스트 관련 앱 조사
java기반의 jmeter, python기반의 Locust
Locust 사용
장점 : 간단하게 pip install로 사용가능
단점 : 1만개를 request하여 그중 몇개가 정상적으로 RDS에 저장되고 저장안되는지 봐야하지만 thread는 정상적으로 생성되지만 request의 제한이 없어 사용 하기 어렵다고 판단
python 내장모듈중 ThreadPoolExecutor 모듈을 활용하여 직접 구현
import requests
from concurrent.futures import ThreadPoolExecutor
import time
start = time.time()
def post_url(arg):
return requests.post(url, json=data, headers=headers)
data = {
"name" : "name1"
}
url = "getway endpoint"
headers = {'Content-Type': 'application/json'}
list_of_urls = [(url, data)]*1000
# 총 데이터의 갯수 설정
with ThreadPoolExecutor(max_workers=1000) as pool:
# max_work : 한번에 최대로 만들어지는 쓰레드 갯수 설정
# 데이터 갯수 1000개, 스레드 최대갯수 50개일때, 50개씩 200번 request보낸다는 의미
response_list = list(pool.map(post_url,list_of_urls))
end = time.time()
# 여기서부터 는 몇개가 response 200인지 response 500인지 구분하여 갯수 파악하기위한 코드
a = []
b = []
for response in response_list:
if response.status_code == 200:
a.append(response)
else:
b.append(response)
result = len(a)
result1 = len(b)
print("성공 :", result, "개", "실패 :", result1, "개")
print(f"{end - start:.5f} 초") # request가 보내지는데 걸리는 시간 측정
참고 : codethief 블로그
⇒ 결과 : 대략 10~15% 데이터가 DB로 저장되는 것을 확인