如何使用Python编写的Lambda函数将文件上传到Amazon S3?
代码存在的核心问题
- 入口函数未触发上传逻辑:
lambda_handler是Lambda函数的默认执行入口,你仅在该函数内定义了文件路径和桶名两个变量,没有调用upload_file函数,上传逻辑全程不会执行。 - 缩进语法错误:Python依赖缩进区分代码块,当前
upload_file函数下的所有逻辑都没有正确缩进,不属于函数体内容,代码本身存在语法错误,无法正常运行。 - 本地路径在Lambda环境无效:Lambda运行在AWS的隔离执行环境中,不存在你本地的
/Users/thesadmermaid/Downloads/grafico.csv路径,无法读取到对应文件。如果需要用到该文件,需要把文件和代码一起打包上传到Lambda,部署后通过相对路径读取;如果是运行时生成的文件,需要写入Lambda唯一可写的临时目录/tmp。 - S3桶名不符合命名规范:AWS S3桶名强制要求全小写,不允许出现大写字母,你使用的
Transitory-lambda-data包含大写字母,属于非法桶名,访问时会直接报错。 - 缺少必要IAM权限:Lambda的执行角色需要附加包含
s3:PutObject权限的策略,否则即使代码逻辑正确也会因权限不足上传失败。
修正后可运行的参考代码
import boto3 import os import logging # 初始化s3客户端放在函数外,复用连接提升性能 s3_client = boto3.client('s3') logger = logging.getLogger() logger.setLevel(logging.INFO) def upload_file(file_name, bucket, object_name=None): if object_name is None: object_name = os.path.basename(file_name) try: response = s3_client.upload_file(file_name, bucket, object_name) logger.info(f"文件{object_name}上传成功") return response except Exception as e: logger.error(f"文件上传失败,错误信息:{str(e)}") raise e def lambda_handler(event, context): # 如果你把grafico.csv和代码打包在一起,这里写相对路径./grafico.csv file_name = "./grafico.csv" # 替换为全小写的合法桶名 bucket = "transitory-lambda-data" # 调用上传函数执行上传逻辑 return upload_file(file_name, bucket)
内容的提问来源于stack exchange,提问作者Sad Mermaid
相关产品推荐
相关产品推荐

