如何使用 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 并发送带有文件附件的电子邮件。该文件包含新密钥列表。
我有一个 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 并发送带有文件附件的电子邮件。该文件包含新密钥列表。