アトリビュートの管理
SDKを使うと、さまざまなスコープでアトリビュートの保存と取得が可能になります。たとえば、アトリビュートを使って後続のリクエストで取得するデータを保存できます。また、ハンドラーのcanHandle
ロジックでアトリビュートを使うことで、リクエストのルーティングに影響を与えることも可能です。
アトリビュートは、キーと値で構成されます。キーはString
型で強制型、値は無制限のObject
型です。セッションアトリビュートと永続アトリビュートの場合、値は保存して後で取得できるよう、シリアライズできるデータ型である必要があります。この制限はリクエストレベルのアトリビュートには適用されません。なぜならリクエストレベルのアトリビュートは、リクエスト処理のライフサイクルが終了すると、永続的に存在しないからです。
アトリビュートのスコープ
リクエストアトリビュート
リクエストアトリビュートは、1回のリクエスト処理ライフサイクルの間のみ存続します。リクエストを受信した時点では、リクエストアトリビュートは空です。また応答が生成されると破棄されます。
リクエストアトリビュートは、リクエストと応答のインターセプターと合わせて使うと便利です。たとえば、リクエストインターセプターを使って追加のデータとヘルパークラスをリクエストアトリビュートに挿入して、リクエストハンドラーから取得できるようにすることが可能です。
セッションアトリビュート
セッションアトリビュートは、現在のスキルセッションが継続している間存続します。セッションアトリビュートは、すべてのセッション内リクエストで使用できます。リクエスト処理のライフサイクル中に設定されたすべてのアトリビュートはAlexaサービスに返され、同じセッションの次のリクエストで提供されます。
セッションアトリビュートで、外部ストレージソリューションを使用する必要はありません。セッションアトリビュートはセッション外のリクエストの処理では使用できません。スキルセッションがクローズされると破棄されます。
永続アトリビュート
永続アトリビュートは、現在のセッションのライフサイクルが終了しても存続します。主要なスコープ(ユーザーID、デバイスID)、TTL、ストレージレイヤーを含む、これらのアトリビュートがどのように保存されるかは、PersistenceAdapterのコンフィギュレーションによって異なります。
PersistenceAdapter
を使用してスキルのインスタンスを設定する場合にのみ使用できます。PersistenceAdapter
が設定されていない場合に、AttributesManager
を呼び出して永続アトリビュートの取得と保存を行おうとするとエラーが発生します。AttributesManager
AttributesManager
には、ハンドラーで取得や更新を行えるアトリビュートがあります。AttributesManager
は、HandlerInput
コンテナオブジェクトからハンドラーで使用できます。AttributesManager
は、スキルで必要なアトリビュートと直接やり取りできるよう、アトリビュートの取得と保存を行います。AttributesManager
の詳細については、TypeDocを参照してください。
利用可能なメソッド
getRequestAttributes() : {[key : string] : any};
getSessionAttributes() : {[key : string] : any};
getPersistentAttributes() : Promise<{[key : string] : any}>;
setRequestAttributes(requestAttributes : {[key : string] : any}) : void;
setSessionAttributes(sessionAttributes : {[key : string] : any}) : void;
setPersistentAttributes(persistentAttributes : {[key : string] : any}) : void;
savePersistentAttributes() : Promise<void>;
deletePersistentAttributes?() : Promise<void>;
以下は、永続アトリビュートの取得と保存を行う方法のサンプルです。
const PersistentAttributesHandler = {
canHandle(handlerInput) {
return new Promise((resolve, reject) => {
handlerInput.attributesManager.getPersistentAttributes()
.then((attributes) => {
resolve(attributes.foo === 'bar');
})
.catch((error) => {
reject(error);
})
});
},
handle(handlerInput) {
return new Promise((resolve, reject) => {
handlerInput.attributesManager.getPersistentAttributes()
.then((attributes) => {
attributes.foo = 'bar';
handlerInput.attributesManager.setPersistentAttributes(attributes);
return handlerInput.attributesManager.savePersistentAttributes();
})
.then(() => {
resolve(handlerInput.responseBuilder
.speak('永続アトリビュートが更新されました。')
.getResponse());
})
.catch((error) => {
reject(error);
});
});
},
};
import {
HandlerInput,
RequestHandler,
} from 'ask-sdk-core';
import { Response } from 'ask-sdk-model';
const PersistentAttributesHandler : RequestHandler = {
async canHandle(handlerInput : HandlerInput) : Promise<boolean> {
const persistentAttributes = await handlerInput.attributesManager.getPersistentAttributes();
return persistentAttributes.foo === 'bar';
},
async handle(handlerInput : HandlerInput) : Promise<Response> {
const persistentAttributes = await handlerInput.attributesManager.getPersistentAttributes();
persistentAttributes.foo = 'bar';
handlerInput.attributesManager.setPersistentAttributes(persistentAttributes);
await handlerInput.attributesManager.savePersistentAttributes();
return handlerInput.responseBuilder
.speak('永続アトリビュートが更新されました。')
.getResponse();
},
};
AttributesManager
は永続アトリビュートをローカルにキャッシュします。setPersistentAttributes()
は、ローカルにキャッシュされた永続アトリビュートのみを更新します。永続アトリビュートを永続レイヤーに保存するには、savePersistentAttributes()
を呼び出す必要があります。deletePersistentAttributes()
を呼び出すと、ローカルにキャッシュされた永続アトリビュートも削除されます。PersistenceAdapter
PersistenceAdapter
は、永続レイヤー(データベースやローカルファイルシステムなど)でアトリビュートを保存したり取得したりする場合にAttributesManager
が使用します。SDKを使用して、次のインターフェースに準拠する任意のカスタマイズ済みPersistenceAdapter
を登録できます。
インターフェース
interface PersistenceAdapter {
getAttributes(requestEnvelope : RequestEnvelope) : Promise<{[key : string] : any}>;
saveAttributes(requestEnvelope : RequestEnvelope, attributes : {[key : string] : any}) : Promise<void>;
deleteAttributes?(requestEnvelope : RequestEnvelope) : Promise<void>;
}
DynamoDbPersistenceAdapter
ask-sdk-dynamodb-persistence-adapter
パッケージは、AWS DynamoDBを使ってPersistenceAdapter
を実装したDynamoDbPersistenceAdapter
を提供します。
コンストラクターの詳細
new DynamoDbPersistenceAdapter(config = {}) => Object
DynamoDbPersistenceAdapter
オブジェクトを構築します。このオブジェクトは、アトリビュートオブジェクトのDynamoDBテーブルからの取得、保存、削除を行う際に、AttributesManager
によって使用されます。このテーブルには2つの列があります。1つはパーティションキー、1つはアトリビュートに使用されます。createTable
コンフィギュレーションがtrue
に設定されている場合にDynamoDbPersistenceAdapter
がインスタンス化されると、SDKは指定されたtableName
で新しいDynamoDBテーブルを作成しようとします。
例
const { DynamoDbPersistenceAdapter } = require('ask-sdk-dynamodb-persistence-adapter');
const dynamoDbPersistenceAdapter = new DynamoDbPersistenceAdapter({ tableName : 'FooTable' })
import { PersistenceAdapter } from 'ask-sdk-core';
import { DynamoDbPersistenceAdapter } from 'ask-sdk-dynamodb-persistence-adapter';
const dynamoDbPersistenceAdapter : PersistenceAdapter = new DynamoDbPersistenceAdapter({ tableName : 'FooTable' });
コンフィギュレーションオプション
- tableName(文字列) - 使用するDynamoDBテーブルの名前です。
- partitionKeyName(文字列) - 任意です。パーティションキー列の名前です。指定されない場合、デフォルトの
"id"
になります。 - attributesName(文字列) - 任意です。アトリビュート列の名前です。指定されない場合、デフォルトの
"attributes"
になります。 - createTable(ブール値) - 任意です。
true
に設定すると、テーブルが存在しない場合にDynamoDbPersistenceAdapter
が自動で作成します。指定されない場合、デフォルトのfalse
になります。 - partitionKeyGenerator(関数) - 任意です。
RequestEnvelope
を使ってパーティションキーを生成するときに使用される関数です。デフォルトでは、userId
を使ってパーティションキーを生成します。 - dynamoDBClient(AWS.DynamoDB) - 任意です。AWS DynamoDBテーブルのクエリーに使用する
DynamoDBClient
です。ここにカスタムコンフィギュレーションを使ったDynamoDBClient
を挿入できます。デフォルトでは、new AWS.DynamoDB({apiVersion : 'latest'})
が使用されます。
メソッドの詳細
getAttributes(requestEnvelope : RequestEnvelope) : Promise<{[key : string] : any}>
getAttributes
操作により、DynamoDBテーブルからアトリビュートが取得されます。RequestEnvelope
オブジェクトを取り込んでPartitionKeyGenerator
に渡し、パーティションキーが生成されます。その後、attributesName
に関連したキーを持つDynamoDBから返されたアトリビュートを取得します。対応するパーティションキーが見つからない場合、getAttributes
は空のオブジェクトを返します。saveAttributes(requestEnvelope : RequestEnvelope, attributes : {[key : string] : any}) : Promise<void>
saveAttributes
操作では、RequestEnvelope
から生成されたパーティションキーを使用してDynamoDBテーブルにアトリビュートを保存します。convertEmptyValues
をtrue
に設定したDynamoDBDocumentClient
を使用します。これは、アトリビュートオブジェクト内のすべての""
、null
、undefined
の値が変換されるようにするためです。deleteAttributes(requestEnvelope : RequestEnvelope) : Promise<void>
deleteAttributes
操作では、RequestEnvelope
で生成されたパーティションキーを使用してDynamoDBテーブルからアトリビュートを削除します。この操作では、整合性を保つため、ローカルにキャッシュされた永続アトリビュートも消去します。該当するパーティションキーを持つアトリビュートがテーブルに存在しない場合、deleteAttributes
は何も行いません。
S3PersistenceAdapter
ask-sdk-s3-persistence-adapter
パッケージは、AWS S3を使ってPersistenceAdapter
を実装したS3PersistenceAdapter
を提供します。
コンストラクターの詳細
new S3PersistenceAdapter(config = {}) => Object
S3PersistenceAdapter
オブジェクトを構築します。このオブジェクトは、アトリビュートオブジェクトを取得してS3バケットに保存するためにAttributesManager
によって使用されます。アトリビュートオブジェクトは、オブジェクトキーのファイル名を持つ個別のファイルとして表わされます。
例
const { S3PersistenceAdapter } = require('ask-sdk-s3-persistence-adapter');
const s3PersistenceAdapter = new S3PersistenceAdapter({ bucketName : 'FooBucket' })
import { PersistenceAdapter } from 'ask-sdk-core';
import { S3PersistenceAdapter } from 'ask-sdk-dynamodb-persistence-adapter';
const S3PersistenceAdapter : PersistenceAdapter = new S3PersistenceAdapter({ bucketName : 'FooBucket' });
コンフィギュレーションオプション
- bucketName(文字列) - 使用するS3バケットの名前です。
- objectKeyGenerator(関数) - 任意です。
RequestEnvelope
を使ってオブジェクトキーを生成するために使用される関数です。デフォルトでは、userId
を使ってオブジェクトキーを生成します。 - s3Client(AWS.S3) - 任意です。AWS S3バケットのクエリーに使用される
S3Client
です。ここにカスタムコンフィギュレーションを使ったS3Client
を挿入できます。デフォルトでは、new AWS.S3({apiVersion : 'latest'})
が使用されます。 - pathPrefix(文字列) - 生成されたオブジェクトキーに追加されるプレフィックスの値です。s3でファイルシステム構造を模倣するために使用されます。デフォルトは空の文字列です。
メソッドの詳細
getAttributes(requestEnvelope : RequestEnvelope) : Promise<{[key : string] : any}>
getAttributes
操作により、S3バケットからアトリビュートが取得されます。RequestEnvelope
オブジェクトを取り込んでObjectKeyGenerator
に渡し、オブジェクトキーが生成されます。その後、S3バケットから返されたアトリビュートを取得します。対応するオブジェクトキーが見つからない場合、またはオブジェクトにbodyデータがない場合、getAttributes
は空のオブジェクトを返します。saveAttributes(requestEnvelope : RequestEnvelope, attributes : {[key : string] : any}) : Promise<void>
saveAttributes
操作では、RequestEnvelope
で生成されたオブジェクトキーを使用してS3バケットにアトリビュートを保存します。deleteAttributes(requestEnvelope : RequestEnvelope) : Promise<void>
deleteAttributes
操作では、RequestEnvelope
で生成されたオブジェクトキーを使用してS3バケットからアトリビュートを削除します。