Lambda函数检查S3文件夹是否存在


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/230410659053/
相关话题:https://www.cnsre.cn/tags/lambda/


Lambda函数检查S3文件夹是否存在

作为 AWS 中最常用的对象存储服务,S3 可以用于存储各种类型的文件,包括网站文件、媒体文件、备份文件等等。在 S3 中存储的文件可以通过不同的方式访问,例如在 Web 应用程序中、通过移动应用程序或直接使用 AWS SDK 访问等。

在进行 S3 存储时,如果我们需要将存储的日志同步到另一个桶或区域中,则可以使用 AWS 的 S3 日志同步任务功能。通过将日志同步到其他存储桶或区域中,我们可以更方便地对日志进行分析、监控和管理。

但是,如果 S3 日志同步任务出现故障,我们可能无法及时获取相关的日志信息。因此,为了确保日志同步任务的正常运行,我们需要对任务进行监控。在本文中,我们将介绍如何使用 AWS Lambda 监控 S3 日志同步任务。

介绍

AWS Lambda 是一种无服务器计算服务,可使您在云中运行代码,而无需自己管理服务器。通过使用 Lambda,您可以将代码上传到云中,然后 Lambda 会根据需要自动扩展和缩减计算资源,以满足您的应用程序的请求。Lambda 还支持许多编程语言和库,使您能够编写功能强大的应用程序和服务。

在本文中,我们将使用 Lambda 编写一个函数,该函数将定期检查 S3 存储桶中的文件夹是否存在。如果不存在任何文件夹,则 Lambda 将向指定的 SNS 主题发送一条消息,以便管理员可以及时采取措施。通过使用 Lambda 监控 S3 存储桶中的文件夹,我们可以确保日志同步任务的正常运行。

1. 准备工作

在开始之前,我们需要先准备好以下工作:

  • 一个S3桶,用于存储我们要检查的文件夹。
  • 一个SNS主题,用于发送消息提醒。

2. 创建Lambda函数

在AWS控制台上创建一个Python Lambda函数,名称为s3-folder-exist-checker,并使用以下代码:

import boto3
from datetime import datetime, timedelta
from dateutil import tz

def lambda_handler(event, context):
    print('Lambda 函数已启动.')
    
    s3 = boto3.resource('s3')
    bucket_name = 'my_s3_bucket_name'
    local_tz = tz.gettz('Asia/Shanghai')
    now = datetime.now()
    date_prefix = now.strftime('%Y/%m/%d/')
    
    folder_prefixes = ['my_prefixes/' + date_prefix, 'my_prefixes/' + date_prefix, 'RGC-Prod-3in1oven/' + date_prefix]
    folder_prefixes = [prefix + '/' if not prefix.endswith('/') else prefix for prefix in folder_prefixes]  # 确保每个前缀以斜杠结尾
    
    print('正在检查以下 S3 文件夹:', folder_prefixes)
    
    sns = boto3.client('sns')
    topic_arn = 'arn:aws-cn:sns:cn-north-1:1234567890:s3-logs-monitoring'
    
    for prefix in folder_prefixes:
        resp = s3.meta.client.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter='/')
        subfolders = [p['Prefix'] for p in resp.get('CommonPrefixes', [])]
    
        if len(subfolders) > 0:
            print(f"子文件夹 '{prefix}' 存在:")
            for folder in subfolders:
                print(f"发现子文件夹: {folder}")
        else:
            message = f"S3桶'{bucket_name}中'{prefix}'下不存在新增文件夹,即日志同步S3桶任务失败.请检查.'"
            sns.publish(TopicArn=topic_arn, Message=message)
            print(f"已发送 SNS 消息: {message}")
        
    print('Lambda 函数已完成.')
    
    return {
        'statusCode': 200,
        'body': 'S3 文件夹存在性检查已完成.'
    }

接下来是对 Lambda 函数中的一些细节进行讲解。首先,我们定义了 S3 的资源,并且指定了 S3 桶的名称:

s3 = boto3.resource('s3')
bucket_name = 'my_bucket_name'

接着,我们获取当前的时间,并且根据当前时间生成一个目录前缀。我们使用 dateutil 模块中的 tz.gettz 函数来获取一个本地的时区信息。为了确保时区的准确性,我们建议在使用 Lambda 函数时,显式地设置时区信息:

local_tz = tz.gettz('Asia/Shanghai')
now = datetime.now(local_tz)
date_prefix = now.strftime('%Y/%m/%d/')

在 Lambda 函数中,我们使用了 list_objects_v2 方法来列举指定的文件夹。具体来说,我们使用了 CommonPrefixes 参数,该参数可以返回指定前缀下的子文件夹列表。如果返回的子文件夹列表为空,则说明指定的文件夹不存在。如果子文件夹列表不为空,则说明文件夹存在,并且我们可以将每个子文件夹的路径打印出来:

resp = s3.meta.client.list_objects_v2(Bucket=bucket_name, Prefix=prefix, Delimiter='/')
subfolders = [p['Prefix'] for p in resp.get('CommonPrefixes', [])]

if len(subfolders) > 0:
    print(f"子文件夹 '{prefix}' 存在:")
    for folder in subfolders:
        print(f"发现子文件夹: {folder}")

如果子文件夹列表为空,则说明文件夹不存在。在这种情况下,我们可以使用 SNS 服务发送一条消息来通知管理员:

if len(subfolders) == 0:
    message = f"S3桶'{bucket_name}中'{prefix}'下不存在新增文件夹,即日志同步S3桶任务失败.请检查.'"
    sns.publish(TopicArn=topic_arn, Message=message)
    print(f"已发送 SNS 消息: {message}")

最后,我们返回了一个包含状态码和消息的字典,以便可以在 Lambda 函数执行过程中监控执行状态:

return {
    'statusCode': 200,
    'body': 'S3 文件夹存在性检查已完成.'
}
  • 确保您的 Lambda 函数有权限访问 S3 和 SNS

  • 在 AWS Lambda 控制台中,创建一个新的 Lambda 函数。在函数代码中将 Python 代码粘贴到代码编辑器中。请确保您选择了正确的运行时环境,并设置以下环境变量:

    • BUCKET_NAME:您的 S3 桶名称
    • SNS_TOPIC_ARN:SNS 主题的 ARN
  • 配置 Lambda 函数的基本设置和高级设置,包括内存和超时。

  • 在 Lambda 控制台中,测试 Lambda 函数,以确保 Lambda 函数能够访问 S3 桶和 SNS 主题。为了测试该函数,您可以创建一个测试事件,该事件需要一个空的 JSON 对象,例如:

  • 最后,您需要在 Amazon CloudWatch 中设置 CloudWatch Events 规则以定期触发 Lambda 函数。这样您的 Lambda 函数就能在您预定的时间检查 S3 文件夹是否存在并发送通知。

总结

在这篇文章中,我们介绍了一个使用 AWS Lambda、S3 和 SNS 的自动化任务,该任务定期检查 S3 文件夹是否存在并发送通知。我们解释了如何编写 Python 代码来实现此任务,并提供了一个详细的代码示例。我们还介绍了如何在 AWS Lambda 和 Amazon SNS 控制台上配置 Lambda 函数和 SNS 主题,并在 Amazon CloudWatch 中创建定期触发器来触发 Lambda 函数。最后,我们提供了一些最佳实践和注意事项,以确保您的 Lambda 函数和 SNS 主题能够正常工作。

希望这篇文章对您有所帮助!如果您有任何疑问或建议,请在下面的评论区留言。

参考文献


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/230410659053/
相关话题:https://www.cnsre.cn/tags/lambda/


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容