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 存儲時豁陆,如果我們需要將存儲的日志同步到另一個桶或區(qū)域中柑爸,則可以使用 AWS 的 S3 日志同步任務功能。通過將日志同步到其他存儲桶或區(qū)域中盒音,我們可以更方便地對日志進行分析表鳍、監(jiān)控和管理。

但是祥诽,如果 S3 日志同步任務出現故障譬圣,我們可能無法及時獲取相關的日志信息。因此雄坪,為了確保日志同步任務的正常運行厘熟,我們需要對任務進行監(jiān)控。在本文中维哈,我們將介紹如何使用 AWS Lambda 監(jiān)控 S3 日志同步任務盯漂。

介紹

AWS Lambda 是一種無服務器計算服務,可使您在云中運行代碼笨农,而無需自己管理服務器。通過使用 Lambda帖渠,您可以將代碼上傳到云中谒亦,然后 Lambda 會根據需要自動擴展和縮減計算資源,以滿足您的應用程序的請求。Lambda 還支持許多編程語言和庫份招,使您能夠編寫功能強大的應用程序和服務切揭。

在本文中,我們將使用 Lambda 編寫一個函數锁摔,該函數將定期檢查 S3 存儲桶中的文件夾是否存在廓旬。如果不存在任何文件夾,則 Lambda 將向指定的 SNS 主題發(fā)送一條消息谐腰,以便管理員可以及時采取措施孕豹。通過使用 Lambda 監(jiān)控 S3 存儲桶中的文件夾,我們可以確保日志同步任務的正常運行十气。

1. 準備工作

在開始之前励背,我們需要先準備好以下工作:

  • 一個S3桶,用于存儲我們要檢查的文件夾砸西。
  • 一個SNS主題叶眉,用于發(fā)送消息提醒。

2. 創(chuàng)建Lambda函數

在AWS控制臺上創(chuàng)建一個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"發(fā)現子文件夾: {folder}")
        else:
            message = f"S3桶'{bucket_name}中'{prefix}'下不存在新增文件夾,即日志同步S3桶任務失敗.請檢查.'"
            sns.publish(TopicArn=topic_arn, Message=message)
            print(f"已發(fā)送 SNS 消息: {message}")
        
    print('Lambda 函數已完成.')
    
    return {
        'statusCode': 200,
        'body': 'S3 文件夾存在性檢查已完成.'
    }

接下來是對 Lambda 函數中的一些細節(jié)進行講解。首先鸳慈,我們定義了 S3 的資源饱溢,并且指定了 S3 桶的名稱:

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

接著,我們獲取當前的時間蝶涩,并且根據當前時間生成一個目錄前綴理朋。我們使用 dateutil 模塊中的 tz.gettz 函數來獲取一個本地的時區(qū)信息。為了確保時區(qū)的準確性绿聘,我們建議在使用 Lambda 函數時嗽上,顯式地設置時區(qū)信息:

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"發(fā)現子文件夾: {folder}")

如果子文件夾列表為空,則說明文件夾不存在棚赔。在這種情況下帝簇,我們可以使用 SNS 服務發(fā)送一條消息來通知管理員:

if len(subfolders) == 0:
    message = f"S3桶'{bucket_name}中'{prefix}'下不存在新增文件夾,即日志同步S3桶任務失敗.請檢查.'"
    sns.publish(TopicArn=topic_arn, Message=message)
    print(f"已發(fā)送 SNS 消息: {message}")

最后徘郭,我們返回了一個包含狀態(tài)碼和消息的字典,以便可以在 Lambda 函數執(zhí)行過程中監(jiān)控執(zhí)行狀態(tài):

return {
    'statusCode': 200,
    'body': 'S3 文件夾存在性檢查已完成.'
}
  • 確保您的 Lambda 函數有權限訪問 S3 和 SNS

  • 在 AWS Lambda 控制臺中丧肴,創(chuàng)建一個新的 Lambda 函數残揉。在函數代碼中將 Python 代碼粘貼到代碼編輯器中。請確保您選擇了正確的運行時環(huán)境芋浮,并設置以下環(huán)境變量:

    • BUCKET_NAME:您的 S3 桶名稱
    • SNS_TOPIC_ARN:SNS 主題的 ARN
  • 配置 Lambda 函數的基本設置和高級設置抱环,包括內存和超時。

  • 在 Lambda 控制臺中纸巷,測試 Lambda 函數镇草,以確保 Lambda 函數能夠訪問 S3 桶和 SNS 主題。為了測試該函數何暇,您可以創(chuàng)建一個測試事件陶夜,該事件需要一個空的 JSON 對象,例如:

  • 最后裆站,您需要在 Amazon CloudWatch 中設置 CloudWatch Events 規(guī)則以定期觸發(fā) Lambda 函數条辟。這樣您的 Lambda 函數就能在您預定的時間檢查 S3 文件夾是否存在并發(fā)送通知。

總結

在這篇文章中宏胯,我們介紹了一個使用 AWS Lambda羽嫡、S3 和 SNS 的自動化任務,該任務定期檢查 S3 文件夾是否存在并發(fā)送通知肩袍。我們解釋了如何編寫 Python 代碼來實現此任務杭棵,并提供了一個詳細的代碼示例。我們還介紹了如何在 AWS Lambda 和 Amazon SNS 控制臺上配置 Lambda 函數和 SNS 主題氛赐,并在 Amazon CloudWatch 中創(chuàng)建定期觸發(fā)器來觸發(fā) Lambda 函數魂爪。最后,我們提供了一些最佳實踐和注意事項艰管,以確保您的 Lambda 函數和 SNS 主題能夠正常工作滓侍。

希望這篇文章對您有所幫助!如果您有任何疑問或建議牲芋,請在下面的評論區(qū)留言撩笆。

參考文獻


作者:SRE運維博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/230410659053/
相關話題:https://www.cnsre.cn/tags/lambda/


?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缸浦,隨后出現的幾起案子夕冲,更是在濱河造成了極大的恐慌,老刑警劉巖裂逐,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歹鱼,死亡現場離奇詭異,居然都是意外死亡卜高,警方通過查閱死者的電腦和手機醉冤,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門秩霍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚁阳,你說我怎么就攤上這事「胝眨” “怎么了螺捐?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長矮燎。 經常有香客問我定血,道長,這世上最難降的妖魔是什么诞外? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上此改,老公的妹妹穿的比我還像新娘姓赤。我一直安慰自己,他們只是感情好既们,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布濒析。 她就那樣靜靜地躺著,像睡著了一般啥纸。 火紅的嫁衣襯著肌膚如雪号杏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天斯棒,我揣著相機與錄音盾致,去河邊找鬼。 笑死荣暮,一個胖子當著我的面吹牛庭惜,可吹牛的內容都是我干的。 我是一名探鬼主播渠驼,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜈块,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迷扇?” 一聲冷哼從身側響起百揭,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜓席,沒想到半個月后器一,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡厨内,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年祈秕,在試婚紗的時候發(fā)現自己被綠了渺贤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡请毛,死狀恐怖志鞍,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情方仿,我是刑警寧澤固棚,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站仙蚜,受9級特大地震影響此洲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜委粉,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一呜师、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贾节,春花似錦汁汗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至戴差,卻和暖如春送爸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暖释。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工袭厂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人球匕。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓纹磺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亮曹。 傳聞我的和親對象是個殘疾皇子橄杨,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容