Go Support for AWS Lambda
もう発表されて結構経ちますが、AWS Lambdaでgolangが利用できるようになりました。
待ちに待ってたので嬉しいのですが、業務でgolangを使う機会もなく・・・
LTのネタに
そんな状態のところにLTどうですか?とのお声がけがあったので、これはネタにするしかない!
と、いろいろと作業はしてみたのですが・・・結局間に合わずw
以前に書いたblogを資料にするだけになってしまいました・・・
せっかくなので
とは言え、LTのネタにしようと作業自体は行っていたので時間のあるときにチマチマと作ってみてました。
とは言っても、機能自体は特に変更なく実装をAWS Lambda Go
で行ったという感じです。
また、翻訳する部分をこれを書いている時点ではプレビューのAmazon Translate
で行っています。当然ですが利用するにはプレビュー利用の申請が必要となります。
加えて Amazon Translate
には翻訳元の言語自動判定を行える機能がこれを書いている時点ではないようです。これを補う手段としてAmazon Comprehend
を利用しています。
結果としてAWSのサービスのみで完結することができたので、外部APIを使う際に気になる翻訳文字列を外部に送信するところは気にせずに済むようになりました。
AWS Lambda functions in Go
以下のリポジトリにAWSが用意してくれたサンプルコードがあるので、特に困らず利用できると思います。
個人的には楽しみに待ってたので非常に嬉しいです。 実際に使ってみると
- ビルド結果が1バイナリなので細かいことを気にしないで良い
- デプロイも1バイナリなので簡単
- AWS SAMとの相性も良さそう
- 個人的に好きな言語なので開発が楽しい
- イベントごとにハンドラーを用意すれば良さそう
- 普段使ってるgolangのライブラリが使えるのはやっぱり便利
kelseyhightower/envconfig
はステキ
nlopes/slack
を使ってSlackとのやりとりを簡単に
- Slack APIから
invalid_limit
Error が戻って来る - どうやらライブラリ側の問題っぽい
- せっかくだから Pull Request を出してみた
- このような場合でも
go get
した手元のコードを修正するだけで動作させられるのは気軽で簡単で良いです
Amazon Translate
翻訳のためにAWSのサービスであるAmazon Translate
を使ってみました。
- これを書いている時点ではプレビュー
- 利用には申請が必要
- プレビュー中なのもあってか対応言語が少なめ
- 基本の言語である英語と以下の6言語
- Arabic (ar)
- Chinese (Simplified) (zh)
- French (fr)
- German (de)
- Portuguese (pt)
- Spanish (es)
- 翻訳元の言語を自動判別する機能がない
- これもプレビュー中なのもあってなのか、翻訳元か翻訳先の言語のどちらか片方が英語でなければダメ
- 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
言語自動判別のためにAWSのサービスであるAmazon Comprehend
を使ってみました。
- 単純にSlackのメッセージを言語判定するAPIに渡しているだけ
- Comprehendにも対応言語がある
- 料金の設定で
100 文字を単位として計算
されるため、今回のような使い方だと勿体無い感がある
自然言語処理 (NLP): Amazon Comprehend のエンティティ認識、感情分析、キーフレーズ抽出、言語検出のリクエストは、100 文字単位で計算され、各リクエストにつき 3 単位 (300 文字) が最低料金となります。
- 実際に今回の使い方だと思ったより料金がかかる印象
- Comprehend自体がもっと大量の文章を対象にしているためな気がする
- 複数の言語が混在している場合の自動判定結果
- 他のサービスでも同様だがこの辺の判定が思ってるものと違うと利用が難しい
- ComprehendはAWSマネジメントコンソールから簡単に試せるので触ってみるのが良い
AWS Serverless Application Model (AWS SAM)
デプロイのためにAWS Serverless Application Model (AWS SAM)
を使ってみました。
- golangはビルド結果が1バイナリなので相性が良かった
- LambdaとAPI Gatewayしか設定してないのでテンプレートも簡単だった
- 複雑なことをしないなら手軽でいい感じ
- 環境変数を設定するのでオプションの設定が手軽にできると良い気がする
- せっかくのgolangなのにAWS CLIの利用が前提なのが若干残念
- 今後もLambda Goを使うなら一緒に使っていこうと思った
まとめ
- AWS Lambda を利用するならAWSのサービスで完結している方が楽
- 認証もIAMロールで行えるので色々気にする必要なし
- 外部のAPIにデータを送信することもないので、こちらも色々気にする必要なし
- SlackからのWebhookを受ける場合は、やっぱり非同期処理しないと複数回受信する(Lambdaのコールドスタートのため)
- この使い方だと粒度が小さすぎるのかComprehend の料金がちょっと気になる
- Translate 側で言語自動判別ができるようななれば、Comprehend は不要となるのでアップデートに期待したい
- 他の絵文字と合わせるためにSlackの国旗絵文字の文字列が変更になったっぽい
- 一部の絵文字国旗でflag−で始まらないものがある(:de: :jp: など)
- 絵文字文字列の変更を真面目にウォッチするのは大変そう
- ちゃんと使うならこの辺も考えないとだめそう
- あ、Lambda Goは楽しいのでおすすめです!
以上になります。