如何将AWS Lambda输出写入CSV并上传至S3存储桶
实现AWS Lambda将组织账号服务列表写入CSV并上传S3
核心流程
- 转换现有账号服务数据为CSV结构化格式
- 利用Python标准库生成内存中的CSV内容(无需临时文件)
- 通过boto3将CSV文件上传至指定S3存储桶
代码实现
1. 导入依赖模块
import boto3 import csv from io import StringIO
2. 生成CSV内容
假设你的现有数据结构为:[{"account_id": "123456789012", "services": ["ec2", "s3", "lambda"]}, ...]
def build_csv(data): csv_buffer = StringIO() # 定义CSV表头,将每个服务拆分为单独行,便于后续分析 fieldnames = ["account_id", "service"] writer = csv.DictWriter(csv_buffer, fieldnames=fieldnames) writer.writeheader() for account in data: for service in account["services"]: writer.writerow({"account_id": account["account_id"], "service": service}) csv_buffer.seek(0) return csv_buffer.getvalue()
3. 上传至S3
def upload_csv_to_s3(csv_content, bucket_name, file_key): s3_client = boto3.client('s3') try: s3_client.put_object( Bucket=bucket_name, Key=file_key, Body=csv_content, ContentType='text/csv' ) print(f"文件已上传至: s3://{bucket_name}/{file_key}") return True except Exception as e: print(f"上传失败: {str(e)}") return False
4. 整合到Lambda Handler
def lambda_handler(event, context): # 调用你已有的获取组织账号服务的函数 account_service_data = get_org_account_services() # 生成CSV内容 csv_content = build_csv(account_service_data) # 配置S3参数,可根据需求修改 target_bucket = "your-bucket-name" # 用request_id保证文件名唯一,避免覆盖 target_file_key = f"account-services_{context.request_id}.csv" # 执行上传 upload_result = upload_csv_to_s3(csv_content, target_bucket, target_file_key) return { 'statusCode': 200 if upload_result else 500, 'body': f"CSV上传{'成功' if upload_result else '失败'}" }
关键注意事项
- IAM权限: 确保Lambda执行角色拥有
s3:PutObject权限,以及原函数所需的AWS Organizations相关权限 - 内存效率: 使用
StringIO在内存中生成CSV,避免占用Lambda临时存储 - 文件名唯一性: 利用Lambda的
request_id或时间戳作为文件名后缀,防止文件覆盖 - 数据兼容性: 如果原服务列表是字符串格式(如逗号分隔),需先拆分转为列表再写入CSV
内容的提问来源于stack exchange,提问作者Linux Enthusiast
相关产品推荐
相关产品推荐

