서버리스 애플리케이션에서 오류 처리
AWS Step Functions 및 AWS Lambda 사용
이 자습서에서는 AWS Step Functions를 사용하여 워크플로 런타임 오류를 처리하는 방법을 배웁니다. AWS Step Functions는 여러 Lambda 함수를 디버깅하고 변경하기 쉬운 유연한 워크플로로 쉽게 조정할 수 있는 서버리스 조율 서비스입니다. AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스입니다.
Lambda 함수는 처리되지 않은 예외가 발생하거나, 구성된 제한 시간보다 오래 실행되거나, 메모리가 부족한 등의 경우에 실패할 수 있습니다. 특히 분산 애플리케이션의 경우, 모든 Lambda 함수에 API 조절 또는 소켓 시간 초과와 같은 상황을 처리하는 오류 처리 로직을 작성하고 유지 관리하는 것은 시간이 많이 걸리고 복잡합니다. 각각의 Lambda 함수에 이 코드를 내장하면 함수 간에 종속성이 나타나며, 환경이 변화함에 따라 그러한 모든 관계를 관리하기가 어려워집니다.
이를 방지하고 작성하는 오류 처리 코드의 양을 줄이려면 AWS Step Functions를 사용하여 함수 오류 처리를 지원하는 서버리스 워크플로를 생성하면 됩니다. 개발자가 생성한 함수 예외 오류(예: 파일을 찾을 수 없음)이든 예상치 못한 오류(예: 메모리 부족)이든 관계없이, 발생하는 오류의 유형에 따라 조건부 로직으로 응답하도록 Step Functions를 구성할 수 있습니다. 이 방식으로 워크플로 로직을 비즈니스 로직과 분리하면 Lambda 함수의 비즈니스 로직을 변경하지 않고도 워크플로가 오류에 응답하는 방식을 수정할 수 있습니다.
이 자습서에서는 AWS Step Functions를 사용하여 이러한 오류를 정상적으로 처리하는 서버리스 워크플로를 설계하고 실행합니다. RESTful API에 대한 호출을 모의 구현하고 다양한 응답 코드와 예외를 반환하는 AWS Lambda 함수를 생성합니다. 그런 다음 AWS Step Functions를 사용하여 발생하는 예외에 따라 서로 다른 로직으로 응답하며 재시도 및 포착 기능이 있는 상태 시스템을 새성합니다.
이 자습서를 사용하려면 AWS 계정이 필요합니다.
AWS Step Functions 또는 AWS Lambda는 추가 요금 없이 사용할 수 있습니다. 이 자습서에서 생성하는 리소스는 프리 티어에 해당합니다.
1단계. API를 모의 구현하는 Lambda 함수 생성
이 단계에서는 몇 가지 기본 API 상호 작용을 모의 구현하는 Lambda 함수를 생성합니다. 이 Lambda 함수는 이벤트 파라미터에 입력으로 제공하는 오류 코드에 따라 가상의 API로부터의 응답을 시뮬레이션합니다.
a. AWS Management Console을 엽니다. 이 단계별 안내서는 계속 열어 놓을 수 있습니다. 이 화면이 로드되면 먼저 사용자 이름 및 암호를 입력하여 시작합니다. 다음으로, 검색 창에 Lambda를 입력하고 Lambda를 선택하여 서비스 콘솔을 엽니다.
d. [MockAPIFunction] 화면에서 아래로 스크롤하여 [함수 코드] 섹션으로 이동합니다. 이 자습서에서는 Python에서 Lambda 함수를 작성하는 프로그래밍 모델을 사용하여 함수를 생성합니다. 코드 창에서 모든 코드를 다음 코드로 바꾼 후 [저장]을 선택합니다.
class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass
def lambda_handler(event, context):
statuscode = event["statuscode"]
if statuscode == "429":
raise TooManyRequestsException('429 Too Many Requests')
elif statuscode == "503":
raise ServerUnavailableException('503 Server Unavailable')
elif statuscode == "200":
return '200 OK'
else:
raise UnknownException('Unknown error')
2단계. AWS Identity and Access Management(IAM) 역할 생성
AWS Step Functions는 코드를 실행하고 다른 AWS 리소스(예: Amazon S3 버킷에 저장된 데이터)에 액세스할 수 있습니다. 보안을 유지하려면 AWS Identity and Access Management(IAM)를 사용하여 이러한 리소스에 Step Functions 액세스 권한을 부여해야 합니다.
3단계. Step Functions 상태 시스템 생성
API 응답을 모의 구현하는 단순한 Lambda 함수를 생성했으므로, 이제 API를 호출하고 예외를 처리하는 Step Functions 상태 시스템을 생성할 수 있습니다.
이 단계에서는 Step Functions 콘솔을 사용하여 [재시도] 및 [포착] 필드가 있는 태스크 상태를 사용하여 다양한 API 응답 코드를 처리하는 상태 시스템을 생성합니다. 태스크 상태를 사용하여 모의 API Lambda 함수를 호출합니다. 그러면 상태 시스템에 입력으로 제공한 API 상태 코드가 반환됩니다.
a. AWS Step Functions 콘솔을 엽니다. [상태 시스템 생성] 페이지에서 [새로 작성]을 선택합니다. [세부 정보] 섹션에서 상태 시스템의 이름을 MyAPIStateMachine으로 지정한 후 [기존 역할 사용]을 선택합니다.
b. 다음으로, 모의 API로부터 수신되는 응답에 따라 서로 다른 조치를 취하는 상태 시스템을 설계합니다. API에 연결할 수 없는 경우 워크플로가 다시 시도합니다. 재시도는 일시적인 오류를 해결하는 데 유용합니다. 이 워크플로는 모의 API에서 발생하는 다양한 예외도 포착합니다.
[상태 시스템 정의] 섹션의 내용을 다음 코드로 바꿉니다.
{
"Comment": "An example of using retry and catch to handle API responses",
"StartAt": "Call API",
"States": {
"Call API": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next" : "OK",
"Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
"Retry" : [ {
"ErrorEquals": [ "TooManyRequestsException" ],
"IntervalSeconds": 1,
"MaxAttempts": 2
} ],
"Catch": [
{
"ErrorEquals": ["TooManyRequestsException"],
"Next": "Wait and Try Later"
}, {
"ErrorEquals": ["ServerUnavailableException"],
"Next": "Server Unavailable"
}, {
"ErrorEquals": ["States.ALL"],
"Next": "Catch All"
}
]
},
"Wait and Try Later": {
"Type": "Wait",
"Seconds" : 1,
"Next" : "Change to 200"
},
"Server Unavailable": {
"Type": "Fail",
"Error":"ServerUnavailable",
"Cause": "The server is currently unable to handle the request."
},
"Catch All": {
"Type": "Fail",
"Cause": "Unknown error!",
"Error": "An error of unknown type occurred"
},
"Change to 200": {
"Type": "Pass",
"Result": {"statuscode" :"200"} ,
"Next": "Call API"
},
"OK": {
"Type": "Pass",
"Result": "The request has succeeded.",
"End": true
}
}
}
4단계. 오류 처리 워크플로 테스트
오류 처리 워크플로를 테스트하기 위해, 상태 시스템을 호출하여 오류 코드를 입력으로 모의 API를 호출합니다.
5단계. 상태 시스템의 실행 검사
c. [실행 이벤트 기록] 섹션에서 각 실행 단계를 펼쳐 워크플로가 예상대로 동작했는지 확인합니다. 이 실행은 원래 실패하도록 만들어졌으므로, 놀라지 마십시오. 다음을 알 수 있습니다.
- Step Functions가 입력을 캡처함
- 해당 입력이 API 호출 태스크 상태로 전달됨
- API 호출 태스크 상태가 해당 입력을 사용하여 MockAPIFunction을 호출함
- MockAPIFunction이 실행됨
- ServerUnavailableException이 발생하여 MockAPIFunction이 실패함
- API 호출 태스크 상태의 catch 문이 해당 예외를 포착함
- catch 문이 워크플로를 실패 처리함
- 상태 시스템의 실행이 완료됨
e. 이제 워크플로의 재시도 동작을 조사합니다. [실행 이벤트 기록] 섹션에서 각 실행 단계를 다시 펼쳐 Step Functions가 MockAPILambda 함수 호출을 두 번 더 시도하고 두 번 모두 실패했는지 확인합니다. API가 일시적으로 응답하지 않는 상태일 수 있으므로, 이때 워크플로는 [대기] 및 [나중에 시도] 상태(오른쪽 이미지)로 전환됩니다.
다음으로, [대기] 상태를 사용하여 응답 코드가 200으로 변경되고 워크플로 실행이 성공적으로 완료됩니다. 실제 애플리케이션에서는 429 예외를 이렇게 처리하지 않겠지만, 이 자습서에는 편의상 간단히 설명합니다.
6단계. 리소스 종료
이 단계에서는 AWS Step Functions 및 AWS Lambda 관련 리소스를 종료합니다.
중요: 현재 사용되지 않는 리소스를 종료하면 비용이 절감되므로 권장됩니다. 리소스를 종료하지 않으면 요금이 부과될 수 있습니다.
축하합니다!
AWS Step Functions와 AWS Lambda를 사용하여 네트워크 API의 오류 처리 워크플로를 생성했습니다. AWS Lambda를 사용하면 사실상 모든 유형의 애플리케이션이나 백엔드 서비스에 대한 코드를 별도의 관리 없이 실행할 수 있습니다. 코드를 업로드하기만 하면, Lambda에서 높은 가용성으로 코드를 실행 및 확장하는 데 필요한 모든 것을 처리합니다.
AWS Step Functions를 AWS Lambda와 결합하면 서버리스 애플리케이션을 위해 AWS Lambda 함수를 간편하게 오케스트레이션할 수 있습니다. Step Functions에서는 상태를 관리하고 오케스트레이션하는 기본 애플리케이션 없이 Lambda 함수를 사용하여 복잡한 워크플로를 제어할 수 있습니다. 또한 Amazon EC2 및 Amazon ECS와 같은 컴퓨팅 리소스를 사용하는 마이크로서비스 오케스트레이션에도 Step Functions를 사용할 수 있습니다.