作者: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/