Хостинг навыка Alexa на AWS с помощью Serverless

Привет всем 👋 Мы рассмотрим, как настроить навык Alexa для мелочей, связанных с космическими событиями, используя фреймворк Serverless. Предполагается, что вы знакомы с основами Alexa и некоторыми концепциями AWS, такими как IAM, Lambda и т.д. Давайте начнем.

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

Alexa

Войдите в консоль набора навыков Alexa под своей учетной записью разработчика.

Затем вы можете создать навык и дать ему имя вызова.

Интенты

Я добавил 2 встроенных интента и 2 пользовательских интента, чем то, что добавляется по умолчанию.

Интент GetAnswerIntent имеет следующие высказывания.

it's {date}
I guess it's on {date}
I think the date is {date}
{date}
I'm guessing it's {date}
Войти в полноэкранный режим Выйти из полноэкранного режима

Вы можете добавить больше или изменить по своему усмотрению. Единственным слотом здесь является date и он имеет встроенный тип AMAZON.DATE.

Аналогично AskQuestionIntent имеет следующие высказывания.

could you ask me the question please
can you go back to the question
can you ask me the question
question please
go back to the question
next question
Ask question
Войти в полноэкранный режим Выйти из полноэкранного режима

Убедитесь, что модель сохранена и построена после добавления всех интенций.

IAM

Войдите в AWS как пользователь root и создайте группу пользователей.

Группа пользователей должна быть привязана к управляемой AWS политике разрешений AWSCloud9User, которая позволяет создавать среды Cloud9. Однако это не обязательно, если вы не используете Cloud9.

Затем я создал еще одну пользовательскую политику со следующим JSON с именем ServerlessPolicy, которая дает достаточно разрешений для развертывания serverless SDK с использованием стека формирования облака, а также доступ к другим соответствующим службам, как указано в списке.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:DELETE",
                "apigateway:GET",
                "apigateway:PATCH",
                "apigateway:POST",
                "apigateway:PUT",
                "cloudformation:CreateChangeSet",
                "cloudformation:CreateStack",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DeleteStack",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStackResource",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:ListStackResources",
                "cloudformation:UpdateStack",
                "cloudformation:ValidateTemplate",
                "events:DescribeRule",
                "events:PutRule",
                "events:PutTargets",
                "events:RemoveTargets",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:UpdateAssumeRolePolicy",
                "lambda:AddPermission",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:GetAccountSettings",
                "lambda:GetAlias",
                "lambda:GetEventSourceMapping",
                "lambda:GetFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:GetLayerVersion",
                "lambda:GetLayerVersionPolicy",
                "lambda:GetPolicy",
                "lambda:InvokeFunction",
                "lambda:ListAliases",
                "lambda:ListEventSourceMappings",
                "lambda:ListFunctions",
                "lambda:ListLayerVersions",
                "lambda:ListLayers",
                "lambda:ListTags",
                "lambda:ListVersionsByFunction",
                "lambda:PublishVersion",
                "lambda:RemovePermission",
                "lambda:UpdateFunctionCode",
                "lambda:UpdateFunctionConfiguration",
                "logs:CreateLogGroup",
                "logs:DeleteLogGroup",
                "logs:DeleteSubscriptionFilter",
                "logs:DescribeLogGroups",
                "logs:FilterLogEvents",
                "logs:GetLogEvents",
                "logs:PutSubscriptionFilter",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:DeleteBucketPolicy",
                "s3:DeleteBucketWebsite",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetBucketLocation",
                "s3:GetObject*",
                "s3:ListBucket",
                "s3:PutBucketPolicy",
                "s3:PutEncryptionConfiguration",
                "s3:PutObject",
                "sts:GetCallerIdentity"
            ],
            "Resource": "*"
        }
    ]
}
Вход в полноэкранный режим Выход из полноэкранного режима

Таким образом, группа прикреплена к обеим политикам.

Как только группа будет создана, добавьте в нее нового пользователя.

И не забудьте скопировать учетные данные.

Instance

Теперь вы можете войти в AWS как новый пользователь. Далее нам нужна машина, с которой мы сможем клонировать бессерверный код и развернуть его, для этого я запущу инстанс cloud 9, чтобы использовать его в качестве онлайн-редактора. Впрочем, вы можете использовать любую Linux-машину.

Я создам среду Cloud9 в регионе Мумбаи, ap-south-1.

Я выбрал тип экземпляра t3.small, мы можем выбрать t2.micro, если нам нужен экземпляр, соответствующий требованиям бесплатного уровня.

После его создания вы увидите консоль.

AWS CLI

AWS CLI поставляется предустановленным в Cloud9, и в нем также есть файл учетных данных.

serverless-user-1:~/environment $ ls ~/.aws/
credentials
Вход в полноэкранный режим Выйти из полноэкранного режима

Однако мы можем настроить конфигурацию.

serverless-user-1:~/environment $ cat ~/.aws/config 
[default]
region=ap-south-1
Вход в полноэкранный режим Выйти из полноэкранного режима

Клонирование

Давайте клонируем репо alexa skill space-events-trivia с github.

serverless-user-1:~/environment $ git clone https://github.com/networkandcode/space-events-trivia.git
Войти в полноэкранный режим Выход из полноэкранного режима

Код, который мы клонировали, представляет собой набор функций nodejs и совместим с serverless sdk.

serverless-user-1:~/environment $ cd space-events-trivia/
serverless-user-1:~/environment/space-events-trivia (main) $ ls
AplRender.js                   GetAnswerIntentHandler.js  interceptors.js          README.md                      StartTriviaHandler.js
CancelAndStopIntentHandler.js  HelpIntentHandler.js       LaunchRequestHandler.js  RepeatIntentHandler.js         triviaFunctions.js
documents                      index.js                   package.json             serverless.yml
ErrorHandler.js                IntentReflectorHandler.js  package-lock.json        SessionEndedRequestHandler.js
Войти в полноэкранный режим Выйдите из полноэкранного режима

Файл documents/questions.json содержит список вопросов для тривиа, вы можете изменять его по мере необходимости.

Пакеты

Файл package.json должен указать нам пакеты, которые мы будем использовать в нашем коде.

Давайте установим их.

serverless-user-1:~/environment/space-events-trivia (main) $ npm i
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated uuid@3.3.2: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.

added 18 packages, and audited 19 packages in 2s

1 package is looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Вход в полноэкранный режим Выход из полноэкранного режима

Serverless

Мы можем установить бессерверный SDK и позже развернуть код с его помощью на AWS lambda. На самом деле здесь мы говорим о двух вещах, во-первых, о бессерверном фреймворке/SDK, а во-вторых, о бессерверном технологическом предложении AWS, которым является Lambda. Вместо того чтобы писать функции непосредственно на Lambda, мы будем использовать бессерверный SDK с его конструкциями для достижения цели контролируемым способом.

serverless-user-1:~/environment $ npm i serverless -g
Вход в полноэкранный режим Выйдите из полноэкранного режима

Теперь он должен быть установлен.

serverless-user-1:~/environment $ serverless -v
Framework Core: 3.18.2
Plugin: 6.2.2
SDK: 4.3.2
Войти в полноэкранный режим Выйдите из полноэкранного режима

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

serverless-user-1:~/environment/space-events-trivia (main) $ cat serverless.yml 
app: space-events-trivia
service: space-events-trivia

frameworkVersion: '3'

provider:
  environment:
    DYNAMODB_REGION: ${aws:region}
    DYNAMODB_TABLE: ${self:service}-users-${sls:stage}
  iam:
    role:
      statements:
      - Effect: 'Allow'
        Action:
        - 'dynamodb:CreateTable'
        - 'dynamodb:PutItem'
        - 'dynamodb:Get*'
        - 'dynamodb:Scan*'
        - 'dynamodb:UpdateItem'
        - 'dynamodb:DeleteItem'
        Resource: arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/${self:service}-users-${sls:stage}
  name: aws
  region: ap-south-1
  runtime: nodejs16.x
  stage: dev

functions:
  handler:
    handler: index.handler
    events:
    - alexaSkill: amzn1.ask.skill.${param:alexaSkillId}
Войти в полноэкранный режим Выйти из полноэкранного режима

В конфигурации отсутствует org, мы можем указать его при развертывании. Мы также дали разрешения для лямбда-функции на DynamoDB, включая разрешение на создание таблицы, чтобы лямбда-функция могла создать таблицу, если она не существует.

Развертывание

Давайте развернем функцию, для чего сначала авторизуемся в serverless.

$ serverless login
? Which would you like to log into? Serverless Framework Dashboard
Logging into the Serverless Dashboard via the browser
If your browser does not open automatically, please open this URL:
https://app.serverless.com?client=cli&transactionId=<some-id>
Войти в полноэкранный режим Выйти из полноэкранного режима

После входа в систему через браузер вы должны увидеть этот экран.

Вот и все, пора развертывать.

$ serverless deploy --org <your-org> --param="alexaSkillId=<id>"
Войти в полноэкранный режим Выход из полноэкранного режима

Перед выполнением приведенной выше команды вы должны указать свой org и alexaSkillId. Имя org — это то, что вы создали в serverless при регистрации аккаунта, а ID навыка можно получить из консоли разработчика alexa, чтобы он был сопоставлен с alexaSkill: ${param:alexaSkillId} в serverless.yml.

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

Конечные точки

Вы можете получить конечную точку лямбды прямо из Serverless CLI.

$ serverless info --param="alexaSkillId=<your-skill-id>" --verbose
service: space-events-trivia
stage: dev
region: ap-south-1
stack: space-events-trivia-dev
functions:
  handler: space-events-trivia-dev-handler

Stack Outputs:
  HandlerLambdaFunctionQualifiedArn: <lambda-arn>
  EnterpriseLogAccessIamRole: <role-name>  
  ServerlessDeploymentBucketName: <bucket-name>

Want to ditch CloudWatch? Try our new console: run "serverless --console"
Вход в полноэкранный режим Выйти из полноэкранного режима

Вы можете скопировать ARN лямбды из приведенного выше результата, за исключением суффикса, который является числом, и установить его в качестве конечной точки в настройках Skill в консоли разработчика Alexa. Он должен иметь формат arn:aws:lambda:<region>:<account-id>:function:<function-name>. Я только что добавил его для региона по умолчанию.

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

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

Ну что ж, на этом пока все, спасибо за чтение!!!

Кредит изображения: unsplash

Оцените статью
Procodings.ru
Добавить комментарий