0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

BotkitでAWSのリソースを取得する

Last updated at Posted at 2020-09-29

Botkitの簡単な使い方をAWSのAPIとTypeScriptを使って説明します。
今回はSlack連携はせず、簡単なWebエンドポイントを作って確認します。

サンプルリポジトリをおいて置くので、気になる人はCloneして使ってみてください 👌

Botkitの始め方

まずはBotkitをTypeScriptで使えるようにします。

## ライブラリのインストール

$ yarn add botkit # yarnの代わりにnpm使ってもOKです
$ yarn add typescript
$ yarn add botbuilder-adapter-web
$ yarn add aws-sdk

## tsconfigの作成

$ npx tsc --init

tsconfigはこんな感じに修正します。
詳しくはこちらの記事を参照ください。

// tsconfig.json
{
  "compilerOptions": {
    "module": "esnext",
    "target": "esnext",
    "moduleResolution": "node"
  },
  "include": [
    "src/**/*"
  ],
  "exclude": [
    "node_modules"
  ]
}

package.jsonは以下のように修正します。

// package.json
{
  "scripts": {
    "start": "node dist/index.js", // jsを実行
    "build": "npx tsc --outDir ./dist ./src/index.ts" // tsファイルをjsにトランスパイル
  },
  "dependencies": {
    // 割愛
  }
}

TypeScriptでBotkitのサンプルを作成

srcディレクトリとindex.tsを作成

$ mkdir src
$ touch src/index.ts

サンプルコードを作成します。
参考URLはこちら

// src/index.ts
import { Botkit } from "botkit";
import { WebAdapter } from "botbuilder-adapter-web";

const adapter = new WebAdapter; // botbuilder-adapter-webからadapterを作成

const controller = new Botkit({
  adapter: adapter, // 作成したadapterをBotkitの初期化時に渡す
});

controller.on("test", async (bot, msg) => { // イベントのフィルター、`type: test`で返信
  await bot.reply(msg, "I received an text: " + msg.text); // 受け取った`text:`の内容を返す
});

Botkitは本体とAdapterでライブラリが分かれています。
Botkitを初期化する際に、slackやwebなどのアダプタを渡してあげることで機能追加が可能です。

ここで、簡単なテストを実行

# jsファイルを生成
$ yarn build

# botkitを実行、待ち状態になる
$ yarn start

# 別のターミナル or シェルを起動
# Botkitにリクエストを送る
$ curl -X POST \
    -H "Content-Type: application/json" \
    -d '{
          "type": "test",
          "text": "ok bokujyou",
          "channel": "websocket",
          "user": "user"
        }' \
    http://localhost:3000/api/messages

# 以下のレスポンスが返ってくればOK
[{"type":"message","text":"I received an event: ok bokujyou"}]

AWSリソースをBotkitで呼び出す

今回は簡単にCodeBuildのプロジェクト一覧を呼び出してみます。

ソースの作成

$ mkdir -p src/aws
$ touch src/aws/CodeBuild.ts

TypeScriptのコード
(本当はreturnの処理で、返り値とかinterfaceとか書きたいけど今回は省略)

// src/aws/CodeBuild.ts
import * as AWS from "aws-sdk"; // ライブラリをインポート

const codebuild = () => { // classのインスタンスを作成
  return new AWS.CodeBuild; // classを生成
};

// CodeBuildのプロジェクト一覧をAWSから取得して返す関数
const CodeBuildListProjects = () => { // 何も受け取らないLambda処理
  return codebuild().listProjects().promise(); // 非同期処理(コールバック)
};

export { CodeBuildListProjects } // 別ファイルでimportするためにexportしておく
// src/index.ts
import { Botkit } from "botkit";
import { WebAdapter } from "botbuilder-adapter-web";
import { CodeBuildListProjects } from "./aws/CodeBuild"; // import

const adapter = new WebAdapter;

const controller = new Botkit({
  adapter: adapter,
});

controller.on("test", async (bot, msg) => {
  await bot.reply(msg, "I received an event: " + msg.text);
});

// 追加
controller.on("codebuild", async (bot, msg) => {
  // CodeBuildListProjectsを実行
  await bot.reply(msg, await CodeBuildListProjects()); // 非同期処理なのでawaitを忘れない
});

確認してみる

$ yarn build
$ yarn start

# AWSの認証鍵を環境変数に設定

$ export AWS_ACCESS_KEY_ID=<>
$ export AWS_SECRET_ACCESS_KEY=<>
$ export AWS_REGION=<>

## もしくは

$ export AWS_PROFILE=<>

# リクエスト

$ curl -X POST \
    -H "Content-Type: application/json" \
    -d '{
          "type": "codebuild",
          "text": "test",     
          "channel": "websocket",
          "user": "user"
        }' \
    http://localhost:3000/api/messages

# [<CodeBuildのプロジェクト一覧>] が返ってくるはず

まとめ

Botkitを使うとかなり簡単にAPIぽいものが出来上がります。
ここには書いていませんが、slackを使ってデプロイをchatbot的に実行できたりします。
ちょっと敷居が高いかなと思っている方も、ぜひ気軽に遊んでみましょう 🎉

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?