【AWS Lambda】PythonでS3からCSVを取得しRDSへ一括挿入してみた
検証用に作りました。もっとこうした方がいいよなどありましたら是非教えてください!:)
1. 何をしたいか
・S3にCSVをアップロードされたらLambdaを発火させる
・LambdaでアップロードされたCSVの全レコードを取得してRDS(MySQL)に一括挿入
2. Pythonコード
※RDS接続情報は本来機密情報なので、SecretsManager等で管理
※pymysqlモジュールはLambda Layerに格納した前提
import json import boto3 import sys import csv import pymysql import logging #rds settings rds_host = "database-1.XXXXXXXX.ap-northeast-1.rds.amazonaws.com" rds_user = "admin" rds_password = "XXXXXX" db_name = "testdb" logger = logging.getLogger() logger.setLevel(logging.INFO) s3_client = boto3.client('s3') def lambda_handler(event, context): logger.info("Starting to read csvfile from S3 ") bucket_name = event['Records'][0]['s3']['bucket']['name'] csv_file = event['Records'][0]['s3']['object']['key'] lines = csv_file_object['Body'].read().decode('utf-8').split() # read each line in csvfile results = [] csv_file = csv.reader(lines) # skip the header header = next(csv_file) for row in csv_file: results.append(row) print(row) print(results) logger.info("Connecting to RDS") # Connect to RDS connection = pymysql.connect(host=rds_host, user=rds_user, passwd=rds_password, db=db_name, connect_timeout=5) logger.info("Inserting records to RDS") sql_insert_Query = "INSERT INTO access (hostname, user, systemid) VALUES (%s,%s,%s)" cursor = connection.cursor() cursor.executemany(sql_insert_Query,results) connection.commit() print(cursor.rowcount, "Record inserted successfully into testdb table") return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }