Alexaスキルの開発でパッケージを追加する

#はじめに
ローカルPC上でNode.jsでAlexaスキルを開発する際に、必要に応じてパッケージを追加することがあります。
今回は、そのやり方を説明します。
例として、AlexaスキルからDynamoDBにデータ保存するために必要なパッケージである`ask-sdk-dynamodb-persistence-adapter`パッケージをインストールします。

#前提
- npmがインストール済み
- ローカルPC上にAlexaスキルのLambda部分がある


#npmでのパッケージのインストール

DOSプロンプトやPowerShellなどのコマンドラインで、`index.js`があるフォルダへ移動します。
そこには以下のように、`node_modules`フォルダや`package.json`ファイルがあり、もしかしたら`package-lock.json`ファイルもあるかもしれません（画像はExploreのもの）。
それらのファイルやフォルダが存在するフォルダにコマンドライン上で移動してください。`cd`コマンドで。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/9c38b5ce-ce6b-1ec7-5905-8b4bb5f5890b.png)


そこで、`npm install`コマンドを使って、目的のパッケージをインストールします。

```
> npm install --save パッケージ名
```

今回のパッケージは`ask-sdk-dynamodb-persistence-adapter`というパッケージなので、以下のようになります。


```
> npm install --save ask-sdk-dynamodb-persistence-adapter
```

すると、こんな感じでパッケージのインストールが始まります。
![lakdjflkasjflkas.png](https://qiita-image-store.s3.amazonaws.com/0/245438/2c8f3e15-2409-8606-9915-5f3054743573.png)


#確認
インストールが完了すると`node_modules`フォルダ内にインストールしたパッケージのフォルダが作成されているのが確認できます。
また、`package.json`を開いてみると、以下のように該当のパッケージの情報が追加されています。

```json:package.json
{
  "name": "hello-world",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "ask-sdk-core": "^2.0.0",
    "ask-sdk-dynamodb-persistence-adapter": "^2.2.0",
    "ask-sdk-model": "^1.0.0"
  }
}
```

これでパッケージのインストールが完了し、スキルの実装の中で追加したパッケージ内のAPIを使用できるようになりました。

#おわりに
ちなみに、`ask-sdk-dynamodb-persistence-adapter`を追加しておくと、[公式のトレーニング第4回](https://developer.amazon.com/ja/blogs/alexa/post/4144a8ea-7549-4c44-a4bd-e94cb93807ea/chapter4-jp)のチュートリアルのように、DynamoDBにデータを保存することでセッションをまたいだやりとりを実現できます。
楽しくなってきましたね。

#ここから追記
さて、ここまででAWS Lambdaに配置した関数からDynamoDB使えるぜ、と思ったらそうではありませんでした。
この関数のテストを行うと以下のようなエラーメッセージがでるのではないでしょうか。
でないのならば問題はありません。

![sldkjfaslkjdfalsdkfj.png](https://qiita-image-store.s3.amazonaws.com/0/245438/e83c3d81-d385-0c37-e8cb-2daa6d23b7eb.png)


これは、**この関数に割り当てたロールにDynamoDBにテーブルを作る権限が無い**、と怒られています。

ということで、DynamoDBへのアクセス権を持ったロールを作成して、この関数に割り当てます。
##ロールの作成
`lambda_basic_execution`の他に``を持るロールを作成します。
IAMで「ロールの作成」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/5987223f-de86-9da3-3bbe-b25476a60a7a.png)

次に、「このロールを使用するサービスを選択」と表示されるので、「Lambda」を選択して「次のステップ…」ボタンを押します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/c3560afb-d055-9adc-a6a9-c48f2723853b.png)

まずは、「AWSLambdaBasicExecutionRole」選択します。チェックマークをつけます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/b31a9d56-0b98-77a9-399f-681687f47285.png)

次に「AmazonDynamoDBFullAccess」を選択します。
（本当はもっとしっかり限定したほうがいいと思います）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/ac2a921c-4e83-4f99-17cb-751ea6e9ff02.png)

以上2つのポリシーを選択したら、ページ右下の「次のステップ」ボタンを押します。

最後にこの新しいロールの名前を決めて（ここでは「lamda_and_dynamoDB_execution」とします）、ページ右下の「ロールの作成」ボタンを押します。
これでロールが作成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/77752cf8-c9c0-f7d9-aa58-6aaca8cbb7f3.png)


それではAWS Lambdaに戻って、「実行ロール」の項目で先程の作成したロールを選択し、ページ右上の「保存」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/238a48ef-ca3e-a7f1-3d85-66c7a5e22aa2.png)


再びテストを行うと、DynamoDBのアクセス権限が割り当てられているので以下のように正常に動作します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/245438/e595c938-d7f0-3d55-c603-f95f0dbf761c.png)