カスタムスキル用の AWS Lambda関数の作成

(2017.4.16時点の翻訳です）


Creating an AWS Lambda Function for a Custom Skill
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/developing-an-alexa-skill-as-a-lambda-function

# カスタムスキル用の AWS Lambda関数の作成

カスタムAlexaスキルのためのクラウドベースのサービスを構築する最も簡単な方法は、Amazon Web ServicesのAWS Lambdaを使用して、コードを必要に応じて実行し、自動的に拡張するため、サーバーをプロビジョニングまたは継続的に実行する必要はありません。 AlexaスキルのコードをLambda関数にアップロードし、Lambdaが残りの処理を行い、Alexaの音声対話に応答して実行し、自動的に計算リソースを管理します。


# 目次

- About Lambda Functions and Custom Skills
- Creating a Lambda Function for an Alexa Skill
- Defining a New Role for the Function
- Test a Lambda Function in the Console
- Configuring the Alexa Skills Kit Trigger
- Sample Interaction Model for the Color Expert Blueprint
- Intent Schema
- Custom Slot Type
- Sample Utterances
- Next Steps


## About Lambda Functions and Custom Skills


サービスにラムダ（Lambda）機能を使用すると、独自のエンドポイントの設定と管理に関する複雑さが解消されます。


- サーバーを管理する必要はありません。
-  SSLサーバ証明書もいりません。
- Alexaサービスからのリクエストであることを確認する必要はありません。関数を実行するためのアクセス権限はAWSによって制御されます。（補足：AWSのセキュリティグループのようなことを言ってるらしい）
- AWS Lambdaは、必要なときにのみコードを実行し、用途に合わせてスケーリングするので、サーバを構築したり、立ち上げっぱなしにする必要がありません。
- AlexaはTLSを利用してLambdaとの通信を暗号化します。 [AWSセキュリティのベストプラクティス](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Best_Practices.pdf)も参照してください。
- ほとんどの開発者にとって、ラムダフリー層はAlexaスキルをサポートする機能には十分です。毎月100万件の最初のリクエストは無料です。[Lambdaの無料枠](http://aws.amazon.com/lambda/pricing/)は自動的に期限切れになるのではなく、無期限に利用可能であることに注意してください。（補足：EC2の無料枠は1年なので、比べるとLambdaの方がおトク）


AWS Lambdaは、Node.js（JavaScript）、Java、およびPythonで記述されたコードをサポートしています。 AWS LambdaコンソールのインラインコードエディタでJavaScriptコードやPythonコードをコピーしたり編集したり、zipファイルにアップロードすることができます。基本的なテストでは、ラムダコンソールでJSONリクエストを送信することで、手動で関数を呼び出すことができます。


AWSラムダの概要については、「[AWS Lambdaとは?](http://docs.aws.amazon.com/lambda/latest/dg/welcome.html)」を参照してください。



Lambda関数は、同じサービスインタフェースを遵守し、Alexaが送信した3種類の要求を処理する必要があります。 Alexaリクエストの処理の詳細については、[Alexaが送信したリクエストの処理](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/handling-requests-sent-by-alexa)を参照してください。 JSONインターフェイスの詳細については、「[カスタムスキルのJSONインターフェイスリファレンス](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference)」を参照してください。



`注意：Alexa Skillsのlambda機能は、米国東部（北バージニア州）またはEU（アイルランド）地域のいずれかでホストすることができます。これらは、Alexaス Skills Kitがサポートする唯一の地域です。`


このドキュメントでは、カスタムスキル用の新しいLambda関数の作成について説明します。スマートホームスキルAPIを使用している場合は、Lambdaを使用してスキルアダプタを作成します。 [Alexa Smart Homeスキルを作成する手順](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/steps-to-create-a-smart-home-skill)を参照してください。


## Creating a Lambda Function for an Alexa Skill



Lambdaコンソールを使用して新しいLambda関数を作成し、基本的なテストを行います。`blueprint(Lambda関数の設計図のことか）`を使用して、Node.jsまたはPythonで簡単なスキルを実装する基本機能用のコードで新しい関数を作成することができます。あるいは、`blueprint`のステップをスキップして、Lambda関数を最初から作成することもできます。


Javaでサービスをコーディングしたいが、まだJavaプロジェクトをセットアップしていない場合は、[サンプルの1つ](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/deploying-a-sample-skill-to-aws-lambdaを関数の開始点として使用)することができます。

新しいLambda関数を作成するには:

１. まだAWSにアカウントをお持ちでない場合は、Amazon Web Servicesにアクセスしてアカウントを作成してください。

２. AWS Management Consoleにログインし、AWS Lambdaに移動します。
コンソールの右上隅にあるリージョンのドロップダウンをクリックし、US East（N. Virginia）またはEU（Ireland）のいずれかを選択します。

３. Alexaスキルのラムダ機能は、米国東部（N.バージニア州）またはEU（アイルランド）地域のいずれかでホストする必要があります。

４. Lambda関数がまだ一つも無い場合は、「今すぐ開始」をクリックします。それ以外の場合は、「Lambda関数の作成」をクリックします。

５. Node.jsまたはPythonでサンプルコードを開始するには、Alexa Skills Kitの`blueprint`のいずれかを選択します。

- alexa-skill-kit-sdk-factskill
- alexa-skill-kit-sdk-triviaskill
- alexa-skills-kit-color-expert
- alexa-skill-kit-sdk-howtoskill
- alexa-skills-kit-color-expert-python

`tip: 設計図のフィルター機能でalexaと入力すると一覧が出ます`
[GithubのAlexaまとめにはもっと沢山のサンプルがあります.](https://github.com/alexa)

６. トリガーを設定するように求められたら、ボックスをクリックしてAlexa Skills Kitを選択し、次へをクリックします。

７. Lambda関数の名前と説明を記入します。

８. 実行時に使用する言語（Node.js、Java、Python）を選択します。

- Javaを選択した場合は、Javaコードもzipファイルにアップロードする必要があります。
- Lambda関数が保存された後では、言語を変更することはできません。

９. Lambda関数のロールを選択します。これは、関数がアクセスできるAWSリソースを定義します。

- 既存のロールを使用するには、[既存のロールを使用する]で、ロールを選択します。
- 新しいロールを作成するには、「関数の新しいロールを定義する」を参照してください。

>（補足）以下は「既存のロール」の指定画面です。
>**Lambda_basic_execution**一択のはず。
>
>![lambda_role.png](https://qiita-image-store.s3.amazonaws.com/0/173392/c3f40326-cc57-909a-6474-1bfbab701b3a.png)


１０. [レビュー]ページで、[トリガ]セクションに「Alexa Skills Kit」が含まれていることを確認します。

１１. [関数の作成]をクリックして、新しい関数を保存します。

１２. コンソールでLambda関数をテストするには、以下を参照してください。

自分のコードを追加する準備ができたら、lambda関数を編集して[コード]タブを選択します。ここから、次のいずれかを実行できます。:

- Lambdaコンソール（Node.jsまたはPython）のコードエディタでコードを直接記述します。
- コードをオフラインで書いて、それをコピーしてLambdaコンソールエディタ（Node.jsまたはPython）に貼り付けます。
- コードをオフラインで作成し、zipファイル（Node.js、Python、Java）のLambda関数にアップロードします。
- Eclipse IDEおよび[AWS Toolkit for Eclipse（Java）](https://aws.amazon.com/eclipse/)を使用します。詳細については、[Toolkit for EclipseでのAWS Lambdaの使用](http://docs.aws.amazon.com/AWSToolkitEclipse/latest/GettingStartedGuide/lambda.html)を参照してください。

### <font color=orange>Defining a New Role for the Function</font>


ロールは、Lamnda関数がアクセスできるAWSリソースを指定します。Lamnda関数の設定中に新しい役割を作成するには：


- ロール（lambda関数ハンドラとロールの下）で、テンプレートから新しいロールを作成を選択します。
- ロール名を入力します
- [ポリシーテンプレート]リストから、[シンプルマイクロサービスのアクセス許可]を選択します。

## Test a Lambda Function in the Console


Alexaが送信したリクエストと同じ方法でフォーマットされたサンプルJSONイベントを送信することで、LambdaコンソールのLambda関数を手動でテストできます。サンプルイベントは、コンソール内でテストするために提供されています。これらのイベントを開始点として使用して、Alexaサービスが独自の機能に送信する要求を表すように変更することができます。 [AWS CLI](http://aws.amazon.com/cli/)を使用して、ラムダ関数にイベントを送信することもできます。


JSONインターフェイスの詳細については、[カスタムスキルのJSONインターフェイスリファレンス](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/alexa-skills-kit-interface-reference)を参照してください。


１. 関数リストで関数名をクリックして、関数の詳細を開きます。
２. [アクション]、[テストイベントの設定]の順にクリックします。
３. サンプルイベントテンプレートの一覧から、サンプルのAlexaリクエストの1つを選択します。

- Alexa Start Session
- Alexa Intent - MyColors
- Alexa End Session


これらの3つのAlexaサンプルイベントは、alexa-skill-kit-color-expertおよびalexa-skill-kit-color-expert-pythonの設計図で提供されるコードに対応するリクエストを送信します。

これらの要求の1つをそのまま送信することも、別のintentとslotの値をテストするためのstarting pointとして使用することもできます。

４. submitを押します。



テストイベントを設定したら、[テスト]をクリックすると同じリクエストが送信されます。別のイベントを構成するには、「アクション」をクリックしてから「テスト・イベントを構成」をクリックします。


```
ヒント：
エラーが発生した場合は、テストイベントが有効なAlexaリクエストであることを確認してください。 
[アクション]、[テストイベントの設定]の順にクリックし、
Alexaイベントの1つ、
Alexa Startセッション、
Alexa Intent  -  MyColors、
またはAlexa End Sessionのいずれかを選択します。
他のサンプル（Hello Worldなど）を選択しても機能しません。
```


関数が実行されると、実行結果セクションにJSON形式で関数から返された応答が表示されます。サンプルイベントボックスに貼り付けられたリクエストに適した応答が表示されます。たとえば、`LaunchRequest`の場合、サンプルは次のような応答を返します。

```json:sample
{
  "version": "1.0",
  "sessionAttributes": {},
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "Welcome to the Alexa Skills Kit sample, Please tell me your favorite color by saying, my favorite color is red"
    },
    "card": {
      "type": "Simple",
      "title": "SessionSpeechlet - Welcome",
      "content": "SessionSpeechlet - Welcome to the Alexa Skills Kit sample, Please tell me your favorite color by saying, my favorite color is red"
    },
    "reprompt": {
      "outputSpeech": {
        "type": "PlainText",
        "text": "Please tell me your favorite color by saying, my favorite color is red"
      }
    },
    "shouldEndSession": false
  }
}
```


実行ログセクションには、コードによって生成されたログメッセージが表示されます。このサンプルでは、​​リクエストの種類ごとにログメッセージが書き込まれるため、次のようなメッセージが表示されます。

```text

2015-05-18T23:53:22.357Z    0f885f98-fdb9-11e4-80af-1b9f8363b496    onIntent requestId=amzn1.echo-api.request.6919844a-733e-4e89-893a-fdcb77e2ef0d, sessionId=amzn1.echo-api.session.abeee1a7-aee0-41e6-8192-e6faaed9f5ef
```
## Configuring the Alexa Skills Kit Trigger


Alexa skills kitのトリガを設定すると、Alexaはlambda関数に必要な起動権限を与えます。
Lambda関数の作成中にトリガを設定した場合は、これらの手順をスキップできます。

１.AWS Management Consoleにログインし、AWS Lambdaに移動します。
２.リスト内の機能をクリックして、設定の詳細を開きます。
３.「トリガー」タブを選択します。
４.[トリガーの追加]をクリックします。
５.outlined (概要？) のボックスをクリックし、Alexa skills kitを選択します。
６.サブミットを選択します。

悪意のあるアクセスからあなたのLambda関数を保護するために、呼び出し権限をAlexaだけに制限することを強くお勧めします。

## Sample Interaction Model for the Color Expert Blueprint

alexa-skills-kit-color-expertまたはalexa-skill-kit-color-expert-pythonの設計図を使用してLambda関数を作成した場合は、Alexa対応デバイスまたはService Simulatorでサンプルスキルをテストすることができます。これを行うには、[デベロッパーポータルにスキルを登録し](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/registering-and-managing-alexa-skills-in-the-developer-portal)、スキルのinteraction model を提出しておく必要があります。


サンプルの非常に簡単なinteraction modelを以下に示します。デベロッパーポータルのスキル登録画面の、[interaction model]ページの[Intent Schema]入力欄と[Sample Utterances]入力欄に、この情報をコピーしてください。

### <font color=orange>Intent Schema</font>

```json
{
  "intents": [
    {
      "intent": "MyColorIsIntent",
      "slots": [
        {
          "name": "Color",
          "type": "LIST_OF_COLORS"
        }
      ]
    },
    {
      "intent": "WhatsMyColorIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    }
  ]
}
```

### <font color=orange>Custom Slot Type</font>

Create a type called `LIST_OF_COLORS` and paste in the following values:

```text
green
red
blue
orange
gold
silver
yellow
black
white
```



### <font color=orange>Sample Utterances</font>

```text

WhatsMyColorIntent what's my favorite color
WhatsMyColorIntent what is my favorite color
WhatsMyColorIntent what's my color
WhatsMyColorIntent what is my color
WhatsMyColorIntent my color
WhatsMyColorIntent my favorite color
WhatsMyColorIntent get my color
WhatsMyColorIntent get my favorite color
WhatsMyColorIntent give me my favorite color
WhatsMyColorIntent give me my color
WhatsMyColorIntent what my color is
WhatsMyColorIntent what my favorite color is
WhatsMyColorIntent yes
WhatsMyColorIntent yup
WhatsMyColorIntent sure
WhatsMyColorIntent yes please
MyColorIsIntent my favorite color is {Color}
```

## Next Steps

- Next: [Handling Requests Sent by Alexa](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/handling-requests-sent-by-alexa)
- Go back to: [Registering and Managing Custom Skills in the Developer Portal](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/registering-and-managing-alexa-skills-in-the-developer-portal)
- Return to: [Steps to Build a Custom Skill](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/overviews/steps-to-build-a-custom-skill)

For additional Node.js and Java samples you can use with Lambda, see:

- [Using the Alexa Skills Kit Samples (Custom Skills)](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/using-the-alexa-skills-kit-samples)
- [Deploying a Sample Custom Skill to AWS Lambda](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/deploying-a-sample-skill-to-aws-lambda)
- [Alexa Skills Kit SDK for Node.js](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs)
- [Alexa GitHub organization](https://github.com/alexa)