如何使用 aws sns 在一封电子邮件中发送 lambda 函数的所有结果

How to send all the results from a lambda function in one email using aws sns

我有一个 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)

欢迎任何帮助

此致

如果您不想为找到的每个文件都收到消息,则不应为 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 并发送带有文件附件的电子邮件。该文件包含新密钥列表。