본문 바로가기

Server

[AWS] Serverless Architecture 사용한 주식 메타 수집 배치 작성

기존에 Docker Compose + Airflow로 구성된 주식 메타 수집 배치를 작성했었다. 

하지만 내가 필요할 때 직접 실행해줘야하는 부분이 싫어서 자동화하기로 했다. 

AWS의 여러 서비스들을 보면서 자동화 할 방법을 찾아보다가 

MWAA라는 이름으로 AWS에서 관리형 Airflow를 제공하고 있었다. 

기존에 사용하던 DAG가 있었기 때문에 DB를 DynamoDB로 바꾸고 일부 코드만 수정해서 바로 사용이 가능할 정도로 편리했다. 

직접 설치해서 사용하는 것 보다 훨씬 간단했지만 생각보다 비용이 많이 나왔다. 

MWAA 환경을 테스트하느라 한 두 번 정도 만들었고
10~20분 정도 도는 Task를 몇 번 실행하고 나니 $20~30 정도가 청구되었다. 

그래서 AWS 비용 견적을 대충 보니 달마다 $400가 나왔다. 

그것도 최소 자원만 사용했을때의 금액이었다. 

 

 

분기 데이터를 조회하는 배치에 3달에 한 번 20분 정도를 위해 지불할 가치가 없다고 생각이 들어서 다른 방법을 찾다가 Lambda를 사용하기로 했다. 대부분의 시간에 자원을 반납한 상태로 두고 스케줄링된 시간에 20분 정도만 빌려서 사용하는 방식은 내가 구현하고자 하는 배치 유형에 아주 적합한 방법이다. 

 

DAG 코드를 조금 바꾸고 Lambda 함수로 만들었다. 

AWS 환경으로의 배포는 AWS CLI, SAM을 통해서 손쉽게 수행할 수 있었다. 

처음에는 Lambda가 바로 죽어서 로그를 잘 확인하지 못하고 메모리의 문제인가 싶어 메모리를 느려보거나 했지만 

기본값 3초, 최대 15분으로 제한된 Lambda로 인해 배치가 끝나기도 전에 Lambda가 종료되었다. 

(대부분 API GW - Lambda 형태로 사용해서 기본timeout 값이 짧은데 Batch로 사용할 Lambda는 시간을 늘려서 사용해주는 게 필요하다.)

 

회사일을 하면서 Lambda 간 비동기 호출이 필요한 경우가 있어서 
해당 경험을 살려서 Trigger Lambda가 먼저 실행되고 다음 차례에 동시에
병렬로 처리될 여러 Lambda 들을 비동기호출로 실행시켜주는 구조로 결정했다. 

 

def invoke_lambda_async(start, end):
    client.invoke(
        FunctionName='arn:aws:lambda:ap-northeast-2:...',
        InvocationType='Event', # Event 로 명시하면 요구하던 비동기 호출방식으로 호출된다. 
        Payload=json.dumps({'start': start, 'end': end})
    )

위 코드는 비동기 방식으로 lambda를 호출하기 위한 함수를 만들어 두었다. 

client는 boto3에서 lambda client를 생성하여 lambda 서비스를 접근하기 위한 함수를 수행할 수 있게한다. 

해당 Trigger Lambda는 다른 Lambda를 invoke 하기 때문에 IAM권한을 부여해야한다. 

Lambda Invoke 권한을 추가하면 된다. 

AWSLambda_FullAccess 권한을 주면 invoke 권한도 부여될 것이다. 

FullAccess 권한에 lambda:* 으로 설정이 되어있다.

확실히 기존 Lambda 함수 1개로 사용했을 때 보다 어느 정도 비용이 더 나올 것으로 예상되지만

MWAA를 사용하는것보다는 더 나은 방법이었다. 

(추가적으로는 급격한 DynamoDB Insert로 발생하는 비용이 있는지도 살펴봐야 할 것 같다. 지금은 데이터가 적어서 거의 무의미한 듯하다)

 

수집된 데이터는 주식들의 분기 실적 데이터다. 

간단한 데이터 랭킹을 부여해서 주식을 추려냈고
동일하게 한국투자증권 API를 사용해서 주문을 진행하고 있다. 

기존 키움이나 대신증권 API가 COM, OCX의 방식이라 너무 불편했는데

REST API가 나오니 날개가 달린 듯 실제 서비스 투입도 빠르게 진행되었다.