繁体   English   中英

如何使用aws sns将lambda function中的所有结果发送到一个email中

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

我有一个 lambda 脚本,它提取存储桶中一个多小时前上传的所有文件名,并通过 sns 发送 email。 我的 lambda function 工作正常。 但是,我没有收到一封包含所有文件的邮件,而是为每个文件收到一封 email。 这意味着当我通过 lambda 找到 100 个文件时,我会收到 100 封电子邮件。 有没有办法将所有文件分组并只从 sns 接收一个 email?

这是我的 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)

这将创建一个键列表,然后创建一条消息,该消息只是用逗号 ( , ) 分隔的那些键。

您可以创建一条消息,其中每个键都在一个新行上。 这取决于你。

当心:这不会缩放。 如果您创建了数千个文件,email 将无济于事。

您最好使用AWS SES并发送带有文件附件的 email。 该文件包含新密钥列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM