🍸

【解決方法】AWS API Gateway v2(HTTP)でGinLambdaを利用すると、アプリに到達するパスが全て「/」になる。

2024/06/05に公開

やったこと

Go言語のWebフレームワークGinで作成したAPIサーバをAWS Lambdaへデプロイした。

デプロイにあたっては以下の記事を参考にした。
https://community.aws/content/2dfslNPsgNJOxj2GDAhg7kAyJ6h/golang-and-aws-lambda-02-golang-gin-app-on-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