ASK CLI (v2)を利用してCloudFormationでAlexa Skillのバックエンドをデプロイする

ASK CLI(v2)から、AWS CloudFormationでAlexa Skillのバックエンドをデプロイできるようになりました。 プロジェクトを作成する プロジェクトの作成はv1同様ask newから対話的に始め […]

広告ここから
広告ここまで

目次

    ASK CLI(v2)から、AWS CloudFormationでAlexa Skillのバックエンドをデプロイできるようになりました。

    プロジェクトを作成する

    プロジェクトの作成はv1同様ask newから対話的に始めることができます。

    Step1: 言語を指定する

    % ask new
    Please follow the wizard to start your Alexa skill project ->
    ? Choose the programming language you will use to code your skill:  (Use arrow keys)
    ❯ NodeJS 
      Python 
      Java 
    

    Step2: バックエンドのデプロイ先・方法を指定する

    V1ではLambdaデプロイオンリーでしたが、v2ではHosted / AWS CloudFormation / AWS Lambda / self-hostedから選ぶことができます。

    ? Choose a method to host your skill's backend resources:  (Use arrow keys)
    ❯ Alexa-hosted skills
      Host your skill code by Alexa (free). 
      AWS with CloudFormation
      Host your skill code with AWS services and provision with AWS CloudFormation (requires AWS account) 
      AWS Lambda
      Host your skill code on AWS Lambda (requires AWS account). 
      ──────────────
      self-hosted and manage your own hosting 

    Step3: ベースのテンプレートを指定する

    サンプルスキルを選びましょう。

    ? Choose a template to start with:  (Use arrow keys)
    ❯ Hello world           Alexa's hello world skill to send the greetings to the world! 
      Fact skill            Quick sample skill to manage a collection of voice data. 
      High low game         Guess a number high or low using persistent attributes. Make sure your AWS account has the permission to manage DynamoDB! 
    

    Step4: スキル・プロジェクト名を指定する

    ディレクトリ名やスキル名を指定して完了です。

    ? Please type in your skill name:  example-skill
    ? Please type in your folder name for the skill project (alphanumeric):  exampleSkill

    AWS CloudFormationを選んだ場合のディレクトリ構成がこちらです。

    % tree 
    .
    ├── LICENSE.txt
    ├── ask-resources.json
    ├── infrastructure
    │   └── cfn-deployer
    │       └── skill-stack.yaml
    ├── lambda
    │   ├── index.js
    │   ├── package.json
    │   └── util.js
    └── skill-package
        ├── assets
        │   ├── en-US_largeIcon.png
        │   └── en-US_smallIcon.png
        ├── interactionModels
        │   └── custom
        │       └── en-US.json
        └── skill.json
    
    7 directories, 10 files

    デプロイ

    デプロイ方法もv1と同じで、ask deployを実行しましょう。

    CloudFormationのリソースをチェックする

    .ask/ask-states.jsonにデプロイしたCloudFormationのstack idがあります。

    なのでAWS CLI + jqでこのようにすることでスタック情報を取得できます。

    % aws cloudformation describe-stack-resources --stack-name $(cat .ask/ask-states.json | jq ".profiles.default.skillInfrastructure["@ask-cli/cfn-deployer"].deployState.default.stackId" -r) | jq .
    {
      "StackResources": [
        {
          "StackName": "example-skill-default-skillStack-1587380830650",
          "StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
          "LogicalResourceId": "AlexaSkillFunction",
          "PhysicalResourceId": "example-skill-default-skillSt-AlexaSkillFunction-19SAEJO5SZMBP",
          "ResourceType": "AWS::Lambda::Function",
          "Timestamp": "2020-04-20T11:07:47.639Z",
          "ResourceStatus": "CREATE_COMPLETE",
          "DriftInformation": {
            "StackResourceDriftStatus": "NOT_CHECKED"
          }
        },
        {
          "StackName": "example-skill-default-skillStack-1587380830650",
          "StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
          "LogicalResourceId": "AlexaSkillFunctionEventPermission",
          "PhysicalResourceId": "example-skill-default-skillStack-1587380830650-AlexaSkillFunctionEventPermission-14T7X7Q1K8HFM",
          "ResourceType": "AWS::Lambda::Permission",
          "Timestamp": "2020-04-20T11:08:00.883Z",
          "ResourceStatus": "CREATE_COMPLETE",
          "DriftInformation": {
            "StackResourceDriftStatus": "NOT_CHECKED"
          }
        },
        {
          "StackName": "example-skill-default-skillStack-1587380830650",
          "StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
          "LogicalResourceId": "AlexaSkillIAMRole",
          "PhysicalResourceId": "example-skill-default-skillSta-AlexaSkillIAMRole-YFXEA2L5SOA4",
          "ResourceType": "AWS::IAM::Role",
          "Timestamp": "2020-04-20T11:07:44.055Z",
          "ResourceStatus": "CREATE_COMPLETE",
          "DriftInformation": {
            "StackResourceDriftStatus": "NOT_CHECKED"
          }
        }
      ]
    }

    AWS CloudFormationのカスタマイズ

    AWS CloudFormation / AWS SAMでスタックをカスタマイズできます。

    下の例では、 S3:GetObject をLambdaが実行できるようにカスタムしています。

    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      SkillId:
        Type: String
      LambdaRuntime:
        Type: String
      LambdaHandler:
        Type: String
      CodeBucket:
        Type: String
      CodeKey:
        Type: String
      CodeVersion:
        Type: String
    Resources:
      AlexaSkillIAMRole:
          Type: AWS::IAM::Role
          Properties:
            AssumeRolePolicyDocument:
              Version: 2012-10-17
              Statement:
                - Effect: Allow
                  Principal:
                    Service:
                      - lambda.amazonaws.com
                  Action:
                    - sts:AssumeRole
            Path: /
            Policies:
              - PolicyName: alexaExternalPolicy
                PolicyDocument:
                  Version: 2012-10-17
                  Statement:
                    - Effect: Allow
                      Action:
                        - s3:GetObject
                      Resource: arn:aws:s3:::*
              - PolicyName: alexaSkillExecutionPolicy
                PolicyDocument:
                  Version: 2012-10-17
                  Statement:
                    - Effect: Allow
                      Action:
                        - logs:*
                      Resource: arn:aws:logs:*:*:*
      AlexaSkillFunction:
        Type: AWS::Lambda::Function
        Properties:
          Code:
            S3Bucket: !Ref CodeBucket
            S3Key: !Ref CodeKey
            S3ObjectVersion: !Ref CodeVersion
          Handler: !Ref LambdaHandler
          Runtime: !Ref LambdaRuntime
          Role: !GetAtt AlexaSkillIAMRole.Arn
          MemorySize: 512
          Timeout: 60
      AlexaSkillFunctionEventPermission:
        Type: AWS::Lambda::Permission
        Properties:
          Action: lambda:invokeFunction
          FunctionName: !GetAtt AlexaSkillFunction.Arn
          Principal: alexa-appkit.amazon.com
          EventSourceToken: !Ref SkillId
    Outputs:
      SkillEndpoint:
        Description: LambdaARN for the regional endpoint
        Value: !GetAtt AlexaSkillFunction.Arn
    

    Conclusion

    ASK CLI(v2)でAWS CloudFormationを使うことで、AWSのリソースを複数組み合わせて動かすスキルなども簡単にデプロイ・管理できるようになりそうです。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark