Alexa-hostedスキルでセッション永続性を使用する



Alexa-hostedスキルでセッション永続性を使用する

Alexa-hostedスキルを作成すると、AlexaはコードとリソースをAWSに保存します。Alexa-hostedスキルの詳細については、Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成するを参照してください。

Alexa-hostedスキルを作成すると、セッションの永続性を管理するためにAmazon S3でバックアップされたkey-valueデータにアクセスできます。Amazon S3の使用は無料利用枠内に制限されています。 月あたり、5 GBのストレージ、20,000件のGETリクエスト、2,000件のPUTリクエスト、15 GBのデータ転送を利用できます。Alexa-hostedスキルは、表形式データにAWSでサポートされている暗号方式を使用します。

Alexa-hostedスキルに永続性を追加するには、Node.jsまたはPythonを使用できます。永続性を使用する完全なコードはGitHubのNode.jsの例Pythonの例を参照してください。

Node.jsでセッション永続性を使用する

  1. Node.jsでセッション永続性を使用するには、まずpackage.jsonファイルに次の依存関係を追加します。

    "ask-sdk": "^2.6.0"
    "ask-sdk-s3-persistence-adapter": "^2.0.0"
    
  2. 次に、index.jsファイルに以下のコードを追加します。ask persistence adapterの読み込み

    const AWS = require('aws-sdk');
    const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
    
  3. SesssionEndedRequestHandlerリクエストハンドラーをSkillBuildersハンドラーに追加します。他のリクエストハンドラーは上書きしないでください。

    exports.handler = Alexa.SkillBuilders.custom()
        .addRequestHandlers(
            LaunchRequestHandler,
            //その他のリクエストハンドラー
            SesssionEndedRequestHandler
        )
        .addErrorHandlers(ErrorHandler)
    
        .withPersistenceAdapter(
            new persistenceAdapter.S3PersistenceAdapter({
                bucketName: process.env.S3_PERSISTENCE_BUCKET,
                s3Client: new AWS.S3({apiVersion: 'latest', region: process.env.S3_PERSISTENCE_REGION})
            })
        )
        .lambda();
    
  4. アトリビュートを保存するハンドラーの追加

    async handle(handlerInput)
    {
        const attributesManager = handlerInput.attributesManager;
        let s3Attributes = {"counter":10};
    
        attributesManager.setPersistentAttributes(s3Attributes);
        await attributesManager.savePersistentAttributes();
    
        let speechOutput = `こんにちは、ハローワールド! 保存したカウンターは${s3Attributes.counter}です`;
    
        return handlerInput.responseBuilder
            .speak(speechOutput)
            .getResponse();
    }
    
  5. アトリビュートを取得するハンドラーを追加

    async handle(handlerInput){
    
        const attributesManager = handlerInput.attributesManager;
        const s3Attributes = await attributesManager.getPersistentAttributes() || {};
        console.log('s3Attributes is: ', s3Attributes);
    
        const counter = s3Attributes.hasOwnProperty('counter')? s3Attributes.counter : 0;
    
        let speechOutput = `こんにちは、ハローワールド! カウンターは${counter}です`;
    
        return handlerInput.responseBuilder
            .speak(speechOutput)
            .getResponse();
    }
    

Pythonでセッション永続性を使用する

  1. Pythonでセッション永続性を使用するには、まずrequirements.txtファイルに次の依存関係を追加します。

    boto3==1.9.216
    ask-sdk-core==1.11.0
    ask-sdk-s3-persistence-adapter==1.0.0
    
  2. 次に、lambda_function.pyファイルにコードを追加します。ask persistence adapterの読み込み

    import os
    import boto3
    
    from ask_sdk_s3.adapter import S3Adapter
    from ask_sdk_core.skill_builder import CustomSkillBuilder
    
  3. 永続性アダプターを初期化します。

    bucket_region = os.environ.get('S3_PERSISTENCE_REGION') 
    bucket_name = os.environ.get('S3_PERSISTENCE_BUCKET') 
        
    s3_client = boto3.client('s3', region_name = bucket_region)
    s3_adapter = S3Adapter(bucket_name, s3_client = s3_client)
    
  4. SesssionEndedRequestHandlerリクエストハンドラーをSkillBuildersハンドラーに追加します。他のリクエストハンドラーは上書きしないでください。

    sb = CustomSkillBuilder(persistence_adapter = s3_adapter)
    
    sb.add_request_handler(LaunchRequestHandler())
    sb.add_request_handler(CancelOrStopIntentHandler())
    sb.add_request_handler(SessionEndedRequestHandler())
    #
    #その他のリクエストハンドラー
    #
    sb.add_exception_handler(CatchAllExceptionHandler())
    
    lambda_handler = sb.lambda_handler()
    
  5. アトリビュートを保存するハンドラーの追加

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        attr = handler_input.attributes_manager.persistent_attributes
        if not attr:
            attr['counter'] = 0
            attr['state'] = 'ENDED'
    
        handler_input.attributes_manager.session_attributes = attr
    
        handler_input.attributes_manager.save_persistent_attributes()
        speak_output = ("おかえりなさい。保存されたカウンタは{}です.こんにちは、またはヘルプと言ってください".format(attr["counter"]))
        reprompt = "こんにちは、またはヘルプと言ってください。"
        return (
            handler_input.response_builder
                .speak(speak_output)
                .ask(reprompt)
                .response
        )
    
  6. アトリビュートを取得するハンドラーを追加

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        session_attr = handler_input.attributes_manager.session_attributes
        session_attr['state'] = "STARTED"
        session_attr["counter"] += 1
        handler_input.attributes_manager.persistent_attributes = session_attr
        handler_input.attributes_manager.save_persistent_attributes()
    
        speak_output = ("ハローワールド! 保存されたカウンタは{}です。".format(session_attr["counter"]))
        return (
            handler_input.response_builder
                .speak(speak_output)
                # .ask('ユーザーが応答できるようセッションを開いたままにする場合は再プロンプトを追加してください')
                .response
        )
    
  7. アトリビュートを削除するハンドラーを追加(任意)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        session_attr = handler_input.attributes_manager.session_attributes
        session_attr['state'] = "ENDED"
    
        speak_output = ("さようなら。カウンタは{}です".format(session_attr["counter"]))
    
        handler_input.attributes_manager.delete_persistent_attributes()
        return (
            handler_input.response_builder
                .speak(speak_output)
                .response
        )