Alexa Skill開発ダッシュボードから作成したAlexa Skillをask-cliからデプロイできるようにする

Alexa skill開発ダッシュボードのビルダーがすごく使いやすいので、「コード管理できるならそっちでやりたいなぁ」と思いつつどうしてもGUIで作りたくなります。そして「じゃあGUIで作ったやつが安定したタイミングでa […]

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

目次

    Alexa skill開発ダッシュボードのビルダーがすごく使いやすいので、「コード管理できるならそっちでやりたいなぁ」と思いつつどうしてもGUIで作りたくなります。そして「じゃあGUIで作ったやつが安定したタイミングでask-cli管理にすればいいやん」という発想に至ったのでやってみます。

    GUIからスキルを作る

    このあたりは画面をぽちぽちやりながら頑張ってください。Lambdaはblueprintのもの使ってとりあえずとかでいいと思います。

    ask-cliでプロジェクトを作る

    フォルダ構成などを合わせておきたいので、空プロジェクトを作っておきます。

    $ ask  new -n example
    New project for Alexa skill created.
    $ cd example
    $ tree -L 3
    .
    ├── lambda
    │   └── custom
    │       ├── index.js
    │       ├── node_modules
    │       ├── package-lock.json
    │       └── package.json
    ├── models
    │   └── en-US.json
    └── skill.json
    
    4 directories, 6 files

    ダッシュボードから作ったスキルの情報をインポートする

    それではGUIから作ったデータをask-cliで作ったものに流し込んでいきましょう。

    スキル情報のインポート

    まずはスキル情報をインポートします。

    $ ask api get-skill -s amzn1.ask.skill.xxxxx-xxx-xxx-xxxx > ./skill.json

    これでask-cli側のスキル設定をGUIで作ったものに置き換えることができました。

    AWS Lambdaのソースもask-cliで管理したい場合

    もしLambdaのソースコードもask-cliで管理したい場合、上記の設定では別のLambdaを参照したままになります。そのため、get-skillの戻り値を全て入れるのではなく、.manifest.publishingInformationの値のみskill.jsonへ入れるようにしましょう。

    $ ask api get-skill -s amzn1.ask.skill.xxxxx-xxx-xxx-xxxx
    {
      "manifest": {
        "publishingInformation": {
          "locales": {
            "ja-JP": {
              "name": "ハローアレクサ"
            }
          }
        },
    
    // ここから下はコピペしない
        "apis": {
          "custom": {
            "endpoint": {
              "uri": "arn:aws:lambda:ap-northeast-1:99999:function:example-development-hello"
            },
            "interfaces": []
          }
        },
        "manifestVersion": "1.0"
      }
    }

    対話モデルのインポート

    続いて作成したスロット・インテント・サンプル発話などの対話モデルをインポートします。

    $ ask api get-model -s amzn1.ask.skill.xxxxx-xxx-xxx-xxxx --stage development -l ja-JP > ./models/ja-JP.json

    ※ja-JPの部分は言語によって変わります。

    これでスキル情報と対話モデルのインポートができました。

    Lambdaソースのインポート

    これはソースをどのような形で管理しているかによります。しかし/lambda/custom/配下にデプロイできれば、とりあえずask-cliからデプロイできるようになります。

    $ tree -L 3
    .
    ├── lambda
    │   └── custom
    │       ├── index.js
    │       ├── node_modules
    │       ├── package-lock.json
    │       └── package.json
    ├── models
    

    Lambdaも一緒にデプロイする場合

    IAMの設定などはask-cliからはできない様子です。ですのでAmazon Elasticsearch ServiceやKinesisなど、DynamoDB以外のリソースにLambdaからアクセスさせたい場合はask-cliで管理しない方法を検討することをおすすめします。

    configファイルを編集する

    最後に.ask/configファイルを編集します。.deploy_settings.{YOUR_PROFILE}.skill_idにAlexa SkillのIDを指定しますので、ここをGUIで作成したもののIDに置き換えましょう。

    これを忘れると、新しくデプロイされることになります。もっとも、GUIから作った方を消せばいい話ではありますが・・・

    デプロイする

    ここまでで準備ができたので、デプロイしましょう。ask deployすることでデプロイされます。

    $ ask deploy 
    Command not recognized. Please run "ask" for help.
    -------------------- Update Skill Project --------------------
    Skill Id: amzn1.ask.skill.xxxx-xxxxx-xxxxx-xxxxx
    Skill deployment finished.
    Model deployment finished.
    Lambda deployment finished.
    Your skill is now deployed and enabled in the development stage.
    Try invoking the skill by saying “Alexa, open {your_skill_invocation_name}” or simulate an invocation via the `ask simulate` command.

    AWS Lambdaのソースをデプロイしたくない場合

    -t / --targetオプションでデプロイするものを指定できます。

    $ ask deploy -t skill
    $ ask deploy -t model

    Lambdaのみデプロイしたくない場合、複数選択ができませんので、-t skill-t modelの両方を実行してください。

    Serverless FWとの組み合わせでCDを組むのであれば、おそらくこのような流れになるかと思います。(未検証)

    $ cd YOUR_PROJECT
    
    # スキル情報のデプロイ
    $ ask deploy -t skill
    
    # 対話モデルのデプロイ
    $ ask deploy -t model
    
    # Lamndaコードのフォルダへ移動 
    $ cd lambda/custom
    
    # Serverless FWでデプロイ
    $ sls deploy

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