はじめに
ここで言う小規模なSlack Botというのは個人で使うようなBotやチームレベルで使う書き捨てレベルのようなもののことです.
このような想定のBotを実装するときそこまでちゃんとインフラコストをかけたくありません.
自前でサーバーを用意したとして処理内容と維持管理費用が割に合わないのです.
無料でhttp serverを立ち上げることができるけど定期的にリクエストを送っておかなければプロセスがkillされるようなサービスもあります.
そのようなサービスを使う場合定期的にリクエストを送るか立ち上がるまで待った後Botのためのリクエストを送らないと機能しない問題があります.
それらの問題を解消するのにlambda functions URLsは要件にあってそうだなぁと思いました.
lambda function URLsはlambdaなので課金が発生する時間単位が短いのでたまにしか実行されないようなものでもサーバーを立てて実現するよりお金がかからないです.
またlambda function URLsにリクエストを投げるとlambdaのeventが発火して即時にlambda関数が実行されるので待ち時間も発生しません.
一つ問題があるとしたらlambdaのeventとして作成したプログラムから見えるので普段Botをhttpのapiとして実装している場合はhttp requestとlambdaのeventとのギャップを埋める必要があるということです.
とはいえそこまで大きな問題にはならないと思います.
特にGo言語の場合は
github.com/awslabs/aws-lambda-go-api-proxy/httpadapter
を利用するとほとんどhttp serverと同じような実装でアプリケーションを作ることができます.
Goでlambda function URLsを使ってリクエスト受ける例
github.com/awslabs/aws-lambda-go-api-proxy/httpadapter を利用した実装例を上げておきます.
frameworkを利用しない例
frameworkを利用しない例です.
生のGo言語でhttp serverを実装したことがある人なら雰囲気が解ると思います.
package main
import (
"io"
"net/http"
"github.com/aws/aws-lambda-go/lambda"
"github.com/awslabs/aws-lambda-go-api-proxy/httpadapter"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "It Works!")
})
// lambda function URLsはapi gateway v2と同じeventなのでv2にする必要がある
lambda.Start(httpadapter.NewV2(http.DefaultServeMux).ProxyWithContext)
}
Ginを利用した例
frameworkを利用することもできます.
例えばGinを利用する場合は次のように記述ができます.
package main
import (
"context"
"net/http"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
ginadapter "github.com/awslabs/aws-lambda-go-api-proxy/gin"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/", func(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"status": "ok",
})
})
lambda.Start(func(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) {
adapter := ginadapter.NewV2(r)
return adapter.ProxyWithContext(ctx, req)
})
}
ほぼ普通にGinでhttp APIを記述するのと変わらないですね.
ここでも気をつける点はV2を利用することくらいです.
http requestを受けられるようになったのであとは普段どおりSlackからのリクエストを受けるようにするとBot側のアプリケーションは実現可能です.
最後に
今回はSlack Botのようにわかりやすく待ち受けるアプリケーションを例に話を始めましたが,
近頃の円安や光熱費の高騰を考えると自宅サーバーやレンタルサーバーでは割にあわなかったので
lambda function URLsはインフラの選択肢を広げてくれてありがたいですね.
センサー系の計測データの投げ先とかにも使えると面白いかなぁなどと考えてます.
追記
lambda eventをbackend apiに流す方法を書きました.
lambda function URLsのeventをプロキシしてhttp apiに流す