LoginSignup
3
3

More than 5 years have passed since last update.

Lambda×pythonでコネクションクローズのエラーが発生

Posted at

はじまり

Lambda×pythonでRDS接続する処理が必要になったので、AWSチュートリアルを
元々あるテーブルからselectして返す感じにちょい変更して作成
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc-rds-deployment-pkg.html

チュートリアルではコネクションをクローズしている様子がなく、
「おいおい、コネクションクローズしないとかバカかよ」とか思いながらコネクションクローズをいれる
俺がバカでした。。。

# -*- coding: utf-8 -*-

import json
import datetime


import sys
import logging
import rds_config
import pymysql
#rds settings
rds_host  = "DBのエンドポイント"
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name


logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")
def handler(event, context):
    """
    This function fetches content from mysql RDS instance
    """

    item_count = 0

    with conn.cursor() as cur:
        cur.execute("select id from table limit 1")
        for row in cur:
            data = row
            #print(row)
    conn.close()

    return {'statusCode': 200,
            'body': json.dumps(data),
            'headers': {'Content-Type': 'application/json'}}

試し

1回目の処理は成功
おぉ!上手く行ったと感動
2回目たたくとInternalServerエラー
へっ?とログを確認
すると、1回目の処理時はコネクション作成OKのログがでているけど、
2回目の処理時はコネクション作成のログがでていない

CloudWatchLog.JPG

原因

わかってみると当たり前なんですけど、
Lambdaコンテナーロード時はhandler以外の部分も実施されるけど、
Lambdaコンテナーにある間はhandlerしか呼ばれないんですね

だから、チュートリアルには、下記のように書かれていたのかと納得

パフォーマンス向上のために、ここに示されているように pymysql.connect() はハンドラー外で実行することをお勧めします。

コンテナーロードされた初回は、
コネクション作成(というかPGロード)⇒handler実行⇒SELECT⇒コネクションクローズ
コンテナーロードされている状態の2回目以降は
handler実行⇒SELECTするがコネクションクローズされているのでエラー
という状況でした

[conn.close()]を外して、処理実施すると、初回も2回目以降もエラーなく処理できるようになりました

Lambda、pythonとも初心者な状態で、調子のってコネクションクローズいれてみたおかけで、
勉強になりました。。。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3