Lambda(Go)でLambdaパッケージを書き忘れて無限ループした話

2023.07.07

こんにちは、ゲームソリューション部のsoraです。
今回は、Lambda(Go)でLambdaパッケージを書き忘れて無限ループした話について書いていきます。

Lambdaでの無限ループ

以下のLambda(Go)にてテストを実行したところ、実行ログにエラーが表示されました。

package main

import(
	"database/sql"
	"github.com/go-sql-driver/mysql"
	"fmt"
	"crypto/tls"
)

func main() {
	// TiDBへの接続
	mysql.RegisterTLSConfig("tidb", &tls.Config{
		MinVersion: tls.VersionTLS12,
		ServerName: "[TiDB Cloudで表示された接続コード]",
	})
	db, err := sql.Open("mysql", "[TiDB Cloudで表示された接続コード]")
	if err != nil {
		fmt.Println("DB connection error")
	}
	defer db.Close()

	// SQL実行
	rows, err := db.Query("SELECT * from PrefecturesTable")
	if err != nil {
		fmt.Println("SQL error")
	}
	defer rows.Close()

	fmt.Println("都道府県名, 県庁所在地, 地域")
	for rows.Next() {
		var prefecturename, prefecturalcapital, region string
		err := rows.Scan(&prefecturename, &prefecturalcapital, ®ion)
		if err != nil {
			fmt.Println("Scan error")
			return
		}
		fmt.Printf("%s, %s, %s\n", prefecturename, prefecturalcapital, region)
	}
}
{
    "errorType": "Runtime.ExitError",
    "errorMessage": "RequestId: f7f6ec4d-d82a-4756-9eb7-d009cfb405e1 Error: Runtime exited with error: exit status 1"
}
"都道府県名, 県庁所在地, 地域"
・・・
2023/06/29 07:36:05 <nil>
"都道府県名, 県庁所在地, 地域"
・・・
2023/06/29 07:36:06 <nil>
"都道府県名, 県庁所在地, 地域"
・・・

原因→解消

原因が何かを考えていて、rows.Next()で無限ループしているのかと思ったものの、そうであればfmt.Println("都道府県名, 県庁所在地, 地域")が何度も実行されているのはおかしいし、実行ログに日付と時間が出ているのもおかしいと思っていました。

原因としては、github.com/aws/aws-lambda-go/lambdaパッケージを利用しておらず、lambda.Start()を使用せずにmainにそのままコードを書いていることが問題です。
公式ページに記載の通り、github.com/aws/aws-lambda-go/lambdaパッケージを含める必要があります。

以下が修正版のコードです。

package main

import(
	"database/sql"
	"github.com/go-sql-driver/mysql"
    "github.com/aws/aws-lambda-go/lambda"
	"fmt"
	"crypto/tls"
)

func TiDBOperation() () {
	// TiDBへの接続
	mysql.RegisterTLSConfig("tidb", &tls.Config{
		MinVersion: tls.VersionTLS12,
		ServerName: "[TiDB Cloudで表示された接続コード]",
	})
	db, err := sql.Open("mysql", "[TiDB Cloudで表示された接続コード]")
	if err != nil {
		fmt.Println("DB connection error")
	}
	defer db.Close()

	// SQL実行
	rows, err := db.Query("SELECT * from PrefecturesTable")
	if err != nil {
		fmt.Println("SQL error")
	}
	defer rows.Close()

	fmt.Println("都道府県名, 県庁所在地, 地域")
	for rows.Next() {
		var prefecturename, prefecturalcapital, region string
		err := rows.Scan(&prefecturename, &prefecturalcapital, ®ion)
		if err != nil {
			fmt.Println("Scan error")
			return
		}
		fmt.Printf("%s, %s, %s\n", prefecturename, prefecturalcapital, region)
	}
}

func main() {
    lambda.Start(TiDBOperation)
}

最後に

今回は、Lambda(Go)でLambdaパッケージを書き忘れて無限ループした話を記事にしました。
どなたかの参考になると幸いです。