В этом модуле вы создадите с помощью AWS Lambda и Amazon DynamoDB процесс управления для обработки запросов, поступающих к вашему интернет-приложению. В браузерном приложении, которое вы развернули в первом модуле, пользователи могут запрашивать отправку единорога в указанное ими местоположение. Для выполнения таких запросов работающий в браузере JavaScript должен вызывать сервис, выполняемый в облаке.

Serverless_Web_App_LP_assets-04

Вы внедрите функцию Lambda, которая будет вызываться каждый раз при запросе единорога пользователем. Функция выберет единорога из парка, запишет запрос в таблицу DynamoDB и затем предоставит интерфейсному приложению сведения об отправляемом единороге.

Эта функция вызывается из браузера с помощью Amazon API Gateway. Вы выполните такое подключение в следующем модуле. В рамках этого модуля вы просто проверите свою функцию в изолированном режиме.

Время на выполнение модуля: 30 минут

Используемые сервисы: AWS Lambda, Amazon DynamoDB


Для создания процесса бессерверной системы управления выполните пошаговые инструкции ниже. Щелкните номер шага, чтобы развернуть соответствующий раздел.

  • Шаг 1. Создание таблицы Amazon DynamoDB

    Создайте новую таблицу DynamoDB с помощью консоли Amazon DynamoDB. Вызовите свою таблицу Rides и присвойте ей ключ раздела под названием RideId с помощью типа строки. В имени таблицы и в ключе раздела учитывается регистр. Обязательно указывайте идентификаторы именно так, как они предоставлены. Для всех остальных параметров используйте значения по умолчанию.

    После создания таблицы запишите имя ARN, которое понадобится при выполнении следующего шага.


    1. Выберите в Консоли управления AWS «Services» (Сервисы) и затем DynamoDB в разделе «Databases» (Базы данных).

    2. Выберите «Create table» (Создать таблицу).

    3. Введите Rides в качестве имени таблицы. В этом поле учитывается регистр.

    4. Введите RideId в качестве «Partition key» (Ключа раздела) и выберите тип ключа «String» (Строка). В этом поле учитывается регистр.

    5. Установите флажок «Use default settings» (Использовать параметры по умолчанию) и выберите «Create» (Создать).

    6. Прокрутите до конца раздела «Overview» (Обзор) своей новой таблицы и запишите ARN. Это имя понадобится в следующем разделе.

  • Шаг 2. Создание роли IAM для функции Lambda

    С каждой функцией Lambda связана роль IAM. Эта роль определяет, с какими другими сервисами AWS разрешено взаимодействовать функции. В рамках этого урока вам нужно будет создать роль IAM, предоставляющую функции Lambda разрешение на запись в журналы Amazon CloudWatch Logs, и получать доступ для записи элементов в таблицу DynamoDB.

    Создайте новую роль с помощью консоли IAM. Назовите ее WildRydesLambda и выберите тип роли AWS Lambda. Вам нужно будет подключить политики, которые предоставят вашей функции разрешение на запись в журналы Amazon CloudWatch Logs, и ввести элементы в таблицу DynamoDB.

    Подключите управляемую политику AWSLambdaBasicExecutionRole к данной роли, чтобы предоставить необходимые разрешения для CloudWatch Logs. Создайте также пользовательскую встроенную политику для свой роли, в которой разрешено действие ddb:PutItem для таблицы, созданной в предыдущем разделе.


    1. Нажмите в Консоли управления AWS «Services» (Сервисы) и затем выберите «IAM» в разделе «Security, Identity & Compliance» (Безопасность и соответствие требованиям).

    2. Выберите на панели навигации слева «Roles» (Роли), а затем «Create New Role» (Создать новую роль).

    3. Выберите тип роли «AWS Lambda».

      Примечание. При выборе типа роли автоматически создается политика доверия для вашей роли, с помощью которой сервисы AWS могут принимать эту роль от вашего имени. Если эта роль была создана с использованием CLI, AWS CloudFormation или другого механизма, нужно указать политику доверия напрямую.

    4. Начните вводить текст AWSLambdaBasicExecutionRole в текстовом поле «Filter» (Фильтр) и установите флажок рядом с этой ролью.

    5. Выберите «Next Step» (Новый шаг).

    6. Введите WildRydesLambda для параметра «Role Name» (Имя роли).

    7. Выберите «Create Role» (Создать роль).

    8. Введите WildRydesLambda в поле фильтра на странице «Roles» (Роли) и выберите только что созданную вами роль.

    9. На вкладке «Permissions» (Разрешения) раскройте раздел «Inline Policies» (Встроенные политики) и перейдите по ссылке «click here» (щелкните здесь), чтобы создать новую встроенную политику.

    10. Убедитесь, что выбран вариант «Policy Generator» (Генератор политик), и нажмите «Select» (Выбрать).

    11. Выберите «Amazon DynamoDB» из раскрывающегося списка «AWS Service» (Сервис AWS).

    12. Выберите «PutItem» из списка «Actions» (Действия).

    13. Вставьте ARN таблицы, созданной при выполнении предыдущего шага, в поле «Amazon Resource Name (ARN)» (Имя ресурса Amazon (ARN)).

    14. Выберите «Add Statement» (Добавить утверждение).

    15. Выберите «Next Step» (Следующий шаг) и затем «Apply Policy» (Применить политику).

  • Шаг 3. Создание функции Lambda для обработки запросов

    AWS Lambda будет выполнять ваш код в ответ на такие события, как запрос HTTP. При выполнении этого шага вы создадите основную функцию, которая будет обрабатывать запросы API от интернет-приложения для отправки единорога. В следующем модуле вы создадите с помощью Amazon API Gateway интерфейс API RESTful, который будет отображать адрес HTTP, вызываемый из браузеров пользователей. Затем вы подключите к API функцию Lambda, созданную при выполнении данного шага, чтобы получилась полнофункциональная система управления интернет-приложением.

    Создайте в консоли AWS Lambda новую функцию Lambda под названием RequestUnicorn для обработки запросов API. Используйте функциональный код, предоставленный в примере внедрения requestUnicorn.js. Просто скопируйте и вставьте его из файла в редактор консоли AWS Lambda.

    Обязательно включите в функции использование роли IAM WildRydesLambda Роль IAM, созданная вами в предыдущем разделе.


    1. Выберите «Services» (Сервисы) и затем «Lambda» в разделе «Compute» (Вычисления).

    2. Выберите «Create function» (Создать функцию).

    3. Выберите «Author from Scratch» (Создать с нуля).

    4. Введите RequestUnicorn в поле «Name» (Имя).

    5. Выберите WildRydesLambda из раскрывающегося списка «Existing Role» (Существующая роль).

    6. Выберите «Create function» (Создать функцию).

    7. Скопируйте и вставьте код из requestUnicorn.js в область ввода кода.

    8. Убедитесь, что в разделе «Runtime» (Среда выполнения) выбрано Node.js 6.10.

    9. Оставьте значение по умолчанию index.handler для поля «Handler» (Обработчик).

  • Шаг 4. Тестирование внедрения

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


    1. Откройте раскрывающийся список «Select a test event» (Выбрать событие теста), а затем «Configure test event» (Настроить событие теста).

    2. Скопируйте и вставьте указанное ниже событие теста в редактор:

    {
        "path": "/ride",
        "httpMethod": "POST",
        "headers": {
            "Accept": "*/*",
            "Authorization": "eyJraWQiOiJLTzRVMWZs",
            "content-type": "application/json; charset=UTF-8"
        },
        "queryStringParameters": null,
        "pathParameters": null,
        "requestContext": {
            "authorizer": {
                "claims": {
                    "cognito:username": "the_username"
                }
            }
        },
        "body": "{\"PickupLocation\":{\"Latitude\":47.6174755835663,\"Longitude\":-122.28837066650185}}"
    }
    1. Введите «Event Name» (Имя события), выберите «Create» (Создать) и затем «test» (тест).

    2. Убедитесь, что действие выполнено, а результат функции выглядит приблизительно так:

    {
        "statusCode": 201,
        "body": "{\"RideId\":\"SvLnijIAtg6inAFUBRT+Fg==\",\"Unicorn\":{\"Name\":\"Rocinante\",\"Color\":\"Yellow\",\"Gender\":\"Female\"},\"Eta\":\"30 seconds\"}",
        "headers": {
            "Access-Control-Allow-Origin": "*"
        }
    }