【初心者向け】LambdaでAlexaカスタムスキルと連携する関数を作成

#Lambdaで関数を作成
##AWS Lamdaで関数の作成手順

前の記事：[Alexaでカスタムスキルを作成する](https://qiita.com/kurisaka/items/24f5dfe54d718e33c1c2)
 
###AWSのサービス一覧から「Lambda」を選択
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/8b1086ea-874c-e37a-2791-e3d79805ba05.png)

###Lambdaトップ画面より「関数の作成」を押下
![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/1dd290a0-44b2-bc01-ecd7-b804ca331963.png)


###関数の基本情報を設定
-  「一から作成」を選択
-  「関数名」を入力　→今回は"sampleFunction"としました
- 「ランタイム」では「Python3.8」を選択
- 「関数の作成」を押下
![1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/3526d849-2ee0-2bd9-c558-8205556bc69a.png)

###作成成功メッセージ
作成が成功すると上部にメッセージが表示され、コード入力画面が表示されます
![1-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/c67a6124-183a-109b-0577-176104eea0a3.png)

###関数を作成
関数コードに動作が確認可能なサンプルコードを入力します

```python:lambda_function.py
import json
import base64

def lambda_handler(event, context):
    
    if event['request']['type'] == "IntentRequest":
        # トークンを取得してピリオドで分割
        token = event['session']['user']['accessToken'].split('.')
        # トークンをデコードしてjson形式へ
        payload =json.loads(base64.urlsafe_b64decode(token[1] + '=' * (-len(token[1]) % 4)).decode(encoding='utf-8'))
        session_attributes = {}
        card_title = "こんにちは。あなたのIDは" + payload['username'] + "です"
        speech_output = "こんにちは。あなたのIDは" + payload['username'] + "です"
        reprompt_text = "こんにちは。あなたのIDは" + payload['username'] + "です"

        should_end_session = True
        
        return build_response(session_attributes, build_speechlet_response(
            card_title, speech_output, reprompt_text, should_end_session))
            
    else:
        session_attributes = {}
        card_title = "サンプルスキルを開きました"
        speech_output = "サンプルスキルを開きました"
        reprompt_text = "サンプルスキルを開きました"
    
        should_end_session = False
        
        return build_response(session_attributes, build_speechlet_response(
            card_title, speech_output, reprompt_text, should_end_session))
        
def build_response(session_attributes, speechlet_response):
    return {
        'version': '1.0',
        'sessionAttributes': session_attributes,
        'response': speechlet_response
    }

def build_speechlet_response(title, output, reprompt_text, should_end_session):
    return {
        'outputSpeech': {
            'type': 'PlainText',
            'text': output
        },
        'card': {
            'type': 'Simple',
            'title': "SessionSpeechlet - " + title,
            'content': "SessionSpeechlet - " + output
        },
        'reprompt': {
            'outputSpeech': {
                'type': 'PlainText',
                'text': reprompt_text
            }
        },
        'shouldEndSession': should_end_session
    }
```
![1-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163917/3addd7e2-dd45-5215-1ddf-8d08a3032c58.png)

###次の記事
* [LambdaとAlexaを連携させてカスタムスキルの完成](https://qiita.com/kurisaka/items/e8dcadb94053a7ddc266)

###関連記事
* [Alexaカスタムスキルを作成してCognitoのユーザープールとアカウントリンクする手順](https://qiita.com/kurisaka/items/8dda3fef0d1eb2662f05)
* [Cognitoで認証情報を保存するユーザープール作成](https://qiita.com/kurisaka/items/7235d058211367aaa96f)
* [AlexaとCognitoをアカウントリンクして認証情報をLambda関数で利用できるように修正](https://qiita.com/kurisaka/items/6404f49b4d5134ee8e74)