はじまり
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回目の処理時はコネクション作成のログがでていない
原因
わかってみると当たり前なんですけど、
Lambdaコンテナーロード時はhandler以外の部分も実施されるけど、
Lambdaコンテナーにある間はhandlerしか呼ばれないんですね
だから、チュートリアルには、下記のように書かれていたのかと納得
パフォーマンス向上のために、ここに示されているように pymysql.connect() はハンドラー外で実行することをお勧めします。
コンテナーロードされた初回は、
コネクション作成(というかPGロード)⇒handler実行⇒SELECT⇒コネクションクローズ
コンテナーロードされている状態の2回目以降は
handler実行⇒SELECTするがコネクションクローズされているのでエラー
という状況でした
[conn.close()]を外して、処理実施すると、初回も2回目以降もエラーなく処理できるようになりました
Lambda、pythonとも初心者な状態で、調子のってコネクションクローズいれてみたおかけで、
勉強になりました。。。