かけだしいんふら

いんふら女子の学習めも。

【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!')
    }