整理了在Lambda中开发Clova Skill(使用Node.js)的步骤
首先
这是一个总结在开发Clova Skill时首先要进行的步骤。
环境假设如下:
-
- エンドポイントはAWS Lambda
-
- node.js(8.10)
- 開発には公式SDKを使用
创建项目
$ git init
$ npm init
# layerを使用する場合は以下の2つは省略
$ npm install --save @line/clova-cek-sdk-nodejs aws-sdk
$ npm install --save @line/bot-sdk #botを使う場合
.gitignore 文件
upload.zip
node_modules
index.js 文件
/*
https://github.com/line/clova-cek-sdk-nodejs
*/
const clova = require("@line/clova-cek-sdk-nodejs");
const line = require('@line/bot-sdk');
const clovaSkillHandler = clova.Client
.configureSkill()
.onLaunchRequest(responseHelper => {
// sessionAttributesを明示的にクリア
responseHelper.setSessionAttributes({})
responseHelper.setSimpleSpeech(
clova.SpeechBuilder.createSpeechText(`LaunchRequestで喋らせたい内容`)
);
})
.onIntentRequest(async responseHelper => {
const intent = responseHelper.getIntentName();
const sessionId = responseHelper.getSessionId();
switch (intent) {
case "SmapleIntent":
responseHelper.setSimpleSpeech(
clova.SpeechBuilder.createSpeechText(`Clovaが喋る内容`)
);
break;
case "Clova.GuideIntent":
break;
case "Clova.YesIntent":
break;
case "Clova.NoIntent":
break;
}
})
.onSessionEndedRequest(responseHelper => {
responseHelper.endSession();
})
exports.handler = clovaSkillHandler.lambda()
/*
handlerを以下にするとリクエストのログを取れる
*/
/*
exports.handler = async (event, content) => {
console.log("event: " + JSON.stringify(event));
var ctx = new clova.Context(event);
const requestType = ctx.requestObject.request.type;
const requestHandler = clovaSkillHandler.config.requestHandlers[requestType];
if (requestHandler) {
await requestHandler.call(ctx, ctx);
}
return ctx.responseObject;
};
*/
如果要进行验证的话
如果不介意的话,请跳过验证是否是来自CEK的访问。
我們將修改最後的以下一行。
exports.handler = clovaSkillHandler.lambda()
exports.handler = async (event, content) => {
console.log("--- event ---");
console.log(util.inspect(event), false, null);
const signature = event.headers.signaturecek || event.headers.SignatureCEK;
const applicationId = process.env["applicationId"];
const requestBody = event.body;
// 検証
// リクエストが自分の作成したスキルからであるか等を確認しています。
await clova.verifier(signature, applicationId, requestBody);
console.log("clear verifier");
var ctx = new clova.Context(JSON.parse(event.body));
const requestType = ctx.requestObject.request.type;
const requestHandler = clovaSkillHandler.config.requestHandlers[requestType];
if (requestHandler) {
await requestHandler.call(ctx, ctx);
// CEKに返すレスポンスです。
// API Gatewayの設定で「Lambdaのプロキシ結合の使用」のチェックを入れた場合、
// レスポンスにヘッダー等を入れる必要がある
const response = {
"isBase64Encoded": false,
"statusCode": 200,
"headers": {},
"body": JSON.stringify(ctx.responseObject),
}
console.log(util.inspect(response), false, null);
return response;
} else {
throw new Error(`Unable to find requestHandler for "${requestType}"`);
}
}
在环境变量中添加以下内容。
-
- 変数名: applicationId
- 値: CEKで設定したExtensionID
请在AWS API Gateway中启用Lambda代理集成的选项。
对于不了解它的人,请参考这篇文章。
如果要创建Lambda层
如果使用Layer,就不需要每次都进行SDK等的安装。如果想提高开发效率,建议使用它。请参考以下内容,详细了解(新功能)使用Lambda Layer尝试Alexa SDK V2的超级便利之处。
$ mkdir nodejs #nodejsといるディレクトリじゃないと動きません。
$ cd nodejs
$ npm init
$ npm install --save @line/clova-cek-sdk-nodejs aws-sdk
$ npm install --save @line/bot-sdk
$ cd ../
$ zip -r upload.zip nodejs/
如果使用layer,可以省略SDK的安装。