如何通过AWS Lambda读取S3存储桶TXT文件内容并生成HTML页面展示
实现步骤与代码修改
核心逻辑说明
你需要的执行链路是:S3存储桶新增.txt文件 → 触发Lambda → 读取TXT文件的实际文本内容 → 组装为HTML格式 → 调用put_object接口将HTML写入S3存储桶,后续直接访问该HTML文件即可展示TXT内容。
你搜索到的put_object代码是用于写入HTML文件到S3的核心方法,需要放在成功读取到TXT内容之后的逻辑位置。
完整修改后的代码
import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') # 你也可以指定HTML存储到其他桶,替换为你的目标桶名即可 HTML_BUCKET_NAME = None # 为None时默认和TXT文件同桶 def lambda_handler(event, context): # 获取触发事件的桶和文件信息 bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') # 过滤非TXT文件,避免误触发 if not key.lower().endswith('.txt'): print(f"非TXT文件{key},跳过处理") return try: # 读取TXT文件内容 response = s3.get_object(Bucket=bucket, Key=key) # 从Body流中读取实际文本内容,注意编码匹配你的TXT文件编码,默认用utf-8 txt_content = response['Body'].read().decode('utf-8') # 组装HTML内容,你可以自定义样式 html_content = f""" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>TXT内容展示</title> </head> <body> <h2>上传的TXT文件内容为:</h2> <p>{txt_content}</p> </body> </html> """ # 确定HTML存储的目标桶 target_bucket = HTML_BUCKET_NAME if HTML_BUCKET_NAME else bucket # 写入HTML文件到S3,就是你搜索到的代码的正确使用方式 s3.put_object( Bucket=target_bucket, Key='index.html', # 你也可以自定义文件名,比如用Key=key.rsplit('.',1)[0] + '.html'实现每个TXT对应单独HTML Body=html_content.encode('utf-8'), ContentType='text/html' # 如果需要公开访问HTML,可加以下参数 # ACL='public-read' ) print("HTML文件生成成功") return "success" except Exception as e: print(e) print(f'处理对象{key}失败,请确认桶{bucket}与Lambda在同一区域') raise e
额外配置要求
- Lambda权限补充:你的Lambda执行角色需要添加S3写入权限,策略示例如下,替换为你的实际桶ARN即可:
{ "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::你的桶名/*" }
- 避免循环触发:如果HTML和TXT存储在同一个桶,需要在S3触发器配置中添加后缀过滤规则,仅让后缀为
.txt的文件触发Lambda,避免写入HTML时再次触发Lambda造成循环。 - 访问HTML:如果需要公网访问HTML,可开启S3桶的静态网站托管功能,或在
put_object时添加ACL='public-read'参数。
内容的提问来源于stack exchange,提问作者Daniela Quila
相关产品推荐
相关产品推荐

