서버리스 워크플로 생성

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 FunctionsAWS Lambda를 사용합니다. 이러한 서비스는 AWS 프리 티어에 포함됩니다.

이 자습서를 사용하려면 AWS 계정이 필요합니다.

Step Functions 또는 Lambda는 추가 요금 없이 사용할 수 있습니다. 이 자습서에서 생성하는 리소스는 프리 티어에 해당합니다. 

프리 티어에 대해 자세히 알아보기 >>


1단계. 상태 시스템 및 서버리스 워크플로 생성

첫 번째 단계는 콜센터에서 지원 티켓을 처리하는 방법을 설명하는 워크플로를 설계하는 것입니다. 워크플로는 계속 반복할 수 있는 일련의 개별 태스크로서 프로세스를 설명합니다.

콜센터 관리자와 함께 지원 사례 처리를 위한 모범 사례를 논의할 수 있습니다. Step Functions의 시각적 워크플로우를 직관적인 참조로 활용하여 워크플로를 함께 정의합니다.

그런 다음 AWS Step Functions에서 워크플로를 설계합니다. 워크플로는 AWS Lambda 함수 하나를 호출하여 지원 사례를 생성하고, 다른 함수를 호출하여 문제를 해결하기 위해 지원 담당자에게 사례를 할당하는 등의 작업을 수행합니다. 또한 Lambda 함수 간에 데이터를 전달하여 처리 중인 지원 사례의 상태를 추적합니다.


a. AWS Step Functions 콘솔을 엽니다. [코드 조각으로 작성]을 선택합니다. [이름] 텍스트 상자에 CallCenterStateMachine을 입력합니다.

01c

( 확대하려면 클릭 )


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."    }   
  }
}
03b

( 확대하려면 클릭 )


c. 새로 고침 버튼을 클릭하여 ASL 상태 시스템 정의를 시각적 워크플로로 표시합니다. 예제 시나리오에서는 콜센터 관리자와 함께 시각적 워크플로를 검토하면서 프로세스가 올바르게 설명되어 있는지 쉽게 확인할 수 있습니다.

d. [다음]을 클릭합니다.

03c

( 확대하려면 클릭 )


2단계. AWS Identity and Access Management(IAM) 역할 생성

AWS IAM는 AWS 리소스에 대한 액세스를 안전하게 제어하는 데 도움이 되는 웹 서비스입니다. 이 단계에서는 Step Functions가 Lambda에 액세스하도록 허용하는 IAM 역할을 생성합니다.


a. 다른 브라우저 창에서 AWS Management Console을 엽니다. 이 창이 로드되면 검색 창에 IAM을 입력한 다음 [IAM]을 선택하여 서비스 콘솔을 엽니다.

02a

( 확대하려면 클릭 )


b. [역할]을 클릭한 후 [역할 생성]을 클릭합니다.

02b

( 확대하려면 클릭 )


c. [역할 생성] 화면에서 [AWS 서비스]가 선택된 상태로 두고 [Step Functions]를 선택한 후 [다음: 권한]을 클릭합니다. 다음 화면에서 [다음: 검토]를 클릭합니다.

02c

( 확대하려면 클릭 )


d. [역할 이름]에 step_functions_basic_execution을 입력하고 [역할 생성]을 선택합니다. 다음 화면에서 [다음: 검토]를 클릭합니다.

02d

( 확대하려면 클릭 )


e. 역할이 생성되어 목록에 표시됩니다. 역할의 이름을 선택하여 역할을 표시합니다. 

02e

( 확대하려면 클릭 )


f. 다음 화면에서 [역할 ARN]을 복사합니다.

02f

( 확대하려면 클릭 )


3단계. 상태 시스템에 IAM 역할 추가

다음으로, AWS Step Functions에서 생성한 IAM 역할 ARN을 상태 시스템에 추가합니다.


a. Step Functions 콘솔이 표시된 브라우저 탭을 선택합니다.

b. 복사한 ARN을 [IAM 역할 ARN] 텍스트 상자에 붙여 넣습니다.

c. [상태 시스템 생성]을 클릭합니다.

03a

( 확대하려면 클릭 )


4단계. AWS Lambda 함수 생성

상태 시스템을 생성했으니 이제 작업을 수행하는 방법을 결정할 수 있습니다. 상태 시스템을 환경에 이미 있는 AWS Lambda 함수와 기타 마이크로서비스에 연결하거나 AWS Lambda 함수 또는 기타 마이크로서비스를 새로 생성할 수 있습니다. 이 자습서에서는 고객 지원 담당자에게 사례를 할당하는 등 지원 통화를 처리하는 다양한 단계를 시뮬레이션하는 몇 가지 간단한 Lambda 함수를 생성합니다.


a. [서버리스]를 클릭하고 검색 텍스트 상자에 Lambda를 입력한 후 Lambda를 선택하여 서비스 콘솔을 엽니다.

04a

( 확대하려면 클릭 )


b. [함수 생성]을 클릭합니다.

04b

( 확대하려면 클릭 )


c. [새로 작성]을 선택합니다.

d. 다음 설정을 적용하여 Lambda 함수를 구성합니다.

이름OpenCaseFunction
런타임Node.js 4.3
역할사용자 지정 역할 생성

새 IAM 창이 표시됩니다.

e. [역할 이름]에서 lambda_basic_execution을 그대로 두고 [허용]을 클릭합니다.
자동으로 Lambda 콘솔로 돌아옵니다.

f. [함수 생성]을 클릭합니다.

04c

( 확대하려면 클릭 )


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);    
};
04d

( 확대하려면 클릭 )


h. 페이지 상단에서 [함수]를 클릭합니다.

04e

( 확대하려면 클릭 )


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 함수가 생성됩니다.

04f

( 확대하려면 클릭 )


5단계. 워크플로 채우기

다음 단계로 Step Functions 워크플로에서 방금 생성한 Lambda 함수를 사용하여 태스크 상태를 채웁니다.


a. [서버리스]를 클릭하고 검색 텍스트 상자에 Step을 입력한 후 Step Functions를 선택하여 서비스 콘솔을 엽니다.

05a

( 확대하려면 클릭 )


b. [상태 시스템] 화면에서 CallCenterStateMachine을 선택하고 [편집]을 클릭합니다.

05b

( 확대하려면 클릭 )


c. [상태 시스템 정의] 섹션에서 [사례 개설] 상태의 아래에 있는 Resource로 시작하는 줄을 찾습니다.

해당 ARN을 OpenCaseFunction의 ARN으로 바꿉니다.

샘플 ARN을 클릭하면 계정의 AWS Lambda 함수를 보여주는 목록이 표시되어 목록에서 함수를 선택할 수 있습니다.

05c

( 확대하려면 클릭 )


d. 이전 단계를 반복하여 상태 시스템에서 [사례 할당], [사례 처리], [사례 마감] 및 [사례 에스컬레이션] 태스크 상태의 Lambda 함수 ARN을 업데이트한 후 [저장]을 클릭합니다.

05d

( 확대하려면 클릭 )


6단계. 워크플로 실행

이제 서버리스 워크플로를 실행할 수 있습니다. 상태 시스템 실행은 워크플로의 인스턴스로, Step Functions 상태 시스템이 태스크를 실행하고 수행할 때마다 발생합니다. 각 Step Functions 상태 시스템에는 여러 동시 실행이 포함될 수 있으며, 이 같은 실행은 Step Functions 콘솔(아래에서 수행하는 방법)에서 시작하거나 AWS SDK, Step Functions API 작업 또는 AWS CLI를 사용하여 시작할 수 있습니다. 실행에서는 JSON 입력을 받아 JSON 출력을 생성합니다.


a. [실행 시작]을 클릭합니다.

06a

( 확대하려면 클릭 )


b. [새 실행] 대화 상자가 나타납니다. 아래의 내용을 [새 실행] 대화 상자의 [입력] 창에 입력하여 지원 사례의 ID를 지정한 후 [실행 시작]을 클릭합니다.

{
"inputCaseID": "001"
}
06b

( 확대하려면 클릭 )


c. 워크플로를 실행함에 따라 [시각적 워크플로] 창에서 각 단계의 색이 바뀝니다. 실행이 완료될 때까지 몇 초 동안 기다립니다. 그런 다음 [실행 세부 정보] 창에서 [입력] 및 [출력]을 클릭하여 워크플로의 입력과 결과를 봅니다.

06c

( 확대하려면 클릭 )


d. Step Functions에서 각 단계의 입력 및 출력을 비롯하여 워크플로 실행의 각 단계를 조사할 수 있습니다. 워크플로의 각 단계를 클릭하여 [단계] 세부 정보에서 [입력] 필드와 [출력] 필드를 펼칩니다. 각 Lambda 함수의 작업이 완료되면 상태 시스템에 입력한 사례 ID가 각 단계에서 다음 단계로 전달되고 메시지가 업데이트됩니다.

06d

( 확대하려면 클릭 )


e. 아래로 스크롤하여 [실행 이벤트 기록] 섹션으로 이동합니다. 실행의 각 단계를 차례로 클릭하면서 Step Functions가 어떻게 Lambda 함수를 호출하고 함수 간에 데이터를 전달하는지 살펴봅니다.

06e

( 확대하려면 클릭 )


f. WorkOnCaseFunction의 출력에 따라 워크로드가 지원 사례를 해결하고 티켓을 마감하면서 끝날 수도 있고, 티켓을 다음 지원 티어로 에스컬레이션하면서 끝날 수도 있습니다. 실행을 몇 번 더 실행하면서 이 다른 동작을 관찰할 수도 있습니다. 이 이미지는 지원 사례가 에스컬레이션되어 실패 상태로 종료되는 워크플로의 실행을 보여줍니다.

실제 시나리오에서는 실패 상태로 워크플로를 끝내는 것이 아니라 해결될 때까지 사례를 계속 처리할 수 있습니다. 그러려면 상태 시스템에서 실패 상태를 제거하고 [사례 에스컬레이션] 태스크를 편집하여 다시 [사례 처리] 상태로 루프백합니다. Lambda 함수를 변경할 필요가 없습니다. 이 자습서용으로 만든 함수는 단순한 샘플이므로 자습서의 다음 단계로 넘어갑니다.

06f

( 확대하려면 클릭 )


7단계. 리소스 종료

이 단계에서는 AWS Step Functions 및 AWS Lambda 관련 리소스를 종료합니다.

중요: 현재 사용되지 않는 리소스를 종료하면 비용이 절감되므로 권장됩니다. 리소스를 종료하지 않으면 요금이 부과될 수 있습니다.


a. AWS Step Functions 콘솔 창의 상단에서 [상태 시스템]을 클릭합니다.

07a

( 확대하려면 클릭 )


b. [상태 시스템] 창에서 CallCenterStateMachine을 선택하고 [삭제]를 클릭합니다. 나타나는 대화 상자에서 [상태 시스템 삭제]를 클릭하여 상태 시스템 삭제 의사를 확인합니다. 1~2분 안에 Step Functions가 진행 중인 실행이 완료된 것을 확인한 후 상태 시스템이 삭제됩니다.

07b

( 확대하려면 클릭 )


c. 다음으로, Lambda 함수를 삭제합니다. AWS Management Console 메뉴에서 [서비스]를 클릭한 후 [Lambda]를 선택합니다.

07c

( 확대하려면 클릭 )


d. [함수] 화면에서 이 자습서용으로 생성한 각 함수를 클릭한 후 [작업]을 선택하고 [삭제]를 선택합니다. [삭제]를 다시 클릭하여 삭제를 확인합니다.

07d

( 확대하려면 클릭 )


e. 마지막으로, IAM 역할을 삭제합니다. AWS Management Console 메뉴에서 [서비스]를 클릭한 후 [IAM]을 선택합니다.

07e

( 확대하려면 클릭 )


f. 이 자습서용으로 생성한 IAM 역할 2개를 모두 선택한 후 [역할 삭제]를 클릭합니다. 대화 상자에서 [예, 삭제합니다]를 클릭하여 삭제를 확인합니다.


이제 AWS Management Console에서 로그아웃해도 됩니다.

07f

( 확대하려면 클릭 )


축하합니다!

잘하셨습니다! 여러 AWS Lambda 함수를 트리거하는 AWS Step Functions를 사용하여 서버리스 워크플로를 생성했습니다. 사용자가 정의한 로직에 따라 워크플로가 모든 함수를 조정하고 상태 간에 데이터를 전달하므로 사용자가 각각의 개별 함수에 코드를 작성할 필요가 없습니다.

서버리스 워크플로를 설계하고 실행하는 방법을 배웠으므로 이제 Step Functions를 사용하여 Lambda 함수 오류를 처리하는 방법을 설명하는 다음 자습서를 진행할 수 있습니다. 오류 메시지 유형에 따라 모의 API의 코드에 응답(함수 오류 처리 방식)하는 상태 시스템을 [재시도] 및 [포착] 필드를 사용하여 생성합니다.