서버리스 워크플로 생성
AWS Step Functions 및 AWS Lambda 사용
이 자습서에서는 AWS Step Functions를 사용하여 여러 AWS Lambda 함수를 조정하는 서버리스 워크플로를 설계하고 실행하는 방법을 알아봅니다. AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있는 컴퓨팅 서비스입니다.
이 예에서 여러분은 개발자로서 콜센터에서 지원 티켓 처리를 자동화할 수 있는 서버리스 애플리케이션을 만들라는 요청을 받습니다. 특정 Lambda 함수에서 다른 Lambda 함수를 호출할 수도 있지만, 그러면 콜센터 애플리케이션이 복잡해질수록 이러한 모든 연결을 관리하기가 어려워지는 것이 문제입니다. 또한 애플리케이션의 흐름을 변경하려면 여러 위치에서 변경해야 하며, 동일한 코드를 여러 번 반복해서 작성하게 될 수 있습니다.
이 문제를 해결하기 위해 AWS Step Functions를 사용하기로 결정했습니다. Step Functions는 여러 Lambda 함수를 디버깅하고 변경하기 쉬운 유연한 워크플로로 쉽게 조정할 수 있는 서버리스 조율 서비스입니다. Step Functions는 애플리케이션의 각 단계를 트리거하고 추적하여 Lambda 함수에 추가 로직을 작성할 필요가 없도록 합니다.
앞으로 10분 동안 현재 콜센터 프로세스를 설명하는 Step Functions 상태 시스템을 생성하고, 지원 팀의 태스크를 시뮬레이션하는 몇 가지 간단한 Lambda 함수를 생성하고, 각 Lambda 함수 간에 데이터를 전달하여 지원 사례의 진행 상황을 추적합니다. 그런 다음 워크플로에 대해 여러 테스트를 수행하여 워크플로가 다른 입력에 어떻게 반응하는지 관찰합니다. 마지막으로, 자습서에서 사용한 AWS 리소스를 삭제합니다.
이 자습서에서는 AWS Step Functions와 AWS Lambda를 사용합니다. 이러한 서비스는 AWS 프리 티어에 포함됩니다.
이 자습서를 사용하려면 AWS 계정이 필요합니다.
Step Functions 또는 Lambda는 추가 요금 없이 사용할 수 있습니다. 이 자습서에서 생성하는 리소스는 프리 티어에 해당합니다.
1단계. 상태 시스템 및 서버리스 워크플로 생성
첫 번째 단계는 콜센터에서 지원 티켓을 처리하는 방법을 설명하는 워크플로를 설계하는 것입니다. 워크플로는 계속 반복할 수 있는 일련의 개별 태스크로서 프로세스를 설명합니다.
콜센터 관리자와 함께 지원 사례 처리를 위한 모범 사례를 논의할 수 있습니다. Step Functions의 시각적 워크플로우를 직관적인 참조로 활용하여 워크플로를 함께 정의합니다.
그런 다음 AWS Step Functions에서 워크플로를 설계합니다. 워크플로는 AWS Lambda 함수 하나를 호출하여 지원 사례를 생성하고, 다른 함수를 호출하여 문제를 해결하기 위해 지원 담당자에게 사례를 할당하는 등의 작업을 수행합니다. 또한 Lambda 함수 간에 데이터를 전달하여 처리 중인 지원 사례의 상태를 추적합니다.
a. AWS Step Functions 콘솔을 엽니다. [코드 조각으로 작성]을 선택합니다. [이름] 텍스트 상자에 CallCenterStateMachine을 입력합니다.
b. [상태 시스템 정의] 창의 내용을 아래의 Amazon States Language(ASL) 상태 시스템 정의로 바꿉니다. Amazon States Language는 상태 시스템을 정의하는 데 사용되는 JSON 기반 구조화 언어입니다.
이 상태 시스템은 일련의 태스크 상태를 사용하여 지원 사례를 개설, 할당, 처리합니다. 그런 다음 선택 상태를 사용하여 사례를 마감할 수 있는지 여부를 결정합니다. 그리고 추가로 2개의 상태를 사용하여 경우에 따라 지원 사례를 마감하거나 에스컬레이션합니다.
{
"Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
"StartAt": "Open Case",
"States": {
"Open Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Assign Case"
},
"Assign Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Work on Case"
},
"Work on Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Is Case Resolved"
},
"Is Case Resolved": {
"Type" : "Choice",
"Choices": [
{
"Variable": "$.Status",
"NumericEquals": 1,
"Next": "Close Case"
},
{
"Variable": "$.Status",
"NumericEquals": 0,
"Next": "Escalate Case"
}
]
},
"Close Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"End": true
},
"Escalate Case": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "Fail"
},
"Fail": {
"Type": "Fail",
"Cause": "Engage Tier 2 Support." }
}
}
2단계. AWS Identity and Access Management(IAM) 역할 생성
AWS IAM는 AWS 리소스에 대한 액세스를 안전하게 제어하는 데 도움이 되는 웹 서비스입니다. 이 단계에서는 Step Functions가 Lambda에 액세스하도록 허용하는 IAM 역할을 생성합니다.
a. 다른 브라우저 창에서 AWS Management Console을 엽니다. 이 창이 로드되면 검색 창에 IAM을 입력한 다음 [IAM]을 선택하여 서비스 콘솔을 엽니다.
3단계. 상태 시스템에 IAM 역할 추가
다음으로, AWS Step Functions에서 생성한 IAM 역할 ARN을 상태 시스템에 추가합니다.
4단계. AWS Lambda 함수 생성
상태 시스템을 생성했으니 이제 작업을 수행하는 방법을 결정할 수 있습니다. 상태 시스템을 환경에 이미 있는 AWS Lambda 함수와 기타 마이크로서비스에 연결하거나 AWS Lambda 함수 또는 기타 마이크로서비스를 새로 생성할 수 있습니다. 이 자습서에서는 고객 지원 담당자에게 사례를 할당하는 등 지원 통화를 처리하는 다양한 단계를 시뮬레이션하는 몇 가지 간단한 Lambda 함수를 생성합니다.
g. [함수 코드] 창의 내용을 다음 코드로 바꾼 후 [저장]을 클릭합니다.
exports.handler = (event, context, callback) => {
// Create a support case using the input as the case ID, then return a confirmation message
var myCaseID = event.inputCaseID;
var myMessage = "Case " + myCaseID + ": opened...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
i. 4c 단계에서 생성한 lambda_basic_execution IAM 역할을 사용하여 4b~4d 단계를 반복하면서 Lambda 함수를 4개 더 생성합니다.
AssignCaseFunction을 다음과 같이 정의합니다.
exports.handler = (event, context, callback) => {
// Assign the support case and update the status message
var myCaseID = event.Case;
var myMessage = event.Message + "assigned...";
var result = {Case: myCaseID, Message: myMessage};
callback(null, result);
};
WorkOnCaseFunction을 다음과 같이 정의합니다.
exports.handler = (event, context, callback) => {
// Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
var min = 0;
var max = 1;
var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
var myCaseID = event.Case;
var myMessage = event.Message;
if (myCaseStatus == 1) {
// Support case has been resolved
myMessage = myMessage + "resolved...";
} else if (myCaseStatus == 0) {
// Support case is still open
myMessage = myMessage + "unresolved...";
}
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
CloseCaseFunction을 다음과 같이 정의합니다.
exports.handler = (event, context, callback) => {
// Close the support case
var myCaseStatus = event.Status;
var myCaseID = event.Case;
var myMessage = event.Message + "closed.";
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
EscalateCaseFunction을 다음과 같이 정의합니다.
exports.handler = (event, context, callback) => {
// Escalate the support case
var myCaseID = event.Case;
var myCaseStatus = event.Status;
var myMessage = event.Message + "escalating.";
var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
callback(null, result);
};
작업을 완료하면 5개의 Lambda 함수가 생성됩니다.
5단계. 워크플로 채우기
다음 단계로 Step Functions 워크플로에서 방금 생성한 Lambda 함수를 사용하여 태스크 상태를 채웁니다.
6단계. 워크플로 실행
이제 서버리스 워크플로를 실행할 수 있습니다. 상태 시스템 실행은 워크플로의 인스턴스로, Step Functions 상태 시스템이 태스크를 실행하고 수행할 때마다 발생합니다. 각 Step Functions 상태 시스템에는 여러 동시 실행이 포함될 수 있으며, 이 같은 실행은 Step Functions 콘솔(아래에서 수행하는 방법)에서 시작하거나 AWS SDK, Step Functions API 작업 또는 AWS CLI를 사용하여 시작할 수 있습니다. 실행에서는 JSON 입력을 받아 JSON 출력을 생성합니다.
f. WorkOnCaseFunction의 출력에 따라 워크로드가 지원 사례를 해결하고 티켓을 마감하면서 끝날 수도 있고, 티켓을 다음 지원 티어로 에스컬레이션하면서 끝날 수도 있습니다. 실행을 몇 번 더 실행하면서 이 다른 동작을 관찰할 수도 있습니다. 이 이미지는 지원 사례가 에스컬레이션되어 실패 상태로 종료되는 워크플로의 실행을 보여줍니다.
실제 시나리오에서는 실패 상태로 워크플로를 끝내는 것이 아니라 해결될 때까지 사례를 계속 처리할 수 있습니다. 그러려면 상태 시스템에서 실패 상태를 제거하고 [사례 에스컬레이션] 태스크를 편집하여 다시 [사례 처리] 상태로 루프백합니다. Lambda 함수를 변경할 필요가 없습니다. 이 자습서용으로 만든 함수는 단순한 샘플이므로 자습서의 다음 단계로 넘어갑니다.
7단계. 리소스 종료
이 단계에서는 AWS Step Functions 및 AWS Lambda 관련 리소스를 종료합니다.
중요: 현재 사용되지 않는 리소스를 종료하면 비용이 절감되므로 권장됩니다. 리소스를 종료하지 않으면 요금이 부과될 수 있습니다.
축하합니다!
잘하셨습니다! 여러 AWS Lambda 함수를 트리거하는 AWS Step Functions를 사용하여 서버리스 워크플로를 생성했습니다. 사용자가 정의한 로직에 따라 워크플로가 모든 함수를 조정하고 상태 간에 데이터를 전달하므로 사용자가 각각의 개별 함수에 코드를 작성할 필요가 없습니다.
서버리스 워크플로를 설계하고 실행하는 방법을 배웠으므로 이제 Step Functions를 사용하여 Lambda 함수 오류를 처리하는 방법을 설명하는 다음 자습서를 진행할 수 있습니다. 오류 메시지 유형에 따라 모의 API의 코드에 응답(함수 오류 처리 방식)하는 상태 시스템을 [재시도] 및 [포착] 필드를 사용하여 생성합니다.