尝试在各种服务器上部署用Clova SDK开发的自定义技能
Amazon Alexa已经有一个关于将其部署到AWS Lambda的示例,
Google Assistant已经有一个关于将其部署到Cloud Functions的示例,
但是,LINE Clova并没有指定要将其部署到可从外部访问的服务器上。
我认为Clova SDK的示例是使用Express创建的Web应用程序,所以通常的用法是将其部署到Heroku等平台上。在上一篇文章中,我们将其部署到了Heroku。
因此,本次我参考了 ask-sdk-core 的 lambda 定义,
fork 了 Clova SDK 并添加了处理函数,
尝试了各种方式将其部署到服务器上。
AWS Lambda 可以被理解为“亚马逊 Lambda”,即一种由亚马逊提供的无服务器计算服务。
-
- ソースコードは Lambda にデプロイ
- POST API は API Gateway で作成
在 Fork 的代码中添加函数
将代码部署到 Lambda
https://github.com/chibi929/hello-clova/tree/master/lambda
コードはほとんど 前回の記事 と同様です。(リクエスト/レスポンス界面の部分が異なります)
Clova SDK は npm 経由ではなく、Fork した git repository からインストールしています
TypeScript を使っているのでビルドとか必要です
// この `@line/clova-cek-sdk-nodejs` は Fork した git repository のもの
import { Client, SpeechBuilder, Middleware } from '@line/clova-cek-sdk-nodejs';
const launchHandler = async responseHelper => {
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('おはよう')
);
};
const intentHandler = async responseHelper => {
const intent = responseHelper.getIntentName();
const sessionId = responseHelper.getSessionId();
switch (intent) {
case 'KinokoIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('きのこのこのこ元気の子 from Lambda')
);
break;
case 'Clova.YesIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('はいはい')
);
break;
case 'Clova.NoIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('いえいえ')
);
break;
default:
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('なんなん')
);
break;
}
};
const sessionEndedHandler = async responseHelper => { };
// ここの部分が Lambda の handler へ繋がる
// `.handle()` ではなく、追加した関数 `.lambda()` に変更している
export const handle = Client
.configureSkill()
.onLaunchRequest(launchHandler)
.onIntentRequest(intentHandler)
.onSessionEndedRequest(sessionEndedHandler)
.lambda();
- KinokoIntent のハンドリングで from Lambda を付けてわかりやすく。
部署的方式
- zip で AWS マネジメントコンソールから手動でデプロイ
使用API网关创建一个POST方法
-
- 詳細は割愛します
-
- POST メソッドで上記の Lambda へ繋げる
- API のデプロイを忘れないこと
确认动作
Firebase
谷歌云端平台
在修改过的代码中添加函数。
将代码部署到Firebase的Cloud Functions。
https://github.com/chibi929/hello-clova/tree/master/firebase/functions
こちらもコードはほとんど一緒です
firebase init で作ったスケルトンにいつものコードを書く
import * as functions from 'firebase-functions';
// この `@line/clova-cek-sdk-nodejs` は Fork した git repository のもの
import { Client, SpeechBuilder, Middleware } from '@line/clova-cek-sdk-nodejs';
const launchHandler = async responseHelper => {
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('おはよう')
);
};
const intentHandler = async responseHelper => {
const intent = responseHelper.getIntentName();
const sessionId = responseHelper.getSessionId();
switch (intent) {
case 'KinokoIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('きのこのこのこ元気の子 from Firebase')
);
break;
case 'Clova.YesIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('はいはい')
);
break;
case 'Clova.NoIntent':
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('いえいえ')
);
break;
default:
responseHelper.setSimpleSpeech(
SpeechBuilder.createSpeechText('なんなん')
);
break;
}
};
const sessionEndedHandler = async responseHelper => { };
// ここの部分が firebase の handler に繋がる
// `.handle()` ではなく、追加した関数 `.firebase()` に変更している
const handle: any = Client
.configureSkill()
.onLaunchRequest(launchHandler)
.onIntentRequest(intentHandler)
.onSessionEndedRequest(sessionEndedHandler)
.firebase();
// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
export const clova = functions.https.onRequest(handle);
- KinokoIntent のハンドリングで from Firebase を付けてわかりやすく。
部署的方法
- firebase-cli で npm run deploy
确认操作
使用 Express 的平台(如 Heroku、IBM Cloud)
-
- こちらは 前回の記事 同様、手を加えていない 公式 Clova SDK を使用しています
-
- 違いはサービス毎に使用する Procfile だったり mafifest.yml だったり。
- 応答の from Heroku だったり from Bluemix だったり。
Heroku 和平台
- https://github.com/chibi929/hello-clova/tree/master/heroku
部署的方法
- heroku-cli で git push heroku master
确认操作
IBM 云
- https://github.com/chibi929/hello-clova/tree/master/bluemix
部署的方法
- bluemix-cli で bx app push
确认动作
总结
我能将应用部署在各种不同的服务器上。
如果要在 npm install 中指定 git repository,
如果不提交构建生成物 dist 目录,
就无法通过 import 引入 npm 模块,有点担心…
像 Swift 的扩展机制一样,希望能够扩展官方模块…
补充
https://github.com/line/clova-cek-sdk-nodejs/pull/5这个链接里,已经将lambda()和firebase()合并了。
如果您不想使用 Fork 分支,只需正常运行 npm install @line/clova-cek-sdk-nodejs 即可使用。