如何在AWS中自动化Python脚本:日志邮件与HubSpot上传
可行AWS部署与自动化方案
一、前期准备
- 整理所有Python脚本的依赖到
requirements.txt(例如psycopg2-binary、requests、boto3等) - 将数据库密码、HubSpot Token、邮箱配置等敏感信息存入AWS Secrets Manager,彻底移除代码中的硬编码内容
二、脚本适配AWS环境
1. 日志输出调整
替换本地文件日志逻辑,改为输出到CloudWatch Logs(Lambda默认支持),同时可将日志上传至S3以便后续发邮件:
import boto3 s3 = boto3.client('s3') # 日志上传到S3的工具函数 def upload_log_to_s3(log_content, filename): s3.put_object( Bucket='your-log-storage-bucket', Key=f'logs/{filename}', Body=log_content.encode('utf-8') )
2. 敏感信息读取
从Secrets Manager拉取数据库与API凭证:
import boto3 import json def get_secret(): secret_name = "your-secret-name" region_name = "your-aws-region" session = boto3.session.Session() client = session.client(service_name='secretsmanager', region_name=region_name) secret_str = client.get_secret_value(SecretId=secret_name)['SecretString'] return json.loads(secret_str) # 在DB_conn方法中使用 secret = get_secret() self.connection = psycopg2.connect( host=secret['db_host'], database=secret['db_name'], user=secret['db_user'], password=secret['db_password'], port=secret['db_port'] ) # HubSpot Token调用示例 headers = { 'Authorization': f"Bearer {secret['hubspot_token']}", 'Accept': 'application/json', 'Content-Type': 'application/json' }
3. script2的JSON文件处理
Lambda仅支持/tmp目录作为临时存储,修改JSON生成路径:
now = datetime.datetime.now() filename = f"/tmp/User_data_file_{now.strftime('%Y-%m-%d--%H-%M-%S')}.json" with open(filename, 'w+') as f: json.dump(json_stri, f, indent=4, default=str)
三、部署脚本到Lambda
- 代码打包:将脚本、
requirements.txt打包为zip包(建议在Linux环境打包,确保psycopg2等依赖适配Lambda运行时) - 创建Lambda函数:选择Python 3.x运行时,上传zip包,配置执行角色(需包含S3、Secrets Manager、SES、CloudWatch Logs的操作权限)
- 测试函数:验证每个脚本能正常运行并生成日志/JSON文件
四、script2每周定时执行配置
使用Amazon EventBridge(原CloudWatch Events)创建定时规则:
- 规则类型选择「Schedule」
- 配置Cron表达式:例如每周一凌晨2点执行(UTC时间),表达式为
0 2 ? * MON *(需根据本地时区调整) - 目标选择script2对应的Lambda函数
五、日志自动发送邮件
基于Amazon SES实现,推荐两种方式:
方式1:脚本执行完成后触发邮件
在每个Lambda脚本末尾添加邮件发送逻辑:
import boto3 from botocore.exceptions import ClientError def send_log_email(log_filename, recipient_email): ses = boto3.client('ses', region_name='your-aws-region') # 从S3读取日志内容 log_obj = s3.get_object(Bucket='your-log-storage-bucket', Key=f'logs/{log_filename}') log_content = log_obj['Body'].read().decode('utf-8') try: ses.send_email( Source='your-verified-sender@example.com', Destination={'ToAddresses': [recipient_email]}, Message={ 'Subject': {'Data': f"脚本执行日志 - {log_filename}"}, 'Body': {'Text': {'Data': log_content}} } ) except ClientError as e: print(e.response['Error']['Message']) else: print(f"邮件发送成功,消息ID:{response['MessageId']}")
方式2:CloudWatch日志触发邮件
创建CloudWatch Logs订阅过滤器,当有新日志生成时触发Lambda发送邮件,适合实时监控脚本运行状态。
六、关键权限配置
Lambda执行角色需附加以下权限策略(建议最小权限原则,避免全量权限):
- S3:指定日志桶的读写权限
- Secrets Manager:敏感信息的只读权限
- SES:指定邮箱的发送权限
- CloudWatch Logs:日志写入权限
额外优化建议
- 给Lambda配置足够的内存与超时时间(例如1024MB内存、5分钟超时),避免脚本因运行时间过长被终止
- 给S3日志桶设置生命周期规则,自动删除30天以上的旧日志
- 给EventBridge规则配置CloudWatch告警,当script2未按时执行时触发通知
内容的提问来源于stack exchange,提问作者lAkShMipythonlearner
相关产品推荐
相关产品推荐

