首页 > 解决方案 > AWS Lambda 函数执行不显示执行成功的结果

问题描述

我目前正在使用 AWS Lambda 将 csv 数据集从 S3 获取到 RDS Mysql 表。我测试了一个我创建的完美执行的 lambda 函数,但由于某种原因,数据集没有插入到 RDS 中的数据库表中。

它可能是由触发器或 Lambda 以外的部分引起的,但我很难找到这里的问题,因为我对 AWS Lambda 非常陌生。

任何建议或建议将不胜感激。

这是 Lambda 函数:

import sys
import logging
import rds_config
import pymysql
import numpy as np
import csv
import pandas as pd
import mysql.connector
import sqlalchemy
from sqlalchemy import create_engine
import boto3
import botocore



Bucket_Name = 'ceo-project'

s3_client = boto3.client('s3')

name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name
rds_host = rds_config.rds_host

logger = logging.getLogger()

logger.setLevel(logging.INFO)
try:
    conn = pymysql.connect(host=rds_host, user=name, passwd=password, port =3306, db=db_name, connect_timeout=30)

except pymysql.MySQLError as e:
    logger.error("ERROR: Unexpected error: Could not connect to MySQL instance.")
    logger.error(e)
    sys.exit()

logger.info("SUCCESS: Connection to RDS MySQL instance succeeded")
engine = create_engine('mysql+pymysql://'+name+':'+password+'@'+rds_host+':3306'+'/'+db_name)

def handler(event, context):

    def S3_get_csv(Bucket_Name, Folder_Name,i):

        if isinstance(prefix, str):
            kwargs['Prefix'] = prefix

        while True: 
            resp = s3_client.list_objects_v2(Bucket=Bucket_Name, Prefix=Folder_Name+'/')
            latest = max(contents, key=lambda x: x['LastModified'])
            try:
                contents = resp['Contents']

            except KeyError:
                return

            for obj in contents:
                key = obj['Key']
                if key.startswith(prefix):
                    yield obj


        try:
            s3.Bucket(Bucket_Name).download_file(latest['Key'],latest['Key'].split(sep='/')[1])
            df = pd.read_csv(latest['Key'].split(sep='/')[1])
            df.to_sql(name=table_list[i], con=engine, if_exists = 'append', index=False,chunksize=10000,method='multi')
        except botocore.exceptions.ClientError as e:
            if e.resp['Error']['Code'] == "404":
                print("The object does not exist.")
            else:
                raise

    def get_matching_s3_keys(bucket, prefix='', suffix=''):
        for obj in get_matching_s3_objects(bucket, prefix):
            yield obj['Key']


    Folder_list = ['1','2','3','4','5','6','7']
    table_list = ['a','b','c','d','e','f','g']
    for i in range(0,7):
        S3_get_csv(Bucket_Name,Folder_list[i],i)

    return "CSV files inserted to RDS"

标签: pythonamazon-web-servicesamazon-s3aws-lambdaamazon-rds

解决方案


推荐阅读