Создание бессерверного рабочего процесса

с помощью AWS Step Functions и AWS Lambda

В этом учебном пособии вы узнаете, как с помощью сервиса AWS Step Functions спроектировать и запустить бессерверный рабочий процесс, координирующий множество функций AWS Lambda. AWS 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, чтобы отследить ход работы над заявкой в службу поддержки.


а) Откройте консоль AWS Step Functions. Выберите Создать с фрагментами кода. В текстовом поле Имя введите CallCenterStateMachine.

01c

(Щелкните, чтобы увеличить изображение.)


б) Замените содержимое окна Определение конечного автомата на указанное ниже определение конечного автомата Amazon States Language (ASL). Amazon States Language – это структурированный язык, созданный на базе JSON и используемый для определения конечного автомата.

В конечном автомате используется ряд состояний задачи для открытия, назначения и работы над заявкой в службу поддержки. Затем используется состояние «Выбор» для определения того, можно ли закрыть заявку. Еще два состояния задачи закрывают или передают заявку на следующий уровень, если это необходимо.

 

{
  "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

(Щелкните, чтобы увеличить изображение.)


в) Нажмите кнопку «Обновить», чтобы отобразить определение конечного автомата ASL в виде визуального рабочего процесса. В нашем сценарии можно легко проверить, что процесс описан правильно, просмотрев визуальный рабочий процесс вместе с руководителем колл-центра.

г) Нажмите Далее.

03c

(Щелкните, чтобы увеличить изображение.)


Шаг 2. Создание роли AWS Identity and Access Management (IAM)

AWS IAM – это веб-сервис, который позволяет безопасно управлять доступом к ресурсам AWS. На этом шаге мы создадим роль IAM, которая позволяет Step Functions получить доступ к Lambda.


а) В другом окне браузера откройте Консоль управления AWS. Когда стартовый экран загрузится, в строке поиска введите IAM , а затем выберите IAM , чтобы открыть консоль сервиса.

02a

(Щелкните, чтобы увеличить изображение.)


б) Нажмите Роли , а затем – Создать роль.

02b

(Щелкните, чтобы увеличить изображение.)


в) На экране Создание ролей не снимайте флажок рядом с элементом Сервис AWS, выберите Step Functions и нажмите Далее: разрешения. На следующем экране нажмите Далее: просмотр.

02c

(Щелкните, чтобы увеличить изображение.)


г) Введите Имя роли: step_functions_basic_execution, и выберите Создать роль. На следующем экране нажмите Далее: просмотр.

02d

(Щелкните, чтобы увеличить изображение.)


д) Роль будет создана и добавлена в перечень. Выберите имя своей роли, чтобы ее просмотреть. 

02e

(Щелкните, чтобы увеличить изображение.)


е) Скопируйте номер ARN роли на следующем экране.

02f

(Щелкните, чтобы увеличить изображение.)


Шаг 3. Добавление роли IAM к конечному автомату

Далее вы добавите номер ARN созданной роли IAM к конечному автомату в AWS Step Functions.


а) Выберите вкладку браузера с консолью Step Functions.

б) Вставьте скопированный номер ARN в текстовое поле ARN роли IAM.

в) Нажмите Создать конечный автомат.

03a

(Щелкните, чтобы увеличить изображение.)


Шаг 4. Создание функций AWS Lambda

Теперь, когда вы создали конечный автомат, можно решить, как он должен выполнять работу. Конечный автомат можно подключить к функциям AWS Lambda и другим микросервисам, уже существующим в вашей среде, или создать новые. В данном учебном пособии вы создадите несколько простых функций Lambda, которые симулируют различные действия по обработке вызовов в службу поддержки, например назначение заявки представителю службы поддержки клиентов.


а) Нажмите Сервисы, в строке поиска введите Lambda и выберите Lambda, чтобы открыть консоль сервиса.

04a

(Щелкните, чтобы увеличить изображение.)


б) Нажмите Создать функцию.

04b

(Щелкните, чтобы увеличить изображение.)


в) Выберите Создать с нуля.

г) Настройте указанные ниже параметры первой функции Lambda.

Имя – OpenCaseFunction.
Среда выполнения – Node.js 4.3.
Роль: создайте собственную роль.

Появится новое окно IAM.

д) Для параметра Имя роли оставьте значение lambda_basic_execution и нажмите Разрешить.
Вы будете автоматически возвращены на консоль Lambda.

е) Нажмите Создать функцию.

04c

(Щелкните, чтобы увеличить изображение.)


ж) Замените содержимое окна Код функции на указанный ниже код и нажмите Сохранить.

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

(Щелкните, чтобы увеличить изображение.)


з) В верхней части страницы нажмите Функции.

04e

(Щелкните, чтобы увеличить изображение.)


и) Повторите шаги 4b–4d, чтобы создать еще четыре функции Lambda, используя созданную на шаге 4c роль IAM lambda_basic_execution.

Определите функцию 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);
};

По завершении этих действий у вас должно быть пять функций Lambda.

04f

(Щелкните, чтобы увеличить изображение.)


Шаг 5. Заполнение рабочего процесса

Следующий шаг – заполнить состояния задач в рабочем процессе Step Functions только что созданными функциями Lambda.


а) Нажмите Сервисы, в строке поиска введите Step и выберите Step Functions, чтобы открыть консоль сервиса.

05a

(Щелкните, чтобы увеличить изображение.)


б) На экране Конечные автоматы выберите свой конечный автомат CallCenterStateMachine и нажмите Редактирование.

05b

(Щелкните, чтобы увеличить изображение.)


в) В разделе Определение конечного автомата найдите строку в состоянии Open Case, которая начинается со слова Resource.

Замените ARN на ARN вашей функции OpenCaseFunction.

Если нажать на пример ARN, отобразится список функций AWS Lambda, имеющихся в вашем аккаунте, и вы сможете выбрать нужную функцию.

05c

(Щелкните, чтобы увеличить изображение.)


г) Повторите предыдущий шаг, чтобы обновить номера ARN функций Lambda для состояний задачи Назначение заявки, Работа над заявкой, Закрытие заявки и Передача заявки на следующий уровень в вашем конечном автомате. Затем нажмите Сохранить.

05d

(Щелкните, чтобы увеличить изображение.)


Шаг 6. Выполнение рабочего процесса

Ваш бессерверный рабочий процесс готов к выполнению. Выполнение конечного автомата – инстанс вашего рабочего процесса. Он осуществляется каждый раз, когда конечный автомат Step Functions запускается и выполняет свои задачи. У каждого конечного автомата Step Functions может быть несколько одновременных выполнений, которые можно инициировать на консоли Step Functions (чем вы и займетесь далее), с помощью AWS SDK, действий API или интерфейса командной строки AWS. В процессе выполнения используются входные данные в формате JSON и создаются выходные данные в формате JSON.


а) Нажмите Начать выполнение.

06a

(Щелкните, чтобы увеличить изображение.)


б) Появится диалоговое окно «Новое выполнение». В качестве идентификатора заявки в службу поддержки введите все, что указано ниже, в раздел Входные данные диалогового окна «Новое выполнение» и нажмите Начать выполнение.

{
"inputCaseID": "001"
}
06b

(Щелкните, чтобы увеличить изображение.)


в) В ходе выполнения рабочего процесса на панели Визуальный рабочий процесс цвет каждого шага будет меняться. Подождите завершения несколько секунд. Затем на панели Сведения о ходе выполнения нажмите Входные данные и Выходные данные, чтобы просмотреть входные данные и результаты рабочего процесса.

06c

(Щелкните, чтобы увеличить изображение.)


г) Step Functions позволяет проверить каждый шаг выполнения рабочего процесса, в том числе входные и выходные данные каждого состояния. В разделе «Детали шага» нажмите на каждую задачу в рабочем процессе, чтобы развернуть поля Входные данные и Выходные данные. Вы заметите, что идентификатор заявки, который вы ввели в конечный автомат, передается с каждого шага на следующий, и что по мере завершения работы каждой функции Lambda сообщения обновляются.

06d

(Щелкните, чтобы увеличить изображение.)


д) Прокрутите страницу вниз к разделу Журнал событий выполнения. Просматривайте каждый шаг выполнения, чтобы увидеть, как сервис Step Functions вызывал функции Lambda и передавал данные между функциями.

06e

(Щелкните, чтобы увеличить изображение.)


е) В зависимости от выходных данных вашей функции WorkOnCaseFunction ваш рабочий процесс, возможно, завершился решением вопроса и закрытием заявки либо переводом заявки на следующий уровень службы поддержки. Вы можете еще несколько раз повторно запустить выполнение, чтобы понаблюдать за различным поведением. На этом изображении показано выполнение рабочего процесса, в котором запрос был передан на следующий уровень службы поддержки, что привело к выходу из рабочего процесса с состоянием «Ошибка».

В реальном сценарии вы, возможно, решили бы продолжить работу над заявкой, пока она не была бы разрешена, вместо того чтобы завершать выполнение рабочего процесса с ошибкой. Для этого можно удалить состояние «Ошибка» и изменить задачу Передать на следующий уровень в вашем конечном автомате, чтобы вернуться к состоянию Работа над заявкой. При этом не потребуется вносить изменения в ваши функции Lambda. Функции, которые мы создали для данного учебного пособия, – всего лишь примеры, поэтому мы перейдем к следующему шагу учебного пособия.

06f

(Щелкните, чтобы увеличить изображение.)


Шаг 7. Удаление ресурсов

На этом шаге вы удалите свои ресурсы, связанные с сервисами AWS Step Functions и AWS Lambda.

Важно! Удаление неиспользуемых ресурсов позволяет сократить расходы и является рекомендованной мерой. Если не удалить ресурсы, может взиматься дополнительная плата.


а) В верхней части окна консоли AWS Step Functions щелкните пункт Конечные автоматы.

07a

(Щелкните, чтобы увеличить изображение.)


б) В окне Конечные автоматы выберите свой конечный автомат CallCenterStateMachine и нажмите Удалить. Чтобы подтвердить, что вы хотите удалить конечный автомат, в появившемся диалоговом окне нажмите Удалить конечный автомат. Ваш конечный автомат будет удален через одну-две минуты после того, как сервис Step Functions подтвердит, что все сеансы выполнения процессов завершены.

07b

(Щелкните, чтобы увеличить изображение.)


в) Затем удалите свои функции Lambda. В меню консоли управления AWS нажмите Сервисы и выберите пункт Lambda.

07c

(Щелкните, чтобы увеличить изображение.)


г) На экране Функции нажмите каждую функцию, которую вы создали для работы с данным учебным пособием, выберите пункт Действия, а затем команду Удалить. Подтвердите удаление, еще раз щелкнув Удалить.

07d

(Щелкните, чтобы увеличить изображение.)


д) И, наконец, удалите свои роли IAM. В меню консоли управления AWS нажмите Сервисы и выберите пункт IAM.

07e

(Щелкните, чтобы увеличить изображение.)


е) Выберите обе роли IAM, которые вы создали для работы с данным учебным пособием, а затем нажмите Удалить роль. Подтвердите удаление, нажав пункт Да, удалить в диалоговом окне.


Теперь можно выйти из консоли управления AWS.

07f

(Щелкните, чтобы увеличить изображение.)


Поздравляем!

Отличная работа! Вы только что создали бессерверный рабочий процесс с помощью сервиса AWS Step Functions, который активирует множество функций AWS Lambda. Ваш рабочий процесс вместо вас координировал все ваши функции в соответствии с заданной вами логикой и передавал данные с одного состояния на другое. То есть, вам не пришлось писать код для каждой отдельной функции.

Теперь, когда вы научились проектировать и запускать бессерверный рабочий процесс, можно перейти к следующему учебному пособию, в котором вы научитесь использовать Step Functions для обработки ошибок функций Lambda. Вы создадите конечный автомат с полями «Повторить попытку» и «Перехват», которые отвечают на коды отклика от фиктивных API исходя из типа сообщения об ошибке. Этот метод называется обработкой ошибок функций.


Была ли полезной информация, представленная в этом учебном пособии?