aws chaliceを使ってslackの翻訳botを作ってみた #aws #chalice #slack #bot

AWS Developers Meetup

先日開催された AWS Developers Meet Up という開発者向けのイベントに参加してきました。

AWS Developers Meet Up(2017 年 12 月 7 日開催)
https://pages.awscloud.com/DeveloperMeetup20171207.html

第1回目ということもあって、AWS SDKの紹介を交えつつ実際にAWS Cloud9を動かしてライブコーディングがあったりして、2回目以降の開催にも楽しみになる感じのイベントでした。

aws.amazon.com

aws.amazon.com

また、AWS AmplifyAWS Mobile CLIを紹介するデモではちょっとしたトラブルもあったりしましたが、逆に参加者の皆さんがトラブル解消のためにすごい画面に集中して一体感が出るという一幕もw

aws.amazon.com

github.com

個人的に楽しみに見に行ったのは Chalice(Python Serverless Microframework for AWS) のお話

github.com

すごい手軽に使えて、IAM ポリシーを自動生成してくれるのが素敵なのが気に入っているので、これまでも↓

uchimanajet7.hatenablog.com

uchimanajet7.hatenablog.com

uchimanajet7.hatenablog.com

な感じで使ってみています。

Slack Developer Meetup Tokyo

少し前に開催された Slack Developer Meetup Tokyo という開発者向けのイベントに参加してきました。

slackdevtokyo.splashthat.com

その中で紹介されていた、emojiリアクションでメッセージを翻訳するbotをつくるというのがちょー楽しそうだったんです。

www.slideshare.net

JavaScriptで作られたbotのコードは公開されていて、Herokuへのデプロイならデプロイボタンもあってちょー楽そう。

github.com

しかし、JavaScriptはこの前のServerlessconf Tokyo 2017 Workshopのコードを触った時にだいぶ苦労したので避けたい気持ちがw

uchimanajet7.hatenablog.com

ということで

slack 翻訳botも楽しそうだし久しぶりに chalice も触りたいということで、chalice を使って公開されているslackapi/reacjilatorと同じように動くものを作ってみました。

github.com

基本的には公開されている slackapi/reacjilatorchalice利用して実装し直しただけになります。

変更点はGoogle翻訳は無料枠がないので、次の資料を参考にして無料の翻訳APIを利用するようにしてあります。

omohikane.com

王道は Microsoft Translator API なんですが利用したことがあるのと、無料アカウントでも取得するのに多少手間があるので、使ったことのないYandex APIを使ってみました。

マイクロソフトアカウントの登録方法なんかは以前書いたAzureの記事をご覧ください。

uchimanajet7.hatenablog.com

コードは量も多くないので他の翻訳APIに変更するのも大変ではないと思います。 また、当然ですが翻訳APIを利用するということはAPIに文字列を送信するということなので、十分理解した上で翻訳APIの利用先と利用を決めてください。

Yandex API

無料で使えて登録も簡単な翻訳APIを調べていて初めて知りました・・・ ロシアでGoogleみたいなことやってるんですねー

Yandex - Wikipedia
https://ja.wikipedia.org/wiki/Yandex

翻訳APIの利用登録は非常に簡単で、GoogleアカウントがあればログインしてAPIキーを取得するだけで利用開始できます。

tech.yandex.com

ドキュメントもAPIそのものも非常にシンプルなので、特に困るところはないかと思います。動作を確認するとかそういう用途では手軽で嬉しいですね。

実際に利用する際にはAPIに文字列が送信されるということを考えてお使いください。

準備

上記翻訳API(yandex)の準備とSlackの公開されているスライドを参考に準備を行ったら、実行に必要なAPIキーなどの情報を書き足してchalice deployを実行すれば、API GatewayのエンドポイントとLambdaを利用できるようになります。

翻訳APIを他のものに切り替える場合は、APIを呼び出す部分を個別に実装すれば切り替えできると思います。

国旗絵文字の文字列から翻訳APIに渡すための変換は↓を参考にしてください。

Language Support  |  Translation API  |  Google Cloud Platform
https://cloud.google.com/translate/docs/languages?hl=en

Translator Language Codes
https://msdn.microsoft.com/en-us/library/hh456380.aspx

tech.yandex.com

AWS Lambda はAPI Gatewayから呼び出されるものと、Amazon SNSから呼び出されるものがあります。

これはSlackのAPIがリクエストを受けてから、一定時間内にレスポンスを返さないとリクエストを再送する仕組みがあり、Lambdaのコールドスタート時に複数のリクエストが送信される可能性を低くするためです。

chaliceではAWS CloudFormationをサポートしているので、AWS CLIと組み合わせることでAmazon SNSなどの他リソースを同時に構築することができます。

AWS CloudFormation Support — Python Serverless Microframework for AWS 1.1.0 documentation
http://chalice.readthedocs.io/en/latest/topics/cfn.html

使ってみる

https://user-images.githubusercontent.com/6448792/34078201-01eec178-e359-11e7-8494-17d044371c5f.gif

国旗絵文字をリアクションすると、その国の言葉に翻訳されます。 翻訳API側が対応してないとbotからの返答がないようにしてあります。

f:id:uchimanajet7:20171217183210p:plain

The message is translated in :flag-ca: (ja-en)

のように、翻訳元の言語と翻訳先の言語がわかるようにはしてあります。 上記の例だとja(日本語)からen(英語)となります。 翻訳APIからの戻り値ですが、基本的にはISO 639-1のコードと同等のようです。

List of ISO 639-2 codes - Wikipedia
https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes

まとめ

  • 勉強会やイベントに行くと知らないことや、やってみたいことのきっかけになるのはやっぱりいいな
  • 入出力にSlackを使うのは手軽だし分かりやすい
  • 今回みたいなBotだと全チャンネルではなく、特定のチャンネルにデプロイしたい。
  • 外部APIに文字列を送るとなると予期せず動作するのは好ましくない気がする。
  • 今回はプログラム側で許可するチャンネル一覧を持って対処した。
  • slack側で設定できる場所があれば教えてほしい
  • チャンネルリストもディスプレイ文字列ではだめで、チャンネルIDが必要だった
  • チャンネルIDの取得の仕方については以下を参考にした

qiita.com

  • chalice はやっぱり手軽でこういうちょっとした用途だと便利
  • SNSを使って非同期にしてあるが単純にLambdaのinvokeでもよかったかもしれない
  • その場合chalice側でLambda関数名が付与されるので、そのあたりをもうちょっとスマートにしてもらえるといいなーと
  • 時間をみつけてchaliceのソースを見てみようと思った
  • Lambdaなので外部APIとのやりとりもX−Rayを使えば可視化もできて便利
  • 今回は利用してないが、他の翻訳APIも複数利用する場合とかあればX−Rayも使ってみたい

docs.aws.amazon.com

  • やっぱりわくわくしながら作るのは楽しくて良いです
  • やはり楽しいは正義ですね

以上になります。