lambda 找不到 S3 存储桶

问题描述 投票:0回答:1

我有一个 lambda,在其中进行 api 调用以获取一些股票数据,然后想要将 csv 写入存储桶。当我在 python 3.9.7 中从家里运行时,它工作正常。 Lambda 是 python 3.11。当我尝试使用 python 3.9.7 时,我仍然遇到相同的错误,因此,问题显然与此无关。 这是我在 lambda 中遇到的错误:

An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation

我正在使用 IAM 角色运行 lambda,该角色嵌套了“AmazonS3FullAccess”策略 我的存储桶将“阻止公共访问”设置为“打开”,并且没有存储桶策略。 对象所有权设置为存储桶所有者。访问控制列表是默认的。 Bucket 和 lambda 位于同一区域。我在 lambda 中也有一个层(AWSSDKPandas-Python311) 这是我的代码:

import awswrangler as wr
import time
from datetime import date, timedelta
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def lambda_handler(event, context):

    today = date.today()
    now = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
    yesterday = today - timedelta(days=1)
    
    exchanges = ["SR"]
    
    SMTP_SERVER = 'email-smtp.us-east-1.amazonaws.com'
    SMTP_PORT = 587  # Update to the appropriate port
    SMTP_USERNAME = '99999999999'
    SMTP_PASSWORD = '999d9999999999999999'
    
    # Sender and recipient email addresses
    SENDER_EMAIL = '[email protected]'
    RECIPIENT_EMAILS = ['[email protected]', '[email protected]']
    
    
    
    def send_email(subject, body):
        msg = MIMEMultipart()
        msg['From'] = SENDER_EMAIL
        msg['To'] = ', '.join(RECIPIENT_EMAILS)
        msg['Subject'] = subject
        msg.attach(MIMEText(body, 'plain'))
    
        try:
            with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
                server.starttls()
                server.login(SMTP_USERNAME, SMTP_PASSWORD)
                server.sendmail(SENDER_EMAIL, RECIPIENT_EMAILS, msg.as_string())
                print(f"Email sent successfully: {subject}")
        except Exception as e:
            print(f"Email sending failed: {str(e)}")
    
    
    try:
        for ex in exchanges:
    
            df = wr.s3.read_json(
                f's3://eodhistoricaldata.com/api/eod-bulk-last-day/{ex}?api_token=5f199920.009991&fmt=json&date={str(today)}',
                dtype={'code': str})
    
            print(df.head(5))
            if not df.empty:
    
                df = df.dropna(thresh=7)
                print(df.tail(5))
                x = df['code'].astype(str)
    
                Ticker = x.str.slice(0, 38)
    
                Exchange = df['exchange_short_name']
                Date = df['date']
                Open = df['open']
                High = df['high']
                Low = df['low']
                Close = df['close']
                Volume = df['volume']
    
    
                total_df = wr.pandas.concat([Ticker, Exchange, Date, Open, High, Low, Close, Volume],
                                     axis=1, keys=['Ticker', 'Exchange', 'Date', 'Open', 'High', 'Low', 'Close', 'Volume'])
    
                filename = f"{ex}_{str(now)}.csv"
                path = 's3://olaptrader-9999/'
                full_path = path + filename
                
                wr.s3.to_csv(total_df, full_path, index=False)
    
    
    except Exception as e:
    
        error_message = f"Error occurred in '{ex}' ingestion: {str(e)}"
        print(error_message)
        print(e)
    
        #send_email(f"{error_message}: Error in '{ex}' ingestion", str(e))

我在这里缺少什么? 更新,我也尝试过使用 boto 库和这个变体,但得到了同样的错误

bucket_name = 'olaptrader-9999'
filename = f"{ex}_{str(now)}.csv"
key = f"{filename}"
csv_buffer = total_df.to_csv(index=False)
s3 = boto3.client('s3')
s3.put_object(Bucket=bucket_name, Key=key, Body=csv_buffer)

(An error occurred (NoSuchBucket) when calling the ListObjectsV2 operation)

我现在通过使用 pandas 而不是 awswrangler 克服了这个错误。我不认为我的 lambda 层里有熊猫。我现在得到一个空白数据框。我可以卷曲到 cloudshell 中的端点并获取数据,但不能从 lambda 获取数据。我想我可能必须修改 lambda 使用的 IAM 角色的权限。要么我需要一个 NAT 网关。 最终决议。我不需要 nat 网关或不同的 IAM 策略。我得到一个空的有效负载,因为 lambda 采用 UTC,因此已经过了午夜。午夜之后,直到第二天凌晨 5 点,负载将是空的。因此,主要问题是通过使用 pandas 而不是 awswanger 解决的。感谢所有建议。

python amazon-web-services amazon-s3 aws-lambda amazon-iam
1个回答
0
投票

因此,通过使用 pandas 而不是 awswanger 解决了主要问题。当我开始让它工作但负载为空时,我认为我需要 IAM 角色更改或 NAT 网关,但我没有。我得到一个空的有效负载,因为 lambda 采用 UTC,因此已经过了午夜。午夜之后,直到第二天凌晨 5 点,负载将是空的。感谢您的所有建议。

© www.soinside.com 2019 - 2024. All rights reserved.