WiseN

AWS Step Functions을 간단 사용해 보았습니다

Feb 27,2018   |   AWS

작성자_김명수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

여기서 다루는 내용


· Step Functions 간단 소개 
· Step Functions 간단 사용기


AWS Step Functions을 사용하면 비주얼 워크 플로우를 사용하여 분산 응용 프로그램 및 마이크로 서비스의 구성 요소를 쉽게 조정하는 것이 가능합니다. 개별 기능을 수행하는 개별 구성 요소에서 응용 프로그램을 구축함으로써, 애플리케이션의 확장과 변경을 빠르게 할 수 있습니다.

AWS Step funcitons 을 도쿄 리전에서 사용해 보았습니다.

참고로 아직 서울 리전 미지원 상태입니다. (2018.02 기준)    서울 리전에서 지원됩니다. (2018.05 업데이트)

 




Step Functions 간단 소개






:: 주요 기능



  • Step Functions는 작업 및 상태 머신의 개념을 기반으로 함

  • JSON 기반 Amazon States 언어을 사용하여 상태 머신을 정의함

  • 콘솔에 상태 머신의 구조가 그래프로 표시되어 상태 머신의 논리를 시각적으로 확인 및 실행 모니터링 가능


 

:: 간단 살펴 보기



  • 상태(states) : task, choice, fail, succeed, pass, wait, parallel 이 있으며 각 유형에 대한 설명은 아래와 같음

    • Task : 상태 머신에서 몇 가지 작업 수행

    • Choice  : 실행 브랜치 간 선택

    • Fail / Succeed  : 오류로 실행 중지 또는 성공

    • Pass  : 입력을 출력으로 단순히 전달하거나 일부 수정된 데이터 전달

    • Wait  : 특정 시간 동안 또는 지정된 시간/날짜까지 실행 지연

    • Parallel : 브랜치 병렬 실행 시작



  • 작업(tasks) : 활동(Activities)  또는 Lambda function task 수행

  • 전환(transition) :  Next 필드 값을 사용하여 진행할 다음 상태 결정

  • 데이터 형식 : JSON 텍스트

  • 데이터 사용 방법 : 자세한 내용은 상태 머신 입/출력 , 상태 입/출력 참고

  • 오류 관련 : 오류 발생 후 Retry,  Catch 등을 사용하여 실패처리 하는 등의 처리가 가능하며, 자세한 내용은  오류처리 참고


 

:: 참고 Link



 




Step Functions 간단 사용기






외부 데이터를 수집하고, 수집한 원본 데이터를 S3에 저장하는 Lambda function 작업을 Step Functions의 state machine을 활용하여 사용해보겠습니다.

 

 


 

:: 준비


먼저 데이터를 수집 및 저장 작업을 수행하는 Lambda function을 생성하고, 생성된 Lambda function의 ARN을 확인합니다.

※ 동일 리전의 Lambda만 호출 가능하므로 동일 리전인 도쿄에서 생성합니다.


Lambda function의 코드는 외부 API 서버에 접근하여 데이터를 요청하고, 이를 XML 형식으로 받아 .xml 파일 형식으로 S3에 저장하도록 구성하고, S3 bucket도 같이 준비합니다.

데이터 수집
params = tmp_params_dict
xmldata = urllib.urlopen(os.environ['api_url'], urllib.urlencode(params)).read()




데이터 저장
client = boto3.client('s3')
client.put_object(Body=xmldata, Bucket=os.environ['bucket_name'], Key='crawled/' + year + '/' + month + '/' + day + '/' + userName + '/' + str(offset) + '.xml', ContentType='text/xml')



 

:: State machine 생성 및 code 작성


먼저 AWS Step functions에서 state machine을 생성합니다.



 

먼저 state machine 이름, IAM role을 설정한 뒤  state machine code를 입력합니다.  Step functions 에서는 여러 Templates 제공 및  Sample Projects로 Job Status Poller, Task Timer를 제공하고 있으므로 참고하여 진행하면 좀 더 수월하게 code를 작성할 수 있지만 기본적으로  Amazon States 언어를 알아야 됩니다.  자세한 내용은  여기 를 참고하면 가이드 되어 있습니다.

두 가지 데이터를 수집 하기 위해 parallel type을 사용하여 브랜치 하였고, pass type으로  "submit crawling job A"와  "submit crawling job B"에서 result에 id 값을 다르게 설정하여 동일 Lambda function에서 실행되도록 해보았습니다. 우선  Code를 입력하고, workflow를 확인해 보니 아래와 같이 workflow가 시각화 되어 나옵니다.

 

여기에  각 crawilng job 별로 retry 옵션을 사용하여 실패시 재시도를 2번 더 하도록 설정하고, 오류 상황에 대한 캐치를 위해 Catch failure를 넣었습니다.  오류 조건 처리 관련해서 여기 를 참고하면 가이드 되어 있습니다.


:: State machine 실행


위의 workflow를 한번 돌려보았는데... 오류가 캐치되어 States.TaskFailed 오류를 catch 하는 ReservedTypeFallback에서 받아 Fail로 처리되었습니다.


원인은 "crawling B"라는 이름을 가진 step 실행 중  Lambda function에서 timeout이 발생하여  아래 이미지와 같이 "Lambda.Unkown" error로 LambdaFunctionFailed 되었다고 Step functions에 표시됩니다.

기본적으로 Lambda에서 처리하지 않은 오류 뿐만 아니라 메모리 부족 오류, 함수 시간 초과 및 동시 호출 제한에 대한 오류도 동일하게  "Lambda.Unkown" error 오류로 표시가 되며 Lambda.Unknown, States.ALL,  States.TaskFailed 로 캐치하여 처리 할 수 있습니다.

 



Lambda function 에는 요청당 최대 실행 기간 제한이 있으며, 최대 300초 까지 설정 가능합니다.(2018년 2월 기준)

현재 수집하는 Lambda function 이 300초 = 5분 설정되어 있기 때문에 더 이상 늘릴 수 도 없습니다.

그래서 Lambda function의 수집 코드를 변경하고, state machine code를 변경하여 수집하고자 하는 데이터를 timeout에 걸리지 않게 여러 번 나눠서 Lambda function이 수행되도록 수정 했습니다.

※ 이 과정에서 ResultPath, Choices, Variable, NumericGreaterThanEquals 를 활용하였습니다.


 

위의 workflow를 돌려봅니다.

아래 이미지와 같이 정상적으로 실행이 됩니다.





 

수집된 데이터가 S3에 정상적으로 저장된 것을 확인 할 수 있었습니다.

:: 마무리


AWS Step functions를 사용하면서 애플리케이션의 기능을 통해 구성 요소와 단계를 조정할 수 있었고, Lambda function의 오류 발생시 실행을 중지하는 등 일련의 단계로 시각화하여 사용해 보았습니다.
이상 AWS Step Functions 간단 사용기를 마무리합니다.

 






* 추가 : 위에서 사용한 단순 참고용 샘플 state machine code는 여기에서 samplecode.json 확인 하실 수 있습니다.