尝试在各种服务器上部署用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 のデプロイを忘れないこと

确认动作

lambda.png

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

确认操作

firebase.png

使用 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

确认操作

heroku.png

IBM 云

    https://github.com/chibi929/hello-clova/tree/master/bluemix

部署的方法

    bluemix-cli で bx app push

确认动作

bluemix.png

总结

我能将应用部署在各种不同的服务器上。

如果要在 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 即可使用。

广告
将在 10 秒后关闭
bannerAds