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 Amplify
とAWS Mobile CLI
を紹介するデモではちょっとしたトラブルもあったりしましたが、逆に参加者の皆さんがトラブル解消のためにすごい画面に集中して一体感が出るという一幕もw
個人的に楽しみに見に行ったのは Chalice
(Python Serverless Microframework for AWS) のお話
すごい手軽に使えて、IAM ポリシーを自動生成してくれるのが素敵なのが気に入っているので、これまでも↓
な感じで使ってみています。
Slack Developer Meetup Tokyo
少し前に開催された Slack Developer Meetup Tokyo
という開発者向けのイベントに参加してきました。
その中で紹介されていた、emojiリアクションでメッセージを翻訳するbotをつくるというのがちょー楽しそうだったんです。
www.slideshare.net
JavaScriptで作られたbotのコードは公開されていて、Herokuへのデプロイならデプロイボタンもあってちょー楽そう。
しかし、JavaScriptはこの前のServerlessconf Tokyo 2017 Workshopのコードを触った時にだいぶ苦労したので避けたい気持ちがw
ということで
slack 翻訳botも楽しそうだし久しぶりに chaliceも触りたいということで、chaliceを使って公開されているslackapi/reacjilator
と同じように動くものを作ってみました。
基本的には公開されている slackapi/reacjilator
をchalice
利用して実装し直しただけになります。
変更点はGoogle翻訳は無料枠がないので、次の資料を参考にして無料の翻訳APIを利用するようにしてあります。
王道は Microsoft Translator API
なんですが利用したことがあるのと、無料アカウントでも取得するのに多少手間があるので、使ったことのないYandex API
を使ってみました。
マイクロソフトアカウントの登録方法なんかは以前書いたAzureの記事をご覧ください。
コードは量も多くないので他の翻訳APIに変更するのも大変ではないと思います。 また、当然ですが翻訳APIを利用するということはAPIに文字列を送信するということなので、十分理解した上で翻訳APIの利用先と利用を決めてください。
Yandex API
無料で使えて登録も簡単な翻訳APIを調べていて初めて知りました・・・ ロシアでGoogleみたいなことやってるんですねー
翻訳APIの利用登録は非常に簡単で、GoogleアカウントがあればログインしてAPIキーを取得するだけで利用開始できます。
ドキュメントもAPIそのものも非常にシンプルなので、特に困るところはないかと思います。動作を確認するとかそういう用途では手軽で嬉しいですね。
実際に利用する際にはAPIに文字列が送信されるということを考えてお使いください。
準備
上記の翻訳API(yandex)
の準備とSlack
の公開されているスライドを参考に準備を行ったら、実行に必要なAPIキーなどの情報を書き足してchalice deploy
を実行すれば、APIGatewayのエンドポイントと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
AWS Lambda はAPIGatewayから呼び出されるものと、AmazonSNSから呼び出されるものがあります。
これはSlackのAPIがリクエストを受けてから、一定時間内にレスポンスを返さないとリクエストを再送する仕組みがあり、Lambdaのコールドスタート時に複数のリクエストが送信される可能性を低くするためです。
chaliceではAWS CloudFormationをサポートしているので、AWSCLIと組み合わせることでAmazonSNSなどの他リソースを同時に構築することができます。
AWS CloudFormation Support — Python Serverless Microframework for AWS 1.1.0 documentation
http://chalice.readthedocs.io/en/latest/topics/cfn.html
使ってみる
国旗絵文字をリアクションすると、その国の言葉に翻訳されます。 翻訳API側が対応してないとbotからの返答がないようにしてあります。
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の取得の仕方については以下を参考にした
- chaliceはやっぱり手軽でこういうちょっとした用途だと便利
- SNSを使って非同期にしてあるが単純にLambdaのinvokeでもよかったかもしれない
- その場合chalice側でLambda関数名が付与されるので、そのあたりをもうちょっとスマートにしてもらえるといいなーと
- 時間をみつけてchaliceのソースを見てみようと思った
- Lambdaなので外部APIとのやりとりもX−Rayを使えば可視化もできて便利
- 今回は利用してないが、他の翻訳APIも複数利用する場合とかあればX−Rayも使ってみたい
- やっぱりわくわくしながら作るのは楽しくて良いです
- やはり楽しいは正義ですね
以上になります。