GCP环境下校验GCS桶摄入文件名后自动发送缺失文件通知邮件的实现方法
GCP环境下GCS入桶文件编号缺失校验及自动邮件通知实现方案
前置说明
默认你的文件命名规则符合统一规范:文件名包含固定位数的序列编号(比如示例中的3位数字001、002),你可以根据实际命名规则调整正则匹配规则即可。
核心架构(全部使用GCP原生组件,无需额外第三方服务)
- 触发源:GCS对象最终化(
finalize)事件,每次有新文件成功上传到目标桶时自动触发后续流程 - 逻辑执行载体:Cloud Function,承载编号提取、缺失校验、邮件发送的全部逻辑
- 敏感信息存储:Secret Manager,用来存SMTP服务的账号密码等敏感配置,禁止硬编码在代码中
分步实现
1. 配置Cloud Function触发器
创建第二代Cloud Function,触发类型选择「Cloud Storage」,触发事件选择google.cloud.storage.object.v1.finalized,绑定你的目标GCS桶,运行环境按需选择Python/Node.js均可。
2. 编写文件编号校验逻辑
以Python运行环境为例,核心校验逻辑示例:
import re from google.cloud import storage def get_missing_sequence_numbers(bucket_name): storage_client = storage.Client() blobs = storage_client.list_blobs(bucket_name) # 正则匹配3位数字序列编号,可根据你的文件名规则调整 pattern = re.compile(r'(\d{3})') existing_nums = set() for blob in blobs: match = pattern.search(blob.name) if match: num = int(match.group(1)) existing_nums.add(num) if not existing_nums: return [] # 以当前最大编号为上限校验缺失 max_num = max(existing_nums) missing = [f"{n:03d}" for n in range(1, max_num+1) if n not in existing_nums] return missing
3. 配置邮件发送逻辑
拿到缺失的编号列表后,如果列表非空,直接调用SMTP服务发送通知即可,Python示例用smtplib实现:
import smtplib from email.mime.text import MIMEText def send_notification(missing_nums): content = f"不存在{'、'.join(missing_nums)}对应文件" msg = MIMEText(content, 'plain', 'utf-8') msg['Subject'] = 'GCS文件编号缺失通知' msg['From'] = '你的发件邮箱' msg['To'] = '收件人邮箱' # SMTP密码从Secret Manager读取,不要硬编码 smtp_server = 'smtp.xxx.com' smtp_port = 465 smtp_password = '你从Secret Manager获取的密码' with smtplib.SMTP_SSL(smtp_server, smtp_port) as server: server.login(msg['From'], smtp_password) server.sendmail(msg['From'], msg['To'].split(','), msg.as_string())
4. 权限配置
给Cloud Function的运行服务账号授予以下权限:
- GCS桶的
storage.objects.list权限,用于读取桶内所有文件列表 - Secret Manager的
secretmanager.versions.access权限,用于读取SMTP密码等敏感配置
可选优化方案
- 如果是批量上传场景,可配合Cloud Tasks设置延迟触发,避免部分文件还未上传完成就触发校验导致误报
- 可将已发送过通知的缺失批次记录在Firestore/Cloud SQL中,避免同一缺失重复触发邮件
- 如果不需要实时校验,可替换触发器为Cloud Scheduler定时触发,比如每天凌晨统一校验一次当日的入桶文件
内容的提问来源于stack exchange,提问作者bhavana s Shetty
相关产品推荐
相关产品推荐

