Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する



Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する

Alexa-hostedスキルを使うと、AlexaがホストするAWSリソースを使ってスキルをすばやく強化することができます。また開発者コンソールのコードエディタを組み合わせて使うことで、AWS Lambdaのコードを編集したり変更をデプロイしたりできます。Alexa-hostedスキルの編集やデプロイに、Alexa Skills Kitコマンドラインインターフェース(ASK CLI)を使うこともできます。

所要時間90分のCake Walkチュートリアルを受けることにより、Alexa-hostedスキルで魅力的なスキルを作成できるようになります。このコースは、Alexa Skills Kit(ASK)と音声ユーザーインターフェイス(VUI)をハンズオン形式で体験したい方を対象としています。

セットアップ

どのようなサービスが含まれますか?
Alexa-hostedスキルでは、スキルの作成、編集、公開がすべて開発者コンソールで完結します。AWS Lambdaエンドポイントを始め、メディアストレージ用のAmazon S3バケット、Amazon S3を使用したセッション永続性管理用のキー値テーブルにアクセスできます。コードエディタを使えば、スキルのバックエンドコードを編集し、AWS Lambdaに直接デプロイできます。スキルを作成すると、サービスによりコード管理用のAWS CodeCommitリポジトリもセットアップされます。ASK CLIを使ってこのリポジトリにアクセスしてスキルを編集できます。
Alexa-hostedスキルにはどうすればアクセスできますか?
Alexa-hostedスキルは、開発者コンソールのスキルの作成ページから作成できます。ページの下に、スキルのバックエンドリソースをホストするオプションが表示されます。Alexaがホストオプションを選択します。スキルを作成すると、音声モデル、AWSリソース、コードエディタが有効になり、開発者コンソールが音声モデルのビルドを開始します。
Alexa-hostedスキルとして作成できるスキルの種類を教えてください。
Alexa-hostedスキルとして作成できるのはカスタムスキルです。Alexa-hostedスキルを使って、スマートホームスキルなどプリビルドモデルを使用したスキルを作成することはできません。
AWSアカウントは必要ですか?
必要ありません。AWSアカウントを使うことなく、Alexa開発者コンソールから直接必要なリソースをプロビジョニングして、Alexaスキルを強化できます。そのほかのAWSサービスを利用する必要がある場合やAWS無料利用枠を超えた場合、追加のリソースのプロビジョニングには独自のAWSアカウントが必要です。
Alexa-hostedスキルはすべてのロケールで利用できますか? リソースとエンドポイントがホストされるのはどのリージョンですか?
Alexa-hostedスキルはすべてのロケールで利用できます。すべてのリソースが米国東部(バージニア北部)地域でホストされます。このため、このリージョンから遠い場所で利用するスキルには、レイテンシーの問題が発生する場合があります。
Alexa-hostedスキルでnpm(Node.js)またはpip(Python)インストールを実行できますか?
Amazonでは、ビルドスクリプトを実行するために、スキルの一部としてAWS CodeBuildをプロビジョニングします。npmまたはpipインストールは、ビルドスクリプトの一部として実行されます。依存関係をpackage.jsonに配置できるためnpmインストールを実行する必要はありません。デプロイボタンをクリックすると、AWS CodeBuildはnpmインストールを実行します。
Alexaは、Alexa-hostedスキルの稼働状況とAWS Lambdaへの接続をどのように確認しますか?
Alexa-hostedスキルからAWS Lambdaへの呼び出しが正しく機能するように、Alexa-hostedスキルのサービスからAWS Lambda関数に可用性チェックが定期的に送信されます。次の例では、LaunchRequestの形式でユーザー情報にalexa-lambda-availabilityが含まれる可用性チェックを示しています。LaunchRequestによってスキルがアクションを実行する場合、ユーザー情報にalexa-lambda-availabilityが含まれるリクエストを除外することで、可用性チェックによってスキルがアクションを実行しないようにします。
{
  "version": "1.0",
  "session": {
    "new": true,
    "sessionId": "alexa-lambda-availability",
    "application": {
      "applicationId": "YOUR_SKILL_ID"
    },
    "user": {
      "userId": "alexa-lambda-availability"
    }
  },
  "context": {
    "AudioPlayer": {
      "playerActivity": "IDLE"
    },
    "System": {
      "application": {
        "applicationId": "YOUR_SKILL_ID"
      },
      "user": {
        "userId": "alexa-lambda-availability"
      },
      "device": {
        "deviceId": "test-device",
        "supportedInterfaces": {
          "AudioPlayer": {}
        }
      },
      "apiEndpoint": "https://api.amazonalexa.com",
      "apiAccessToken": "{token}"
    }
  },
  "request": {
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.alexa.lambda.availability",
    "locale": "ja-JP",
    "shouldLinkResultBeReturned": false
  }
}

使用制限

利用制限はありますか?
AWSの無料利用枠内に制限されています。アカウントごとに次の制限が適用されます。AWS Lambda: 月あたり、100万件のAWS Lambdaリクエスト、320万秒のコンピューティング時間を利用できます。Amazon S3: 月あたり、5 GBのAmazon S3ストレージ、20,000件のGETリクエスト、2,000件のPUTリクエスト、15 GBのデータ転送を利用できます。AWS CodeCommit: 月あたり、50 GBのストレージ、10,000件のGitリクエストを利用できます。
スキルがAWS無料利用枠のしきい値を超えた場合どうなりますか?
AWS無料利用枠の上限を超えると、少なくとも1つのスキルを個人のAWSアカウントまたは別のクラウドサービスアカウントに移動させることで利用量を制限以内に抑えるために30日間の猶予が与えられます。
Alexa-hostedスキルのAmazon S3ストレージの使用状況はどこで確認できますか?
Amazon S3の使用状況は、開発者コンソールのコードエディタタブのメディアストレージに表示されます。使用状況には、セッション永続性用データのストレージなどが含まれます。
自分のdeveloper.amazon.comアカウントに作成できるAlexa-hostedスキルの数を教えてください。
developer.amazon.comアカウントでは、作成できるAlexa-hostedスキルの数は最大75個です。アカウントに75個のAlexa-hostedスキルがある場合、新しい別のAlexa-hostedスキルを作成する前に1個削除する必要があります。個人のAWSアカウント、または他のクラウドサービスアカウントでいくつかのスキルをホストすることを検討してください。

移行

Alexa-hostedスキルを別のサービスに移行するにはどうすればよいですか?
Alexa-hostedスキルを別のサービスに移行するには、開発者コンソールでエンドポイントを変更し、新しいエンドポイントにコードを手動でコピーして貼り付けます。また、Amazon S3でホストしているリソースもすべて移動する必要があります。
既存のスキルの代わりにAlexa-hostedスキルを使うにはどうすればよいですか?
新しいAlexa-hostedスキルを作成してから、そのAlexa-hostedスキルにコンテンツを追加する必要があります。現時点では、既存のスキルをAlexa-hostedスキルに移行することはできません。

プログラム言語

Alexa-hostedスキルでサポートされているプログラミング言語には何がありますか?
Alexa-hostedスキルでは現在、Node.jsバージョン10.xとPythonバージョン3.7をサポートしています。コンソールまたはCLIからスキルを作成すると、スキルの作成時にランタイムを選択できます。一度スキルのランタイムを選択すると、そのランタイムは変更できません。

スキルのリソース

自分のファイルは他のアカウントと共有されますか?
サービスはファイルやリソースを、他のユーザーのアカウントから切り離された個々のアカウントに配置します。開発者コンソールは、個々のアカウントとリソースをアカウント内でプロビジョニングし、管理します。
Alexa-hostedスキルを使用する場合は、メディアファイルや表形式データは暗号化されますか?
はい。Alexa-hostedスキルは、メディアファイルと表形式データにはAmazon S3を使用し、AWSがサポートする暗号方式を使用します。
Alexa-hostedスキルにライブラリや新しい依存関係を追加するにはどうすればよいですか?
依存関係やライブラリは、スキルのAWS Lambdaパッケージ内にあるpackage.jsonファイルに追加できます。デプロイボタンをクリックすると、依存関係が取得されてビルドされます。

ログ

Amazon CloudWatchからAWS Lambdaログにアクセスするにはどうすればよいですか?
Alexa-hostedスキルでは、限定的にAWSコンソールを表示してスキルの開発に重要な情報にアクセスできるようになっています。スキルのAmazon Cloudwatchログにアクセスするには、コードエディターの左下隅にあるLogs: Amazon CloudWatchリンクをクリックします。すると、AWSコンソールの一部が表示され、ログにアクセスできます。

依存関係

スキルに依存関係をインストールするにはどうすればよいですか?
Node.jsを使用してpackage.jsonファイルに依存関係を定義することでインストールできます。コードの例:
"aws-sdk": "^2.326.0"

Pythonを使用して依存関係をインストールするには、requirements.txtファイルに依存関係を定義します。コードの例:

boto3==1.9.216

セッションの永続性

Alexa-hostedスキルでセッション永続性を使うにはどうすればよいですか?
永続性を追加するには、Node.jsまたはPythonを使用できます。

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

  1. package.jsonファイルのdependenciesセクションに、次のnpm依存関係を追加します。

     "ask-sdk-s3-persistence-adapter": "^2.0.0"
    
  2. index.jsファイルに以下を追加します。

    // 1. ask persistence adapterの読み込み
     const persistenceAdapter = require('ask-sdk-s3-persistence-adapter');
    
     // 2. persistence adapterをスキルビルダーに追加
     exports.handler = Alexa.SkillBuilders.custom()
         .addRequestHandlers(
             LaunchRequestHandler,
     ...
             SesssionEndedRequestHandler
         )
         .addErrorHandlers(ErrorHandler)
         .withPersistenceAdapter(
             new persistenceAdapter.S3PersistenceAdapter({bucketName:process.env.S3_PERSISTENCE_BUCKET})
         )
         .lambda();
    
     // 3. アトリビュートを保存するハンドラーの例
     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();
     },
    
     // 4. アトリビュートを読み込むハンドラーの例
     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. requirements.txtファイルに、次のpipの依存関係を追加します。
     ask-sdk-s3-persistence-adapter==1.0.0
     ask-sdk-core==1.11.0
     boto3==1.9.216
    
  2. lambda_function.pyファイルに以下を追加します。

    #1.永続性アダプターとその他の依存関係をインポート
    import os
    import boto3
    
    from ask_sdk_s3.adapter import S3Adapter
    from ask_sdk_core.skill_builder import CustomSkillBuilder

    #2.カスタムスキルビルダーで永続性アダプターを初期化
    s3_adapter = S3Adapter(bucket_name=os.environ.get('S3_PERSISTENCE_BUCKET'))

    #3.カスタムスキルビルダーに永続性アダプターを追加
    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()


    #4. アトリビュートを保存するハンドラーの例
    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
        )

    #5.属性を読み取るハンドラーの例
    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
        )

    #6.アトリビュートを削除するハンドラーの例
    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
        )

メディアファイル

Node.jsでメディアファイルを使用する

画像やオーディオなどのメディアファイルは、Alexa-hostedスキル用にプロビジョニングされたAmazon S3バケットにアップロードできます。アップロードするには、コードエディターの左下隅にあるMedia storage: Amazon S3リンクをクリックします。すると、新しいブラウザタブが開き、AWSコンソールのAmazon S3機能に移動します。バケット名とフォルダがamzn1-ask-skill-xxxxxxx-xxxx-buildsnapshotbucket-xxxxx/Media/のように表示されます。

スキルのindex.jsからAmazon S3上のファイルにアクセスするには、util.jsを読み込み、ユーティリティ関数getS3PreSignedUrl()を使用して署名付きURLを取得する必要があります。

URLの有効期間は60秒です。また、ユーティリティ関数から有効期間を上書きすることはできません。

画像ファイルの例

次のコードは、ファイルpicture.jpgがリクエストされた例を示しています。

const Util = require('./util.js');
handle(handlerInput){
const pictureUrl = Util.getS3PreSignedUrl("Media/picture.jpg");
return handlerInput.responseBuilder
    .speak('画像付きのハローワールドです')
    .withStandardCard('カードタイトル', 'カードテキスト', pictureUrl)
    .getResponse();
}

音声ファイルの例

次のコードは、ファイルaudio.mp3がリクエストされた例を示しています。

const Util = require('./util.js');
handle(handlerInput){
const audioUrl = Util.getS3PreSignedUrl("Media/audio.mp3").replace(/&/g,'&');
return handlerInput.responseBuilder
    .speak(`音声ファイルを再生します。<audio src="${audioUrl}"/>`)
    .getResponse();
}

コンソールのコードエディタの左下隅にあるリンクから、Alexa-hostedスキル用のAmazon S3メディアファイルにアクセスすると、以下の操作ができます。

  • GetObject
  • PutObject
  • DeleteObject
  • ListBucket
  • ListAllMyBuckets

ファイルのパブリック読み取りアクセス許可が必要な場合は、署名付きURLを使用する必要があります。

Pythonでメディアファイルを使用する

画像ファイルの例 次のコードは、ファイルimage.jpgがリクエストされた例を示しています。

from ask_sdk_model import ui
from utils import create_presigned_url

def handle(self, handler_input):
    # type: (HandlerInput) -> Response
    image_url = create_presigned_url("Media/image.png")
    return (
        handler_input.response_builder
            .speak("画像付きのハローワールドです")
            .set_card(ui.StandardCard(title="カードのタイトル", text="これはサンプルカードです。", image=ui.Image(small_image_url=image_url, large_image_url=image_url)))
            .response
    )

音声ファイルの例 次のコードは、ファイルaudio.m4aがリクエストされた例を示しています。ビルドタブでAudio Playerインターフェースを有効にすることもできます。詳細については、AudioPlayerインターフェースのリファレンスを参照してください。PlayDirectiveの詳細については、Alexa Skills Kit SDK for Pythonを参照してください。

from ask_sdk_model.interfaces.audioplayer import AudioItem, Stream, PlayDirective, PlayBehavior
from utils import create_presigned_url

def handle(self, handler_input):
    # type: (HandlerInput) -> Response
    audio_url = create_presigned_url("Media/audio.m4a")
    handler_input.response_builder
    .add_directive(PlayDirective(play_behavior=PlayBehavior.REPLACE_ALL,audio_item=AudioItem(stream=Stream(token="1234AAAABBBBCCCCCDDDDEEEEEFFFF", url=audio_url,offset_in_milliseconds=10,expected_previous_token=None))))
    return (
        handler_input.response_builder.response
    )

エンドポイントとデプロイ

エンドポイントを変更するとどうなりますか?
Alexa-hostedスキルはAWS Lambdaエンドポイントをプロビジョニングし、スキルをエンドポイントにリンクします。ホスティングするエンドポイントを変更すると、スキルはAlexa-hostedスキルではなくなり、コンソールのコードエディタから新しいエンドポイントにはデプロイでません。コンソールでエンドポイントを変更すると、コードタブにホストするエンドポイントに再接続するというオプションが表示されます。
コードを開発中のエンドポイントにデプロイするにはどうすればよいですか?
Alexa-hostedスキルが公開されると、コンソールには2つのステージのスキルが表示されます。1つは公開中、1つは開発中です。スキルの開発中ステージでは、コードエディターを使ってコードの編集、保存、AWS Lambdaエンドポイントの開発中バージョンへのデプロイができます。このアクションは、スキルの公開中エンドポイントに影響しません。その後、テストタブに移動し、変更をテストできます。
開発中のエンドポイントを公開中のエンドポイントに昇格させるにはどうすればよいですか?
スキルの音声モデルを変更した場合は、スキルの再認定を申請する必要があります。スキルのコードのみを変更した場合、コードエディターの公開中にするボタンをクリックしてコードを開発中から公開中に昇格させます。このアクションでは、公開したスキルの公開中コードが置換されます。
公開中のエンドポイントを簡単に修正するにはどうすればよいですか?
Alexa-hostedスキルの公開中コードを修正するには、まず開発中ステージで変更を行い、変更をテストしてから、スキルの公開中エンドポイントに変更を昇格させることをおすすめします。公開中コードを簡単に修正し、開発中コードにしたくない別の変更を行う場合、開発中エンドポイントを直接修正できます。ただし、変更をテストすることはできません。開発中ステージでコードエディターを開き、コードを編集してから、変更を直接公開中エンドポイントにデプロイします。このアクションは公開中スキルに影響します。

スキルをダウンロードする

スキルのコピーをダウンロードするにはどうすればよいですか?
スキルは、開発ステージまたは公開中ステージのいずれかで、スキルのコードエディタタブからダウンロードできます。開発ステージでは、最新のコード変更でスキルをダウンロードできます。公開中ステージでは、公開中のスキルのコピーをダウンロードできます。

スキルのコピーをダウンロードするには

  1. Alexa開発者コンソールのアカウントにログインします。
  2. ダウンロードするスキルの横にある編集をクリックします。
  3. コードエディタタブをクリックします。
  4. 左上にあるスキルのダウンロードをクリックします。
  5. ポップアップウィンドウで、続けるを選択します。
  6. スキルを.zipファイルとして保存します。
スキルのどの部分がダウンロードパッケージに含まれていますか?
ダウンロードパッケージには、スキルの対話モデル、ソースコードファイル、スキルマニフェストが含まれます。

個人のAWSリソース

個人のAWSアカウントでリソースを使用するには、Alexa-hostedスキルをどのようにセットアップすればよいですか?
AWS Lambda実行ロールARNを使用すれば、個人のAWSアカウントのリソースをシームレスに使用して、Alexa-hostedスキルの機能を拡張することができます。たとえば、Alexa-hostedスキルをAmazon DynamoDBテーブルに接続できます。

Node.jsでAlexa-hostedスキルをセットアップし、個人のAWSアカウントのリソースを使用する

個人のAWSアカウントのリソースを使用するには、Node.jsのAlexa-hostedスキルを以下の手順でセットアップします。

  1. Alexa開発者コンソールで、Alexa-hostedスキルを開きます。
  2. コードエディタで、ホバーテキストがAWS Lambda実行ロールARNのアイコンをクリックします。ARNをコピーします。
  3. 個人のAWSアカウントのIdentity and Access Management(IAM)ダッシュボードで、Alexa-hostedスキルがアクセスするリソースへのアクセスを許可するロールを作成します。まだ作成していない場合は、作成してください。
  4. IAMダッシュボードで、ロールをクリックし、編集するロールの名前をクリックし、次に信頼関係タブをクリックします。
  5. 信頼関係の編集にてsts:AssumeRoleアクションを含めます。
  6. 次のように、Alexa-hostedスキルのAWS Lambda実行ロールARNを指定します。

     {
       "Version": "2012-10-17",
       "Statement": [
             ... ユーザーの既存の信頼関係 ...,
             {
               "Effect": "Allow",
               "Principal": {
                 "AWS": "<Alexa-hostedスキルからのAWS Lambda実行ロールARNで置換>"
               },
               "Action": "sts:AssumeRole"
             }
       ]
     }
    
  7. Alexa-hostedスキルのコードで、ロールがAWS Security Token Service (STS)を使用するとします。たとえば、次のコードは、AWS DynamoDBアクセス権限のあるロールの一時認証情報をリクエストし、DynamoDBテーブルをスキャンします。

     const ShowUserMessageHandler = {
         ... ユーザーの canHandle 関数  (インテント用) ...
    
         async handle(handlerInput) {
             // 1.AWSリソースロールは、STS AssumeRoleアクションを使用するとします
             const STS = new AWS.STS({ apiVersion: '2011-06-15' });
             const credentials = await STS.assumeRole({
                 RoleArn: '<AWSリソースロールのARN>',
                 RoleSessionName: 'ExampleSkillRoleSession' //任意の名前に変更できます
             }, (err, res) => {
                 if (err) {
                     console.log('AssumeRole FAILED: ', err);
                     throw new Error('Error while assuming role');
                 }
                 return res;
             }).promise();
    
             // 2.想定するロール認証情報を使用して、DynamoDBを作成し、
             //    DynamoDBテーブルをスキャンします
             const dynamoDB = new AWS.DynamoDB({
                 apiVersion: '2012-08-10',
                 accessKeyId: credentials.Credentials.AccessKeyId,
                 secretAccessKey: credentials.Credentials.SecretAccessKey,
                 sessionToken: credentials.Credentials.SessionToken
             });
             const tableData = await dynamoDB.scan({ TableName: 'TestTable' }, (err, data) => {
                 if (err) {
                     console.log('Scan FAILED', err);
                     throw new Error('Error while scanning table');
                 }
                 return data;
             }).promise();
    
             // ...必要に応じてテーブルデータを使用します ...
         }
     };
    

Alexa-hostedスキルから個人用AWSアカウントのリソースを使用するために、Pythonでセットアップします。Alexa-hostedスキルのコードでは、AWS Security Token Service (STS) APIを使用してロールを引き受けます。たとえば、次のコードは、AWS DynamoDBアクセス権限のあるロールの一時認証情報をリクエストし、DynamoDBテーブルをスキャンします。


import boto3

def handle(self, handler_input):
    # type: (HandlerInput) -> Response

    # 1.AWSリソースロールは、STS AssumeRoleアクションを使用するとします
    sts_client = boto3.client('sts')
    assumed_role_object=sts_client.assume_role(RoleArn="<Your AWS resource role ARN>", RoleSessionName="AssumeRoleSession1")
    credentials=assumed_role_object['Credentials']

    # 2.想定するロール認証情報を使用して、DynamoDBインスタンスを作成します
    dynamodb = boto3.resource('dynamodb',
                      aws_access_key_id=credentials['AccessKeyId'],
                      aws_secret_access_key=credentials['SecretAccessKey'],
                      aws_session_token=credentials['SessionToken'],
                      region_name='us-east-1')

    # 3.DynamoDBのテーブル操作を行います
    try:
        table = dynamodb.Table('TestTable')
        response = table.scan()
        #必要に応じてレスポンスを使用します。
    except ResourceNotExistsError:
    # 例外ハンドラー
        raise
    except Exception as e:
    # 例外ハンドラー
        raise e
    # 続行
    return (
        handler_input.response_builder.response
    )

ASK CLI

ASK CLIを使ってAlexa-hostedスキルを使い始めるにはどうすればよいですか?
ASK CLIを使って新しいAlexa-hostedスキルを作成するには、ask create-hosted-skillコマンドを使用します。これでAmazon開発者アカウントに開発中ステージの新しいAlexa-hostedスキルが作成されます。デフォルトではスキルはローカルコンピューターにクローンされません。Alexa-hostedスキルをローカルコンピューターにクローンするには、以下を実行します。
  • ask create-hosted-skillコマンドで--auto-clone trueオプションを使用します。これにより新しいAlexa-hostedスキルが作成され、1個のコマンドでスキルがローカルコンピューターにクローンされます。
  • 既に作成済みのAlexa-hostedスキルをクローンするには、ask cloneコマンドを使用します。
Alexa-hostedスキルのリポジトリは、ASK CLIを使用してどのように動作しますか?
Alexa-hostedスキルをクローンすると、ASK CLIは、スキルのコードを含むGitリポジトリのあるフォルダや、対話モデル、スキルマニフェストを作成できます。このリポジトリは以下のブランチで設定されます。
  • devブランチ。開発者コンソールに表示される最新の保存状態に対応します。
  • masterブランチ。開発ステージのAWS Lambdaエンドポイントにデプロイされている内容に対応します。
  • prodブランチ。スキルが既に公開中である場合、公開中のAWS Lambdaエンドポイントにデプロイされている内容に対応します。
一般的なコマンドは、Alexa-hostedスキルのASK CLIでどのように動作しますか?
以下に、Gitリポジトリのアクティビティと開発者コンソールのアクティビティがどのように対応するかを示します。
  • devブランチへプッシュする操作は、開発者コンソールのコードタブで保存をクリックすることと同じです。
  • devをプッシュしてからdevmasterへマージしてmasterへプッシュする操作は、開発者コンソールのコードタブでデプロイをクリックすることと同じです。
  • masterprodへマージしてからprodへプッシュする操作は、開発者コンソールのコードタブで公開するをクリックすることと同じです。これは公開中のスキルのコードを簡単に修正するのみで、スロット、インテント、発話の変更のような対話モデルの更新はデプロイされません。

以下に、ask deployコマンドを使用する手順を示します。この手順では、devブランチとmasterブランチでコマンドを実行し、ローカルコンピューターのコードをスキルの開発ステージのAWS Lambdaエンドポイントにプッシュします。

ASK CLIを使用してAlexa-hostedスキルに変更をデプロイするには:

  1. devブランチで変更を行います。
    <変更を行う>
    <Gitリポジトリのルートディレクトリに移動>した後、以下のコマンドを実行します。
    git add <ファイル名>
    git commit
  2. ask deployコマンドを実行します。このコマンドは、devブランチをmasterにマージして、ローカルdevブランチをリモートdevブランチ、およびローカルmasterブランチをリモートmasterブランチにプッシュします。

変更をテストしたら、開発者コンソールを使ってスキルをAlexaスキルストアに公開するプロセスを開始します。詳細については、スキルをテストして認定を申請するを参照してください。

ASK CLIを使って公開中AWS Lambdaエンドポイントを簡単に修正するにはどうすればよいですか?
公開済みのスキルについて、公開中のコードを簡単に修正するには、開発者コンソールで公開するをクリックして変更を公開に昇格させるか、以下を実行してmasterブランチをprodにマージすることができます。
git checkout prod
git merge master
git push

このアクションはそのスキルを使っているすべてのユーザーに影響します。スロット、インテント、発話の変更のような対話モデルの更新はデプロイされません。また簡単な修正をdevブランチとmasterブランチにマージして、変更が失われないようにする必要があります。そうしないと、スキルが認定に合格したときや変更を公開に昇格させたときなど、開発ステージのスキルが公開されたときに簡単な修正は上書きされてしまいます。このような場合、masterブランチのコードがデプロイされ、prodブランチのコードは強制的なマージにより置き換えられます。

ASK CLI認証情報ヘルパーで問題が発生したらどうすればよいですか?
以前のバージョンのGitをインストールした状態でAWS CodeCommit認証情報ヘルパーを設定していると、unable to accessthe requested URL returned error: 403などのエラーが表示されることがあります。この問題を解決するには、バージョン2.9以降にGitを更新します。