我有一個 lambda 腳本,可以提取一個多小時前上傳的存盤桶中的所有檔案名,并通過 sns 發送電子郵件。我的 lambda 函式運行良好。但是,我沒有收到一封包含所有檔案的郵件,而是為每個檔案收到一封電子郵件。這意味著當我通過 lambda 找到 100 個檔案時,我會收到 100 封電子郵件。有沒有辦法將所有檔案分組并只收到來自 sns 的一封電子郵件?
這是我的 lambda 示例腳本:
import boto3
import json
from datetime import datetime, timedelta, timezone
def lambda_handler(event, context):
AWS_REGION = "aws-region"
sns_resource = boto3.resource('sns', region_name=AWS_REGION)
TOPIC_ARN = 'sns_topic_arn'
sns_topic = sns_resource.Topic(TOPIC_ARN)
s3_client = boto3.client('s3')
paginator = s3_client.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(
Bucket = 'bucket',
Prefix = 'data/raw/mdf/'
)
for page in page_iterator:
for object in page['Contents']:
if object['LastModified'] < datetime.now(tz=timezone.utc) - timedelta(hours=2):
message = object['Key']
sns_topic.publish(Message=message)
歡迎任何幫助
最好的祝福
uj5u.com熱心網友回復:
如果您不想為找到的每個檔案獲取訊息,則不應為回圈中的每個迭代發布訊息for。
所以以下行應該在回圈之外:for
sns_topic.publish(Message=message)
在for回圈中,您只創建訊息。在for回圈之后發布它。
例子:
keys = []
for page in page_iterator:
for object in page['Contents']:
if object['LastModified'] < datetime.now(tz=timezone.utc) - timedelta(hours=2):
keys.append(object['Key'])
message = ",".join(keys)
sns_topic.publish(Message=message)
這將創建一個鍵串列,然后創建一條訊息,該訊息只是由逗號 ( ,) 分隔的那些鍵。
您可以創建一條訊息,其中每個鍵都在新行上。這取決于你。
當心:這不會擴展。如果您已經創建了數千個檔案,那么電子郵件將無濟于事。
您最好使用AWS SES并發送帶有檔案作為附件的電子郵件。該檔案包含一個新密鑰串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454785.html
標籤:亚马逊网络服务 亚马逊-s3 aws-lambda 亚马逊-sns
上一篇:列出S3物件直到第一級
下一篇:S3默認公共ACL檔案物件
