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



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

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

よくある質問

セットアップ

どのようなサービスが含まれますか?
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インストールを実行できますか?
Amazonでは、ビルドスクリプトを実行するために、スキルの一部としてAWS CodeBuildをプロビジョニングします。NPMインストールは、ビルドスクリプトの一部として実行されます。依存関係をpackage.jsonに配置できるためNPMインストールを実行する必要はありません。デプロイボタンをクリックすると、AWS CodeBuildはNPMインストールを実行します。

使用制限

利用制限はありますか?
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のバージョン8をサポートしています。

スキルのリソース

自分のファイルは他のアカウントと共有されますか?
サービスはファイルやリソースを、他のユーザーのアカウントから切り離された個々のアカウントに配置します。開発者コンソールは、個々のアカウントとリソースをアカウント内でプロビジョニングし、管理します。
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コンソールの一部が表示され、ログにアクセスできます。

セッションの永続性

Alexa-hostedスキルでセッション永続性を使うにはどうすればよいですか?
まず、package.jsonファイルのdependenciesセクションに、次のnpm依存関係を追加します。
"ask-sdk-s3-persistence-adapter": "^2.0.0"

次に、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();
},

メディアファイル

Alexa-hostedスキルでメディアファイルを使うにはどうすればよいですか?
画像やオーディオなどのメディアファイルは、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を入手する必要があります。以下のコードは、picture.jpgファイルをリクエストした場合の例です。

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

const Util = require('util.js');
...
handle(handlerInput){

    const pictureUrl = Util.getS3PreSignedUrl("Media/picture.jpg");
    return handlerInput.responseBuilder
        .speak('画像付きのハローワールドです')
        .withStandardCard('card title', 'card text', pictureUrl)
        .getResponse();
}

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

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

個人のAWSリソース

個人のAWSアカウントでリソースを使用するには、Alexa-hostedスキルをどのようにセットアップすればよいですか?
AWS Lambda実行ロールARNを使用すれば、個人のAWSアカウントのリソースをシームレスに使用して、Alexa-hostedスキルの機能を拡張することができます。たとえば、Alexa-hostedスキルをAmazon DynamoDBテーブルに接続できます。個人のAWSアカウントでリソースを使用するには、Alexa-hostedスキルを以下の手順でセットアップします。
  1. Alexa開発者コンソールでAlexa-hostedスキルを開き、コードエディターで、上にカーソルを載せるとAWS Lambda実行ロールARNというテキストが表示されるアイコンをクリックします。ARNをコピーします。
  2. まだ実行していない場合は、個人のAWSアカウントのIdentity and Access Management(IAM)ダッシュボードで、Alexa-hostedスキルがアクセスするリソースにアクセスを許可するロールを作成します。
  3. IAMダッシュボードで、ロールをクリックし、編集するロールの名前をクリックし、次に信頼関係タブをクリックします。
  4. 信頼関係を編集して、sts:AssumeRoleアクションを含め、次の例のようにAlexa-hostedスキルからAWS Lambdaロール実行ARNを指定します。
    {
      "Version": "2012-10-17",
      "Statement": [
         ... ユーザーの 既存の 信頼 関係 ...,
         {
           "Effect": "Allow",
           "Principal": {
             "AWS": "<Alexa-hostedスキルからのAWS Lambda実行ロールARNで置換>"
           },
           "Action": "sts:AssumeRole"
         }
      ]
    }
    
  5. 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();
    
         // ...必要に応じてテーブルデータを使用します ...
     }
    };
    

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認証情報ヘルパーを設定していると、以下のようなエラーが表示されることがあります。この問題を解決するには、バージョン2.9以降にGitを更新します。
fatal: unable to access
'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/.../':
The requested URL returned error: 403