Alexaプログラムをlambda-localを使ってローカル実行する方法

# 1. はじめに
今回は、自分への備忘録も兼ねて、[lambda-local](https://github.com/ashiina/lambda-local)を用いて、Alexaプログラム（Node.js）をローカル環境で実行する方法をお伝えします。
Alexaプログラムに限らず、簡単なLambda関数であればローカル実行できると思いますで、参考にしてください。

## 参考文献
今回の記事は、以下のサイトを参考に、2019年1月時点の開発環境にアレンジし、まとめたものとなります。

- [Alexaのためのローカル開発環境を整備する](https://thinkit.co.jp/article/15144?page=0%2C1)

## 1-1. この記事を読んでできること
- **lambda-localを使ってAlexaプログラム（Node.js）をローカル環境で実行できるようになる。**

## 1-2. 前提条件
- nodeコマンドがローカル環境にインストールされていること。
- npmコマンドがローカル環境にインストールされていること。
- Alexaスキルをローカル環境で作成（ask new）できること。

## 1-3. 注意事項
- 特になし。

# 2. lambda-localモジュールのインストール
- ローカル環境でLambda関数（Node.js）を実行するために、npmコマンドを利用しlambda-localをインストールします。

```shell:コマンドライン
#lambda-localのインストール
$ npm install -g lambda-local

```

# 3. テスト用Request JSONの作成
- AlexaプログラムへのリクエストJSONを作成します。
- 作成場所は、index.jsと同じフォルダ階層に「test」フォルダを作成し、「test」フォルダ内に「LaunchRequest.json」ファイルを作成します。
- 今回のRequest JSONは、「ローンチリクエスト（LaunchRequest）」となりますが、JSONの記述を変えることで「インテントリクエスト」や「セッションエンドリクエスト」などにも対応することができます。

```JSON:LaunchRequest.json
{
  "version": "1.0",
  "session": {
    "new": true,
    "sessionId": "session0001",
    "application": {
      "applicationId": "amzn1.echo-sdk-ams.app.0001"
    },
    "attributes": {},
    "user": {
      "userId": null
    }
  },
  "request": {
    "type": "LaunchRequest",
    "requestId": "request0001",
    "timestamp": "2018-08-11T13:04:56+0900"
  }
}

```

# 4. 必要モジュールのインストール
- ローカル環境でLambda関数（Node.js）を実行するために、npmコマンドを利用し、利用しているモジュールをインストールします。

```shell:コマンドライン
#package.jsonファイルがある場合、package.jsonと同じフォルダ内で実行
#node_modulesフォルダが自動作成され、利用しているモジュールがインストールされる
$ npm install

```

```shell:コマンドライン
#package.jsonファイルがない場合、index.jsと同じフォルダ内で実行
#package.jsonファイルの作成
$ npm init

#利用しているモジュールのインストール
#例：ask-sdk
#node_modulesフォルダが自動作成され、モジュールがインストールされる
$ npm install ask-sdk

```

# 5. Alexaスキルのフォルダ構成

- プロジェクト名：hello-world

```text:ディレクトリおよびファイル構成図
custom/
  ├─ node_modules/
  |  └─ ask-sdk（など）
  ├─ test/
  |  └─ LaunchRequest.json
  ├─ index.js
  ├─ package.json
  └─ package-lock.json
```

# 6. Alexaプログラムのローカルテスト実行
- index.jsと同じフォルダ階層内から、lambda-localコマンドを実行する。

```shell:コマンドライン
$ lambda-local -l index.js -h handler -e ./test/LaunchRequest.json
info: START RequestId: 99999999-9999-9999-9999-999999999999
info: End - Message
info: ------
info: {
        "version": "1.0",
        "response": {
                "outputSpeech": {
                        "type": "SSML",
                        "ssml": "<speak>Welcome to the Alexa Skills Kit, you can say hello!</speak>"
                },
                "reprompt": {
                        "outputSpeech": {
                                "type": "SSML",
                                "ssml": "<speak>Welcome to the Alexa Skills Kit, you can say hello!</speak>"
                        }
                },
                "shouldEndSession": false,
                "card": {
                        "type": "Simple",
                        "title": "Hello World",
                        "content": "Welcome to the Alexa Skills Kit, you can say hello!"
                }
        },
        "userAgent": "ask-node/2.3.0 Node/v10.15.0",
        "sessionAttributes": {}
}
info: ------
info: Lambda successfully executed in 56ms.

```

# 4. おわりに
いかがだったでしょうか？ご参考になりましたでしょうか？
もしかしたら間違ってるよ、とかありましたら、コメント頂けると幸いです。

2019/01/19 TAKAHIRO NISHIZONO