AWS Lambda Go, Amazon Comprehend, Amazon Translate で作るSlack 翻訳Bot #aws #lambda #slack #golang #serverless

Go Support for AWS Lambda

もう発表されて結構経ちますが、AWS Lambdaでgolangが利用できるようになりました。

aws.amazon.com

待ちに待ってたので嬉しいのですが、業務でgolangを使う機会もなく・・・

LTのネタに

そんな状態のところにLTどうですか?とのお声がけがあったので、これはネタにするしかない!

mastercloud.connpass.com

と、いろいろと作業はしてみたのですが・・・結局間に合わずw

uchimanajet7.hatenablog.com

以前に書いたblogを資料にするだけになってしまいました・・・

speakerdeck.com

せっかくなので

とは言え、LTのネタにしようと作業自体は行っていたので時間のあるときにチマチマと作ってみてました。

github.com

とは言っても、機能自体は特に変更なく実装をAWS Lambda Goで行ったという感じです。

github.com

また、翻訳する部分をこれを書いている時点ではプレビューのAmazon Translateで行っています。当然ですが利用するにはプレビュー利用の申請が必要となります。

aws.amazon.com

加えて Amazon Translate には翻訳元の言語自動判定を行える機能がこれを書いている時点ではないようです。これを補う手段としてAmazon Comprehendを利用しています。

aws.amazon.com

結果としてAWSのサービスのみで完結することができたので、外部APIを使う際に気になる翻訳文字列を外部に送信するところは気にせずに済むようになりました。

AWS Lambda functions in Go

以下のリポジトリAWSが用意してくれたサンプルコードがあるので、特に困らず利用できると思います。

github.com

個人的には楽しみに待ってたので非常に嬉しいです。 実際に使ってみると

  • ビルド結果が1バイナリなので細かいことを気にしないで良い
  • デプロイも1バイナリなので簡単
  • AWS SAMとの相性も良さそう
  • 個人的に好きな言語なので開発が楽しい
  • イベントごとにハンドラーを用意すれば良さそう

github.com

  • 普段使ってるgolangのライブラリが使えるのはやっぱり便利
  • kelseyhightower/envconfig はステキ

github.com

  • nlopes/slack を使ってSlackとのやりとりを簡単に

github.com

  • Slack APIからinvalid_limit Error が戻って来る
  • どうやらライブラリ側の問題っぽい
  • せっかくだから Pull Request を出してみた

github.com

  • このような場合でもgo getした手元のコードを修正するだけで動作させられるのは気軽で簡単で良いです

Amazon Translate

f:id:uchimanajet7:20180223084357p:plain

翻訳のためにAWSのサービスであるAmazon Translateを使ってみました。

  • これを書いている時点ではプレビュー
  • 利用には申請が必要
  • プレビュー中なのもあってか対応言語が少なめ
  • 基本の言語である英語と以下の6言語

docs.aws.amazon.com

  • Arabic (ar)
  • Chinese (Simplified) (zh)
  • French (fr)
  • German (de)
  • Portuguese (pt)
  • Spanish (es)
  • 翻訳元の言語を自動判別する機能がない
  • これもプレビュー中なのもあってなのか、翻訳元か翻訳先の言語のどちらか片方が英語でなければダメ

docs.aws.amazon.com

  • SourceLanguageCode
    • One of the supported language codes for the source text. If the TargetLanguageCode is not "en", the SourceLanguageCode must be "en".

  • TargetLanguageCode
    • One of the supported language codes for the target text. If the SourceLanguageCode is not "en", the TargetLanguageCode must be "en".
  • 日本語への対応が待たれる
  • 今後のアップデートに期待

Amazon Comprehend

f:id:uchimanajet7:20180223084539p:plain

言語自動判別のためにAWSのサービスであるAmazon Comprehendを使ってみました。

  • 単純にSlackのメッセージを言語判定するAPIに渡しているだけ

docs.aws.amazon.com

  • Comprehendにも対応言語がある

docs.aws.amazon.com

  • 料金の設定で100 文字を単位として計算されるため、今回のような使い方だと勿体無い感がある

aws.amazon.com

自然言語処理 (NLP): Amazon Comprehend のエンティティ認識、感情分析、キーフレーズ抽出、言語検出のリクエストは、100 文字単位で計算され、各リクエストにつき 3 単位 (300 文字) が最低料金となります。

  • 実際に今回の使い方だと思ったより料金がかかる印象
  • Comprehend自体がもっと大量の文章を対象にしているためな気がする
  • 複数の言語が混在している場合の自動判定結果
  • 他のサービスでも同様だがこの辺の判定が思ってるものと違うと利用が難しい
  • ComprehendはAWSマネジメントコンソールから簡単に試せるので触ってみるのが良い

AWS Serverless Application Model (AWS SAM)

デプロイのためにAWS Serverless Application Model (AWS SAM)を使ってみました。

docs.aws.amazon.com

  • golangはビルド結果が1バイナリなので相性が良かった
  • LambdaとAPI Gatewayしか設定してないのでテンプレートも簡単だった
  • 複雑なことをしないなら手軽でいい感じ
  • 環境変数を設定するのでオプションの設定が手軽にできると良い気がする
  • せっかくのgolangなのにAWS CLIの利用が前提なのが若干残念

docs.aws.amazon.com

  • 今後もLambda Goを使うなら一緒に使っていこうと思った

まとめ

  • AWS Lambda を利用するならAWSのサービスで完結している方が楽
  • 認証もIAMロールで行えるので色々気にする必要なし
  • 外部のAPIにデータを送信することもないので、こちらも色々気にする必要なし
  • SlackからのWebhookを受ける場合は、やっぱり非同期処理しないと複数回受信する(Lambdaのコールドスタートのため)
  • この使い方だと粒度が小さすぎるのかComprehend の料金がちょっと気になる
  • Translate 側で言語自動判別ができるようななれば、Comprehend は不要となるのでアップデートに期待したい
  • 他の絵文字と合わせるためにSlackの国旗絵文字の文字列が変更になったっぽい

get.slack.help

www.webpagefx.com

  • 一部の絵文字国旗でflag−で始まらないものがある(:de: :jp: など)

f:id:uchimanajet7:20180223091838p:plain

  • 絵文字文字列の変更を真面目にウォッチするのは大変そう
  • ちゃんと使うならこの辺も考えないとだめそう
  • あ、Lambda Goは楽しいのでおすすめです!

以上になります。