ASK CLI(v2)でAlexaスキルを作る際の注意点

Alexaスキルを開発するためのコマンドラインツール**ASK (Alexa Skill Kit) CLI**を使う際にいろいろと嵌りましたので、今後迷う方が少なくなるようここにメモを残しておきます。
今回使ったのはWindows版のバージョン2.15.0です。ASK CLIについて検索したときに`ask api`コマンドを使って開発をする記事が多くヒットしてその通り打ち込んだのですが以下のようなエラーになってしまいました。おそらく現在とは古いバージョンの`ask`コマンドについて書かれており、コマンドの引数などが大きく異なっているので注意してください。こういう互換性が大きく変わる変更は開発者を混乱させますね。

```
> ask api
Command not recognized. Please run "ask" to check the user instructions.
```

## ASK CLIのインストール
ASK CLIをインストールするには`npm`コマンドが必要なのでNode.jsをインストールして使えるようにしておきます。`npm`コマンドで以下のを実行してインストールします。

```
npm install -g ask-cli
```

手元の環境で実施したときはすんなりと成功とはいかず以下のようなエラーが出ました。ただ`ask`コマンドは使えるようになり、今のところ正しく動作しているようなので一旦無視することにします。（いいのか？）

```
gyp ERR! UNCAUGHT EXCEPTION
gyp ERR! stack Error: spawn C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\15.0\Bin\MSBuild.exe ENOENT
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:240:19)
gyp ERR! stack     at onErrorNT (internal/child_process.js:415:16)
gyp ERR! stack     at process._tickCallback (internal/process/next_tick.js:63:19)
gyp ERR! System Windows_NT 10.0.18363
gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\jito\AppData\Roaming\npm\node_modules\ask-cli\node_modules\dtrace-provider
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v3.8.0
gyp ERR! This is a bug in `node-gyp`.
gyp ERR! Try to update node-gyp and file an Issue if it does not help:
gyp ERR!     <https://github.com/nodejs/node-gyp/issues>
```

念のため`ask`コマンドが使えるようになったかとバージョンを確認しておきます。2.x 系であることが表示されれば大丈夫だと思います。

```
> ask --version
2.15.0
```

## ASKコマンドの環境設定
[Amazon開発者ポータル](https://developer.amazon.com/ja/)の、どのアカウントで作業をするかを設定します。`ask configure`コマンドを使って出てくるメニューに従って設定をします。

```
> ask configure
```

## Alexaスキルを作る
新しいAlexaスキルは`ask new`コマンドを使用して作成します。メニューに従ってコードを書く言語、スキル名、プロジェクト名を指定してしばらく待つとスキルが作成できます。スキルの定義やコードなどはプロジェクト名のサブフォルダに格納されます。

```
> ask new
? Choose the programming language you will use to code your skill:  NodeJS
? Choose a method to host your skill's backend resources:  Alexa-hosted skills
  Host your skill code by Alexa (free).
? Choose the default locale for your skill:  ja-JP
? Choose the default region for your skill:  us-east-1
? Please type in your skill name:  Hello World Skill
? Please type in your folder name for the skill project (alphanumeric):  HelloWorldSkill
? Creating your Alexa hosted skill. It will take about a minute.

Project directory for Hello World Skill created at
        c:\work\mitoco\PushTest2\HelloWorldSkill

Lambda code for Hello World Skill created at
        ./lambda

Skill schema and interactionModels for Hello World Skill created at
        ./skill-package

Skill is enabled successfully.
Hosted skill provisioning finished. Skill-Id: amzn1.ask.skill.xxx-xxx-xxx-xxx-xxx
Please follow the instructions at https://developer.amazon.com/en-US/docs/alexa/hosted-skills/build-a-skill-end-to-end-using-an-alexa-hosted-skill.html#askcli to learn more about the usage of "git" for Hosted skill.
```

## Alexaスキルの操作
**スキルマニフェスト**はスキルの設定ファイルになります。プロジェクトのフォルダの`skill-package\skill.json`に保存されています。
スキルの設定を変更する場合はこのJSONファイルを変更しますが、スキルに反映するには`ask amapi update-skill-manifest`コマンドでアップデートをかけます。`-s`オプションで更新対象のスキルIDを指定しますがスキルIDはプロジェクトフォルダの.ask\ask-states.jsonに記載されているのでそちらを参照してください。またファイルは`--manifest`オプションで指定しますが、`file:{ファイル名}`のように指定をします。`file:`を頭につけるのが最初わからずに苦労しました。

```
ask smapi update-skill-manifest -s {スキルID} -g development --manifest "file:skill.json"
```

[Alexa Developer Console](https://developer.amazon.com/alexa/console/ask)のほうでスキルの設定を変更した場合はローカルのマニフェストをアップロードするとポータルでの変更が上書きされて消えてしまうので、最新のマニフェストをダウンロードするには`ask amapi get-skill-manifest`を使用します。標準出力にマニフェストの内容がjsonで出力されるのでファイルにリダイレクトして保存します。

```
ask smapi get-skill-manifest -s {スキルID} > skill.json
```

## Lambdaのログが見られないとき
Alexaスキルでインテントに対する処理はLambda関数で作ることが多いと思います。Lambda関数は例えばNode.jsの場合は`console.log()`でログ出力をすることができます。ログはAWSの中にに保存されCloud Watchのロググループから参照することができます。ログはプログラム作成するときのデバッグに非常に役に立つのですが、Lambda関数を**Alexa-hosted skills**を選んで作った場合には、[Alexa Developer Console](https://developer.amazon.com/alexa/console/ask)から**コードエディタ**の左下にある**ログ: Amazon CloudWatch**をクリックするとCloud Watchに飛んでログを見ることができます。
![codeeditor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54031/a86f1f46-8259-c919-d6f4-03559328ec6b.png)
クリックしたときに以下のようなエラーが表示されログが見られないことがあります。

```
ロググループが存在しません
特定のロググループ: /aws/lambda/xxx-xxx-xxx-xxx はこのアカウントまたはリージョンに存在しません。
```

~~公開をしていないスキルの場合は実行されてもログが作成されず上記エラーが表示されるようです。~~（公開かどうかは関係なかったので改訂）この場合は焦らなくてもよく、実際にLambda関数が動作したAWSの別リージョンにログが出力されているはずなので、画面右上のリージョン選択からログのあるリージョンを探します。

![cloudwatch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54031/4539a663-59b8-119e-7050-dc2dceb36f1f.png)

`ask new`でスキルを作成したときに*Choose the default region for your skill*で*us-east-1*を選択していたので、てっきりこのリージョンで動くのかと思っていましたが、Lambda関数は別リージョンで動くこともあるようです。リージョンはたくさんあり探すのが大変です。環境変数AWS_DEFAULT_REGIONに実行中のリージョンが設定されるようなので、こんなLambda関数を書くとどのリージョンで実行されたかが分かるようになります。

```javascript
const LaunchRequestHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
    },
    handle(handlerInput) {
        var region = process.env.AWS_DEFAULT_REGION;
        const speakOutput = 'ハロハロ起動 ' + region;
        return handlerInput.responseBuilder
            .speak(speakOutput)
            .reprompt(speakOutput)
            .getResponse();
    }
};
```

![codetest.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54031/259bd6a2-18a0-caf0-5409-e743319f3a35.png)

ただ、リリース時にリージョン名を読み上げ出力するわけにはいかないので、他の方法としては**スキルマニフェスト**にリージョンの設定のようなものがあるのでこの中のどれかのリージョンを調べれば良いかもしれません。まだ調査中なので追って紹介できればと思います。

この問題の解決方法はこちらを参考にさせていただきました。

* [Lambda@Edgeのログが見つからなくて小一時間焦った話](https://www.skyarch.net/blog/?p=15614)



## おわりに
Alexaスキルを開発するきっかけとしては、Amazon Echoと自社の会話プラットフォームとつないで音声会話でのFAQ回答システムや業務システム操作UIを開発しています。
→  [会話プラットフォームENOKI](https://www.enoki.ifocus-network.com/)

**ASK CLI**は最近使い始めたばかりなので、これからも色々と試してみたいと思います。