🍸
【解決方法】AWS API Gateway v2(HTTP)でGinLambdaを利用すると、アプリに到達するパスが全て「/」になる。
やったこと
Go言語のWebフレームワークGin
で作成したAPIサーバをAWS Lambdaへデプロイした。
デプロイにあたっては以下の記事を参考にした。
困ったこと
API Gatewayのエンドポイントへリクエストを送信した際に、アプリに到達するリクエストのパスが/
になってしまう。
リクエスト
$ curl https://xxxxx/hello
CloudWatchLogsに出力されていたログ
[GIN] 2024/06/05 - 02:50:36 | 404 | 1.124µs | | GET "/"
#=> GET "/hello" となるのが期待動作だが、GET "/"となってしまっている。
問題点
参考にしたページに記載されていたサンプルコードがAWS API Gateway v1(REST)
対応版だった。
解決方法
GinLambda
を利用せず、GinLambdaV2
を利用する。
- 修正前 / + 修正後
- var ginLambda *ginadapter.GinLambda
+ var ginLambda *ginadapter.GinLambdaV2
func init() {
r := gin.Default()
r.POST("/app", CreateShortURL)
r.GET("/app/:shortcode", GetShortURL)
r.DELETE("/app/:shortcode", DeleteShortURL)
r.PUT("/app/:shortcode", UpdateStatus)
- ginLambda = ginadapter.New(r)
+ ginLambda = ginadapter.NewV2(r)
}
- func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
+ func Handler(ctx context.Context, req events.APIGatewayV2HTTPRequest) (events.APIGatewayV2HTTPResponse, error) {
return ginLambda.ProxyWithContext(ctx, req)
}
func main() {
lambda.Start(Handler)
}
動作確認
GinLambdaV2
を利用することで、リクエストのパスがアプリへ到達するようになった。
リクエスト
$ curl https://xxxxx/hello
CloudWatchLogsに出力されていたログ
[GIN] 2024/06/05 - 04:47:23 | 200 | 2.208919ms | | GET "/hello"
#=> 期待動作となった。
Discussion