ポケットベルサービス終了記念📟 Amazon Connectでポケベル風メッセージ送信

東京テレメッセージが2019/9/30をもってポケットベル（ページャー）のサービスを終了すると発表しました。
http://www.teleme.co.jp/service/magicmail/index.html
サービスの開始は1968年（日本電信電話公社（現NTT））。意外と昔からサービス開始していたんですね。自分の世代は高校生の時にポケベルが流行していました。公衆電話で高校生がベル打ちしてました。（昔話ですね）
終了するポケベルを惜しんで、今回はAmazon Connectでポケベル風メッセージ送信を実装しました。

## 概要

![pager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/c7d07706-e85f-4004-c7a4-be27fb05322a.png)


いわゆるポケベルですね。

- 送信者は電話を通じて送信したい文字のコード列を送信
- Amazon Connectは送信者とのインターフェースとなり、文字のコード列を受け取りLambdaに投げる
- Lambdaは文字のコード列を文字列に変換し、Slackに送信

文字のコード列を文字に変換するためのテーブルは以下のテーブルを参考にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/9ec082ff-4ae2-84c9-0cf4-0f6648acae88.png)
https://pc.watch.impress.co.jp/docs/column/musashino_proto/489609.html

高校生が公衆電話に向かってボタンを連打してるの、このテーブルを暗記してたのか。すごい...。

## 実装

![pager_structure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/89adcf12-3142-02ed-4bc7-1bea34adc28e.png)


以下の手順で実装していきます。

1. SlackからIncoming Webhook URLを取得
2. Serverless Frameworkを使用してLambdaをデプロイ
3. Amazon Connect の設定

Lambda関数の管理にはServerless Framework を使用しています。依存するパッケージを含めたコードのzip化、デプロイや関連するAWSリソースの管理などを簡単なyamlに記述することで簡単にデプロイすることができます。SlackのIncoming Webhook URLの設定をここに行います。

Amazon Connectの設定はTerraformを眺めてもなさそうだったので手で作成します。フローはJSONからインポートします。

### 前提条件

以下を前提としています。
OSは多分なんでも動きますが、検証環境がないのでmacOSのみとなっています。また、node.js/AWS CLIのインストールや設定が終わっていなければ設定しましょう。

- macOS Mojave 10.14.6
- node.js がインストール済み
- AWS アカウントが設定され、ログイン可能な状態
- AWS CLIがインストールされ、適切な認証情報が設定済み

### 1. SlackからIncoming Webhook URLを取得

[Slack でのIncoming Webhook の利用](https://get.slack.help/hc/ja/articles/115005265063-Slack-%E3%81%A7%E3%81%AEIncoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8)に作成します。

設定が完了すると `https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX` のようなURLが払い出されるのでメモしておきましょう。

### 2. Serverless Frameworkを使用してLambdaをデプロイ

#### Serverless Framework のインストール
serverless をインストールします。詳細なインストール手順は[Getting Started with the Serverless Framework and AWS
](https://serverless.com/framework/docs/getting-started/)を参考にしましょう。

```shell-session
$ npm install -g serverless
```

pythonのパッケージインストールに必要となるため、[serverless-python-requirements](https://www.npmjs.com/package/serverless-python-requirements)もインストールします。

```shell-session
$ npm install serverless-python-requirements
```

#### GitHubからソースを取得

GitHubから今回実行するLambda関数のソースを取得します。

```shell-session
$ git clone https://github.com/kangaechu/pager-serverless
$ cd pager-serverless
```

#### 設定ファイルにSlackのWebhook URLを指定

サンプルファイルから設定ファイルを作成します。

```shell-session
$ cp config.dev.sample.json config.dev.json
```

設定ファイルを編集し、先ほど取得したSlackのWebhook URLを `config.dev.json` に指定します。

```json:config.dev.json
{
  "SLACK_WEBHOOK_URL": "https://hooks.slack.com/services/123456789/123456789/012345678901234567890123"
}
```

#### Lambdaにデプロイ

Lambdaにソースをデプロイします。エラーメッセージが出ていないことを確認します。

```shell-session
$ serverless deploy
```

かんたん。

### 3. Amazon Connect の設定

Amazon Connectを設定していきます。

#### Amazon Connect インスタンス追加

[Amazon Connect](https://ap-northeast-1.console.aws.amazon.com/connect/home?region=ap-northeast-1#)で、「インスタンスを追加する」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/79e1e5f9-9e7d-7f70-b87e-a26373a21ac4.png)

1 ID管理画面です。複雑なID管理は行わないので、「Amazon Connect 内にユーザーを保存」を選択し、アクセスURLに適当な名前を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/44f6f7cc-e9bd-45fa-4751-f22ce1f0a5e4.png)

2 管理者の作成画面です。必要な項目を埋めます。
次回以降にAmazon Connectにログインする際に必要な情報となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/ad32b1da-da07-ce28-67fe-2206a0667873.png)

３ テレフォニーオプションです。電話の発信は行わないため、チェックボックスを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/e16d0592-8254-1f15-c277-1f770361ce8d.png)

4 データストレージです。特に設定が必要な項目がないため、次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/633d6581-fbfd-245a-aeeb-a4a30c69645d.png)

5 確認画面です。内容を確認し、「インスタンスを作成」を選択します。
インスタンスの作成が完了したら「今すぐ始める」を選択します。

#### Amazon Connectの設定

##### 日本語化

右上のEnglishを選択し、「日本語」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/116a4fd7-dfd6-32a0-479f-bd9f08e0b902.png)

##### 電話番号を取得する

電話番号の取得では、以下の通り設定します。

- 国/地域: 日本
- タイプ: Direct Dial (通話料発信者負担)
- 電話番号: お好きなものを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/d22af3dd-3c28-1190-7a2b-818c36b91b11.png)

呼び出すでは、Amazon Connectに電話をかけることができます。試しにかけてみましょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/14eda19b-185b-301d-1e98-3db2df3092b0.png)

##### 問い合わせフローのインポート

[pager.json](https://raw.githubusercontent.com/kangaechu/pager-amazon-connect/master/pager.json)（問い合わせフロー）をローカルに保存します。

Amazon Connectの左側から「ルーティング」→「問い合わせフロー」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/3dd9f4db-0071-415a-c11f-58494a82b702.png)

「問い合わせフローの作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/8faf2b67-ebef-0dad-b03a-aae2ccd2c44c.png)

グレイアウトした保存の右にある▼を選択し、「フローのインポート」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/00f8eff9-abbf-19c2-df31-e9dd5ef482e6.png)

先ほどダウンロードした `pager.json` を選択し、インポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/19f694df-1433-0a7d-c4a0-4267e30ac20c.png)

こんなフローがインポートされれば成功です。
「プロンプトの再生」に表示されているワーニングは閉じておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/1450d24a-60f4-869a-efbf-5a7513660e22.png)

インポートしたフローを保存し、公開します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/67f409c6-2639-adad-6e6c-93240104db23.png)

##### Lambdaの設定

先ほど作成したLambdaをワークフローから呼び出せるようにしましょう。

[AWS Connectのインスタンス一覧](https://ap-northeast-1.console.aws.amazon.com/connect/home?region=ap-northeast-1) から対象のインスタンスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/dfa7dfde-ebd6-c112-d8cf-54ff697ef78e.png)

画面左側で「問い合わせフロー」を選択します。
画面右側の「AWS Lambda」で関数を追加します。pager関数を選択し、「Lambda関数の追加」を選択します。
下部の「Lambda 関数」に対象の関数が追加されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/3f552d6d-3d21-459c-e111-8d244ab966c3.png)

再度Amazon Connectで「ポケベル」ワークフローを開きます。
「AWS Lambda関数を呼び出す」を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/779d8f21-ac63-3ada-f114-dc43c10f2142.png)
「関数を選択する」からpager-dev-encode を選択し、Saveを選択します。

上部から再度フローを保存し、公開します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/67f409c6-2639-adad-6e6c-93240104db23.png)

##### 電話番号と問い合わせフローを関連づける

Amazon Connectの左側メニューから「ルーティング」→「電話番号」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/c55a36b3-1d24-1557-a58e-cb792103e140.png)

電話番号を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/3ed07ea3-3ec8-ef69-11fe-61a8a8640e00.png)

「問い合わせフロー/IVR」 に今回作成した「ポケベル」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/3a1b75ca-b3f6-617e-08c5-5d995e3c7d9b.png)

完成です！！！

## 電話をかけてみる

作成した電話番号に電話をかけて、ガイダンスの後に `64 04 93 12 94 44 79`と入力してみましょう。
Slackに通知されましたか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36587/f8052c09-030e-bd45-e718-265a130ef676.png)

## 参考資料

作成後にいろいろ調べてたら先駆者がいました。ハードウェアも作ってて本格的で素晴らしいですね。
https://qiita.com/mobilebiz/items/8fd213700e670cd3b9cd