Clova Skill開発 with AWS Lambda: その１ LambdaとAPI Gatewayの設定編

## 概要
Clovaスキルを制作するにあたって、Clovaから送られてくるRequestを処理しResponseを返すwebhook部分をAWSのLambdaで実装する方法を記載したいと思います。

Clovaスキルのロジック処理だけでなく、LINE Messaging APIのロジック処理をLambdaで実装する方法を数回に分けて説明したいと思います。

今回は、ClovaスキルからアクセスするAWSのLambda、API Gatewayの設定を説明したいと思います。

今回行うこと

- AWSの設定
	- Lambdaの設定
	- API Gatewayの設定


## AWSの設定

### Lambdaの設定

AWSデベロッパーコンソールにログインして、AWS Lambdaのページを開きます。

作成するLambdaのリージョンを指定する必要があるので、今回は「東京（ap-northeast-1)」を選択します。

「関数の作成」をクリックして新規のLambda関数を作成します。

![img_01.png](https://qiita-image-store.s3.amazonaws.com/0/112736/780b3a0f-c0ce-4c7c-c9c7-616359853345.png)


「一から作成」を選択

- 関数名：「myClovaTest」
- ランタイム：「Node.js 8.10」
- 実行ロールの選択または作成：「基本的なLambdaアクセス権限で新しくロールを作成」

※ 実行ロールは、実際には使用用途によって事前にIAMなどから制作して該当のロール指定する様にしたほうが良いですが、今回は割愛します。  
※ ランタイムはasync/awaitを使用したいのでNode.js 8.10を指定します。

上記、設定をして「関数の作成」をクリックします。

![img_02.png](https://qiita-image-store.s3.amazonaws.com/0/112736/1f586faf-49d7-cb33-f78d-4dea06ed32ba.png)


「myClovaTest」という名前のLambda関数が作成されました。画面左上のARNがこのLambda関数にアクセスするためのアドレスになります。（※Alexaスキルなどの場合はこのARNをwebhookに指定しますが、今回はClovaスキルからのアクセスになるので、以下で説明しますがAPI Gatewayを介して作成したLambdaにアクセスすることになります。）

![img_03.png](https://qiita-image-store.s3.amazonaws.com/0/112736/5ba82262-d61e-ccdc-d6b0-4e10b548c49c.png)


Clovaスキルからアクセスするためには、今回作成したLambdaに直接アクセスするのではなく、AWS API Gatewayを介してLambdaにアクセスします。ではAPI Gatewayの設定に移っていきます。

### API Gatewayの設定

AWSデベロッパーコンソールの「サービス」から「API Gateway」を入力し「API Gateway」のページを開きます。

作成したLambdaのリージョンと合わせて、こちらもリージョンを「東京（ap-northeast-1)」が選択されているか確認します。

「APIの作成」をクリックして新規のLambda関数を作成します。

![img_04.png](https://qiita-image-store.s3.amazonaws.com/0/112736/bf6d892b-ba74-d73e-a006-231251d7fcc2.png)
![](./Clova Skill開発 with AWS Lambda No.1/img_04.png)

#### APIの作成

APIの各項目を設定してAPIを作成します。

- Choose the protocol:「RESET」
- 新しいAPIの作成：「新しいAPI」
- 名前と説明
	- API名：「myClovaTestAPI」※わかりやすい任意のAPIの名前
	- 説明：このAPIの任意の説明
	- エンドポイントタイプ：「リージョン」

「APIの作成」をクリック

![img_05.png](https://qiita-image-store.s3.amazonaws.com/0/112736/0530b16d-f973-7155-22fc-9997649f38db.png)


#### リソースの作成

「アクション」＞「リソースを作成」

- プロキシリソースとして設定: チェックしない
- リソース名：api
- リソースパス：/api
- API Gateway CORSを有効にする：チェック

「リソースの作成」をクリック

![img_06.png](https://qiita-image-store.s3.amazonaws.com/0/112736/deb8e284-a50d-1e9b-6818-c8023cd7bc4f.png)


#### メソッドの作成

「/api」を選択して「アクション」＞「メソッドを作成」

- プルダウン：POST（を選択して有効化）

/api - POST セットアップ

- 統合タイプ：Lambda関数
- Lambda プロキシ統合の使用：チェック
- Lambda リージョン：ap-northeast-1（※上記で作成したLambdaのリージョンを指定）
- Lambda 関数：myClovaTest （※上記で作ったLambda関数の名前）
- デフォルトのタイムアウトの使用：チェック

「保存」をクリック

![img_07.png](https://qiita-image-store.s3.amazonaws.com/0/112736/436becc8-a628-b7ce-2dc0-a4f8693d3216.png)

「API Gatewayに、Lambda関数を呼び出す権限を与えようとしています」とのウィンドウが表示されるので「OK」をクリック。

![img_08.png](https://qiita-image-store.s3.amazonaws.com/0/112736/64d40149-c311-5a58-e68d-e346d1732676.png)


#### ステージの作成とAPIのデプロイ

リソースメニューの「/api」＞「POST」を選択「アクション」＞「APIのデプロイ」をクリック

![img_09.png](https://qiita-image-store.s3.amazonaws.com/0/112736/c8a2f257-5e0b-ab1a-a0e9-7bc388cefc8b.png)

■ ステージの作成

- デプロイされるステージ：「新しいステージ」
- ステージ名：「production」※任意の名前
- ステージの説明：ステージの説明
- デプロイメントの説明：デプロイメントの説明

「デプロイ」をクリック

![img_10.png](https://qiita-image-store.s3.amazonaws.com/0/112736/c8cda33f-3980-256c-18c7-f4ab6afac9bf.png)


ステージエディターにURLが表示されます

以下の様に作成したproductionステージの画面に遷移します。

URLの呼び出し：``https://xxxxxxxxxxxxxxxx.ap-northeast-1.amazonaws.com/production`` という様に表示されています。

![img_11.png](https://qiita-image-store.s3.amazonaws.com/0/112736/090280ac-b5d3-2f7a-6ce8-9c744e63e307.png)



実際にClovaからアクセスするアドレスは「メソッドの作成」で作成した「/api」にPOSTアクセスするので``https://xxxxxxxxxxxxxxx.ap-northeast-1.amazonaws.com/production/api``というようにメソッドを設定した「api」を末尾につけて上げる必要があります。

「ステージ」＞「production」クリック ＞ 「/api」＞「POST」をクリックして、URLの呼び出しを確認してみます。

![img_12.png](https://qiita-image-store.s3.amazonaws.com/0/112736/3d62f2dd-0cb6-9f63-723c-8fc2e7b2addc.png)


URLの呼び出しが ``https://xxxxxxxxxxxxxxx.ap-northeast-1.amazonaws.com/production/api`` になって、作成した「/api」がついたURL担っています。後術するClovaスキルの設定で「ExtensionサーバーのURL」には、このURLをしてするので、メモしておきましょう。

### LambdaがAPI Gatewayと連携できているかの確認

以上でLambdaとAPI Gatewayの設定が完了しました。実際にLambdaとAPI Gatewayが連携できているか、作成した「myClovaTest」のLamdbaのコンソールページに移って確認してみます。

以下の様の、「myClovaTest」に「API Gateway」が追加されていれば無事連携出来ています。

![img_13.png](https://qiita-image-store.s3.amazonaws.com/0/112736/f11e9cb4-bf3b-84f7-2aca-e052832c8f03.png)


## まとめ

ClovaスキルからアクセスするAWSのLambdaとAPI Gatewayの設定を説明させていただきました。次回の[Clova Skill開発 with AWS Lambda: その２ Clovaスキルの設定編](https://qiita.com/rinpa/items/4c846a37f856388cc65b)でClovaスキルから今回設定したLambdaにAPI Gatewayを介してアクセスするClovaスキル設定について書きたいと思います。