LoginSignup
2
2

More than 1 year has passed since last update.

Alexa ASK CLI v2用のスキルプロジェクトをセットアップする

Last updated at Posted at 2020-05-19

はじめに

ASK CLIがv2になったので、スキルプロジェクトをv2用にセットアップした。v1を使っていて、v1用のスキルプロジェクトがある場合は、スキルプロジェクトをマイグレーション方法もあるけど、今回は、手動でv2用のスキルプロジェクトをセットアップしてみた。また、Alexaスキルを作っているけれど、ASK CLIを使っていない場合も、この方法でv2用のプロジェクトが作成できる。

実際に公開しているスキルに対して、この手順でデプロイができて、スキルが正しく動作することは確認済み。

前提

  • Alexaスキルを作成している
  • ASK CLI v2がインストールされている
  • インタラクションモデルとLambda関数の整合性がとれている
  • エンドポイントはAWS Lambdaを使ってる

セットアップの流れ

セットアップ
  1. スキルプロジェクトフォルダを作成する
  2. Lambda関数をエクスポートする
  3. スキルパッケージをエクスポートする
  4. スキルプロジェクトを初期化する
  5. スキルをデプロイする

スキルプロジェクトフォルダを作成する

適当に、管理しやすいところにフォルダを作成する。場所はどこでも大丈夫です。
ここではskillprojectというフォルダ名で進める。スキル名に近い名前が管理しやすいと思う。

スキルプロジェクトフォルダ
c:\
└─skillproject

Lambda関数をエクスポートする

image.png

AWSからLambda関数をエクスポートして展開しておく。git等で管理していたり、ローカルで管理できているのであれば、わざわざ関数をエクスポートしなくても良い。
.zipを展開した時のフォルダ名でも問題はないが、マイグレーション時に生成されるフォルダ名に合わせてlambda/lambcacustomに変更してみた。フォルダ名は ask init で設定するので任意の名前でよい。

スキルプロジェクトフォルダ
c:\
└─skillproject
   └─lambda
      └─lambdacustom
         │  index.js
         │  local-debugger.js
         │  package-lock.json
         │  package.json
         │  util.js
         │  
         └─node_modules
             │      :

なので、以下のように lambda 配下に置いても大丈夫。

スキルプロジェクトフォルダ
c:\
└─skillproject
   └─lambda
      │  index.js
      │  local-debugger.js
      │  package-lock.json
      │  package.json
      │  util.js
      │  
      └─node_modules
          │      :

スキルパッケージをエクスポートする

skillprojectフォルダに移動して、下記コマンドを実行する。
ステージはdevelopmentliveのいずれかを指定する。デフォルトはdevelopment
今回 試したスキルは live のskill-packageをエクスポートした。

-g オプションは必ず指定しないと動作しなくなってた。(2022年7月16日更新)

自分でskill-packageフォルダ以下にファイルを配置したり、ディレクトリを作れば、skill-packageもわざわざエクスポートしなくても良い。ただし、skill-package配下のフォルダ構成は以下のようにする必要がある。任意の名前ではダメ。

ask smapi export-package -s <スキルID> -g <ステージ>

フォルダ名はskill-packageで固定となっているみたいで、そのフォルダの配下にスキルの情報が生成される。もともとskill-packageフォルダが存在している状態で、このコマンドを実行すると、既にフォルダが存在していると言われエラーとなる。

スキルプロジェクトフォルダ
c:\
└─skillproject
   ├─lambda
   │  └─lambdacustom
   │     │  index.js
   │     │  local-debugger.js
   │     │  package-lock.json
   │     │  package.json
   │     │  util.js
   │     │  
   │     └─node_modules
   │         │      :
   │                  
   └─skill-package
      │  skill.json
      │  
      ├─assets
      │  └─images
      │          ja-JP_largeIconUri.png
      │          ja-JP_smallIconUri.png
      │          
      └─interactionModels
          └─custom
                 ja-JP.json

スキルプロジェクトを初期化する

ask init

このコマンドによりスキルのデプロイに使用するask-resources.json.ask\ask-states.jsonファイルを作成できる。
最も一般的なアトリビュートが網羅されており、エンドポイントとしてAWS Lambdaを使用して目的に合ったデフォルト値を提案します。とマニュアルには記載されている。

PS C:\skillproject> ask init
This utility will walk you through creating an ask-resources.json file to help deploy
your skill. This only covers the most common attributes and will suggest sensible
defaults using AWS Lambda as your endpoint.

This command is supposed to be running at the root of your ask-cli project, with the
Alexa skill package and AWS Lambda code downloaded already.
- Use "ask smapi export-package" to download the skill package.
- Move your Lambda code into this folder depending on how you manage the code. It can
be downloaded from AWS console, or git-cloned if you use git to control version.

This will utilize your 'default' ASK profile. Run with "--profile" to specify a
different profile.

Press ^C at any time to quit.

? Skill Id (leave empty to create one):  amzn1.ask.skill.64f3c973-xxxx-xxxx-xxxx-4403c381e7b9
? Skill package path:  ./skill-package
? Lambda code path (for default region):  ./lambda/lambdacustom/
? Use AWS CloudFormation to deploy Lambda?  No
? Lambda runtime:  nodejs10.x
? Lambda handler:  index.handler
  • スキルIDを入力する。
  • スキルパッケージのパスを入力する。skill-package であればデフォルトのままでOK。
  • Lambda関数のパスを入力する。ここはフォルダ名を変更しているため、手入力する。
  • AWS CloudFormationを使用する場合はY使用しない場合はNを入力する。
  • Lambda関数のランタイムのバージョンを選択する。
  • Lambda関数のハンドラーを選択する。

AWS CloudFormationは使ったことがなかったのでNにした。Yにした場合は、CloudFormationで使用するYAML(skill-stack.yaml)が生成され、そしてlambda-deployerではなく、cfn-deployerとなる。

ランタイムバージョン、ハンドラはLambda関数の設定画面で確認できるので同じものを設定する。
Lambda関数のランタイムバージョン

全ての項目に答えたら、ENTERをクリックすると以下が表示される。

Writing to C:\skillproject\ask-resources.json:
{
  "askcliResourcesVersion": "2020-03-31",
  "profiles": {
    "default": {
      "skillMetadata": {
        "src": "./skill-package"
      },
      "code": {
        "default": {
          "src": "./lambda/lambdacustom/"
        }
      },
      "skillInfrastructure": {
        "type": "@ask-cli/lambda-deployer",
        "userConfig": {
          "runtime": "nodejs10.x",
          "handler": "index.handler"
        }
      }
    }
  }
}

Writing to C:\skillproject\.ask\ask-states.json:
{
  "askcliStatesVersion": "2020-03-31",
  "profiles": {
    "default": {
      "skillId": "amzn1.ask.skill.64f3c973-xxxx-xxxx-xxxx-4403c381e7b9",
      "skillInfrastructure": {
        "@ask-cli/lambda-deployer": {
          "deployState": {}
        }
      }
    }
  }
}

? Does this look correct? 

ask-resources.json.ask\ask-states.jsonファイルを生成するが内容が正しいかと聞かれる。正しいかわからないけど、Lambda、スキルパッケージのパスとスキルIDが正しいことぐらいは確認して、Yを入力してENTERを押す。

? Does this look correct?  Yes
Project bootstrap from deployer "@ask-cli/lambda-deployer" succeeded.

Success! Run "ask deploy" to deploy your skill.

ask-resources.json.ask\ask-states.jsonファイルが生成され、v2 用のスキルプロジェクトが完成。

c:\
└─skillproject
   │  ask-resources.json  
   │  
   ├─.ask
   │      ask-states.json
   │  
   ├─infrastructure
   │  └─lambda-deployer    
   │  
   ├─lambda
   │  └─lambdacustom
   │     │  index.js
   │     │  local-debugger.js
   │     │  package-lock.json
   │     │  package.json
   │     │  util.js
   │     │  
   │     └─node_modules
   │         │      :
   │                  
   └─skill-package
      │  skill.json
      │  
      ├─assets
      │  └─images
      │          ja-JP_largeIconUri.png
      │          ja-JP_smallIconUri.png
      │          
      └─interactionModels
          └─custom
                 ja-JP.json

スキルをデプロイする

メッセージ的には、Run "ask deploy" と表示されるので、このままデプロイしたいところだけど、このままやると、新規でLambda関数が作成されてしまう。既存のスキルに影響しないという利点はあるが、現在、使用しているスキルのLambda関数を継続して使用したいのであればask-states.json"deployState"にiamRoleのarnとlambdaのarnを追記する。

          "deployState": {
            "default": {
              "iamRole": "arn:aws:iam::032972243388:role/ask-lambda-xxxxxxx",
              "lambda": {
                "arn": "arn:aws:lambda:us-east-1:032972243388:function:ask-custom-xxxxxxx-default",
                "lastModified": "",
                "revisionId": ""
              }
            }
          }

で、デプロイすると、今までのLambda関数が上書きされるようになる。
テキストエディタなどでファイルを編集する場合、ファイルを開きっぱなしでロックされた状態のままだとデプロイできないので、編集したらファイルは閉じておく。

ask deploy

スキルをテストする

スキルが動作するかテストする。

おわりに

けっこう簡単にできると思う。
Lambda関数をデプロイする際に、AWS CloudFormationを使用する場合は、マイグレーションするよりも、セットアップしちゃった方が良いかもしれないと思った。CloudFormationの.yamlを生成してくれるから。

参考

関連

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2