AWS･APIのド素人がLexとSlackを連携させる



#記事を作成した目的
Lexでのチャットボット作成の一環で、SlackとLexを連携させる動作を確認するため
簡単に手順だけ掲載する


#準備段階　
**前提：AWSマネジメントコンソールにログインしかしたことない状態からはじめる。**
AWSクラウドプラクティショナーの勉強の一環でアカウント作成していた
しかし、実際はテキスト＆公式動画主体の勉強になっていて、コンソールで特に作業は行っていない。
AWSのしくみを理解するためにちらっと各項目を確認したぐらい。

######●用意したもの
・プライベートのSlackのワークスペース作成(Slack API利用のため)
・AWSマネジメントコンソール利用のためのアカウント
・公式ホームページの手順サイト　Amazon Lex ボットをSlackと統合する
https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/deploy-slack.html
・Amazon開発者向けガイド Amazon Lex
 https://docs.aws.amazon.com/ja_jp/lex/?id=docs_gateway

***#手順***
(1)AWSマネジメントコンソール｢Lex(V2)｣にアクセスしてBotを作成
(2)Slackワークスペースの作成・Slack APIの準備
(3)KMSキーの有効化を実施
(4)AmazonとLex Botを連携・統合させるための準備・設定
(5)Slackの動作を確認する。

######(1)AWSマネジメントコンソール｢Lex(V2)｣にアクセスしてBotを作成
言語は日本語にすると対応していないため
既定の言語：米国東部 (バージニア北部)us-east-1にしておく
※でもメニューなどは日本語表示

######botを作成
***ステップ1***
例から開始　サンプルボットでBookTrip「旅行を予約する」を選択
・名前→（例）SlackLexBotTest
・IAM アクセス許可→基本的な Amazon Lex 権限を持つロールを作成します。
・児童オンラインプライバシー保護法 (COPPA)→いいえ
※開発者ガイド記載→COPPAを有効にすると会話ログを使用することができない
・アイドルセッションタイムアウト
・▼詳細設定 - オプション
上記2項目は設定省略。


***ステップ2　ボットに言語を追加***
　・言語を選択：日本語(JP)
　・音声による対話→なし。これはテキストベースのアプリケーションです

ボット (BookTrip) が正常に作成されました
インシデント：BookHotel

***サンプル発話となる対話を代表的なフレーズを覚えておく***
![qita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/ccb9cb17-60af-744f-3a11-d332ed0333a4.png)

特にここは何もせず`[構築]`を押下そのまま閉じる
数秒待って正常に構築されたこと完了
ボット作成完了

######(2)Slackワークスペースの作成・Slack APIの準備


　 ***#lex botに対応したSlack APIをつくる***
   Slack APIにアクセス（英語・Google翻訳で日本語に翻訳もできる）
   https://api.slack.com/
　アプリを作成する[Create New App]
  -Create an app
　ゼロから指定[From Scratch]
 -Name app & choose workspace
　・アプリ名[App Name]：（例）Sample SlackBot
  ・WorkSpace：プライベートで作成したSlackのワークスペース

   ***#アプリをつくる***
   Building Apps for Slack
  Feautures＞Intravtive ＆　shortcut
　・Interactivityをオン
　・Request URLは https://slack.com　
（ここは後程lexbotのエンドポイントURLに入れ替わる）
　
　いったん設定を保存（`Save Changes`)
　
  ***#Lex Botを連携するための必要な情報を確認する。***
　Setting>BasicInformation>App Credentials
　内容をメモ帳にコピーペーストする（後にLex側で使用する）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/48c0bc03-f2f8-129a-67a3-5268bf7e9abe.png)

　
######(3)KMSキーの有効化（Slackと統合させるときに使う）
***AWS KMS***
データの暗号化に使用される暗号化キーの作成と管理のためのマネージド型サービス。
***KMSキー***
ボットチャットのテキストおよび音声ログの暗号化のために必要なアイテム

検索バーでKMSと検索。`Key Management Service`を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/3395b6c9-a8e5-01da-21b5-2a035fd4b0ad.png)

今すぐ始める　から　`キーの作成`ボタン押下

***ステップ1　キーを設定***
キーのタイプ：対称（暗号化および復号化）
詳細オプションタブはそのまま。
キーマテリアルオリジン：KMS
リージョンごと：単一リージョンキー

***ステップ2　ラベルを追加***
エイリアス(キーの表示名)：（例）aws_kms 
説明・タグは省略

***ステップ 3　キーの管理アクセス許可を定義***
・キー管理者
マネージメントコンソールでIAMロールユーザーとなっている
名前を確認して、チェックを入れる。
・キーの削除はチェック（管理者がこのキーを削除できるようにする）
※ここを設定すると管理費コストがかかる可能性があるため注意

***ステップ 4 キーの使用アクセス許可を定義***
暗号化オペレーションで CMK を使用できる IAM ユーザーとロールを選択
ステップ3と同義

***ステップ 5　確認***
キーポリシー　入力省略（いじらない）

`完了`

######(4)AmazonとLex Botを連携・統合させるための準備・設定
　***Amazon lex V2に戻る。***
　Lex＞ボット＞ボット: BookTrip＞デプロイメニューからチャネル統合
　チャネルを`追加`ボタン押下。
　プラットフォームを選択　で　Slack
　
　***統合設定***
　名前：（例）SlakBotTest
　エイリアス：（例）TestBotAilias　を選択
　言語：日本語(JP)で選択
　
　***追加設定***
　・クライアントID→SlackAPIのClient ID
　・KMSキー：(3)で自分が有効にしたキーを指定
　・クライアントシークレット→SlackAPIのClient Secret
　・検証トークン→SlackAPIのVerification Token
　・成功ページURL-オプション　→入力を省略
　`作成`ボタン押下

統合設定で出来上がったコールバック URLは
後程のlexと連携させるために必要な情報なので控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/fa55a897-bab8-c4fa-204e-88d25e14ee5a.png)

***SlackAPIに戻る***
***■App Home***
Messages TabをON　（LexBotがSlackのアプリとしてDM形式でやり取りを行うため）
Allow users to send Slash commands and messages from the messages tab
**ここにはチェックを入れる（ここを追加しないと後程Slackと連携したときに「このアプリのメッセージ送信が許可されていません」という文言が表示される。）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/8f346881-7fe8-8f30-3711-04d7017e94c0.png)


***■Interactivity & Shortcuts***
Request URLにLexのコールバックURLのエンドポイントURLをペーストして　`Save Changes`

***■OAuth & Permissions***
・Redirect URLs
Redirect URLsのAdd New Redirect URLを選択
LexのコールバックURLのOAuthエンドポイントURLをペーストして
`Save URLs`ボタン押下

***・Scopes***
Bot Token Scopes
`Add an OAuth Scope`を選択
検索ボックスが表示されたら以下を追加
***chat:write***
***team:read***

***■Event Subscriptions***
Enable Eventsをオン
Request URLに
エンドポイント
Request URLにLexのコールバックURLのエンドポイントURLをペーストして
`Save Changes`

***・Subscribe to bot events***
Add Bot User Event押下後
検索ボックスが表示されたら以下を追加
***message.im***

***■Manage Distribution***
`Add to Slack`選択
認証させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/6a88f649-7d9d-e88d-4112-b363e855d164.png)


SlackのAppsに「SlackBotTest」が表示されるのを確認する。


######(5)Slackの動作を確認する。
SlackのAppにアクセス。
SlackbotChatに
「ホテルを予約したいのですが」のメッセージを送る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586881/fcbb0767-8c72-1d40-83dd-b2c75c850ad4.png)


#■まとめ
　・無料で用意できるものであれば手順だけざっと理解するよりは
　　手を動かしてしまったほうが理解できる。

　**・なんとなくでもしくみがわかると面白いのでこういう感覚を大事にしたいと思った**
　　今回は連携させるのが目的だったのでLex側で用意されている
　　サンプルbotを使用してしまったが、きちんと考えたbotをここに反映させたい

　**・英語は理解できなくとも問題ない**
　　日本であまり普及されていないサービスであれば日本語マニュアルは
　　　用意されていない・整備されてないため（機械翻訳）
　　　多少なりとも覚悟は必要

　**・余計な設定は行わず、初心者は手順通りで**
　　Slac側で「このアプリがメッセージを送ることは許可されていません」表示が出てしまい
　　不安になってAPI側で色々権限を追加していたら、SlackとLexを連携するときに
　　リダイレクトループという現象に陥った
　　cookieを消したり、ブラウザ再起動させたり、ブラウザ切替などの
　　基本トラブルシューティングを行っても解消できず
　　リダイレクトループから抜け出せないため、 
　　`完全に自分のやったことが原因であることはわかった。`　
    　　何がリダイレクトの原因になっているかは明確には不明だが
　　APIに色々権限をつけていたのが読み込みを繰り返す原因だったようだ