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

с помощью 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
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
03b

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


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

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

03c
03c

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


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

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


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

02a
02a

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


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

02b
02b

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


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

02c
02c

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


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

02d
02d

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


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

02e
02e

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


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

02f
02f

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


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

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


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

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

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

03a
03a

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


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

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


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

04a
04a

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


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

04b
04b

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


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

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

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

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

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

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

04c
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
04d

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


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

04e
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
04f

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


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

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


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

05a
05a

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


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

05b
05b

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


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

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

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

05c
05c

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


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

05d
05d

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


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

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


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

06a
06a

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


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

{
"inputCaseID": "001"
}
06b
06b

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


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

06c
06c

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


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

06d
06d

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


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

06e
06e

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


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

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

06f
06f

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


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

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

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


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

07a
07a

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


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

07b
07b

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


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

07c
07c

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


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

07d
07d

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


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

07e
07e

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


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


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

07f
07f

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


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

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

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


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