每当使用无服务器将文件上传到s3存储桶时获取电子邮件
如上面标题中所述,我希望每次将文件上传到s3存储桶时都会收到电子邮件,但我使用无服务器,问题在于我创建的事件在s3上,我只是通知s3-aws控制台,并不知道如何在S3上配置cloudwatch事件来触发lambda。所以,如果有人知道如何使用cloudwatch在S3上触发事件,我非常高兴。 这里是我的代码:每当使用无服务器将文件上传到s3存储桶时获取电子邮件
import json
import boto3
import botocore
import logging
import sys
import os
import traceback
from botocore.exceptions import ClientError
from pprint import pprint
from time import strftime, gmtime
email_from = '*****@******.com'
email_to = '******@******.com'
#email_cc = '********@gmail.com'
email_subject = 'new event on s3 '
email_body = 'a new file is uploaded'
#setup simple logging for INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)
from botocore.exceptions import ClientError
def sthree(event, context):
"""Send email whenever a file is uploaded to S3"""
body = {}
status_code = 200
try:
s3 = boto3.client('s3')
ses = boto3.client('ses')
response = ses.send_email(Source = email_from,
Destination = {'ToAddresses': [email_to,],},
Message = {'Subject': {'Data': email_subject}, 'Body':{'Text' : {'Data': email_body}}}
)
response = {
"statusCode": 200,
"body": json.dumps(body)
}
return response
,这里是我的serverless.yml文件
service: aws-python # NOTE: update this with your service name
plugins:
- serverless-external-s3-event
provider: name: aws
runtime: python2.7
stage: dev
region: us-east-1
iamRoleStatements:
- Effect: "Allow"
Action:
- s3:*
- "ses:SendEmail"
- "ses:SendRawEmail"
- "s3:PutBucketNotification"
Resource: "*"
functions: sthree:
handler: handler.sthree
description: send mail whenever a file is uploaded on S3
events:
- s3:
bucket: cartegie-nirmine
event: s3:ObjectCreated:*
rules:
- prefix: uploads/
- suffix: .jpg
- cloudwatchEvent:
description: 'CloudWatch Event triggered '
event:
source:
- "aws.S3"
detail-type:
- "S3 event Notification"
enabled : true
如果你的座右铭是只接收在S3存储操作的电子邮件通知,那么你不需要的lambda函数为了那个原因。对于问题中提到的用例,可以使用SNS主题和S3事件来实现。我会提到从控制台遵循的步骤(通过sdk或cli可以实现相同的步骤)。
1)使用SNS控制台创建Topic
。
2)订阅主题。使用email
作为通信协议,并提供您的电子邮件ID。
3)您将收到电子邮件,要求您确认您对该主题的订阅。确认订阅。
4)重要:替换下面的政策话题的访问策略:
{
"Version": "2008-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "SNS:Publish",
"Resource": "sns-topic-arn",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:s3:*:*:s3-bucket-name"
}
}
}
]
}
基本上你是给同意您的S3斗发布到SNS话题。
更换SNS话题 - 阿尔恩与您在上面创建的主题的ARN。 Replce s3-bucket-name与您的存储桶名称,您想要接收通知。
5)转到S3控制台。点击你的S3存储桶并打开属性选项卡。
6)在高级设置,点击活动卡。
7)点击添加通知并输入数值。下面显示了一个示例。
选择您创建所需的S3事件监测和SNS的话题。
8)点击保存。现在你应该开始收到你的电子邮件通知。
感谢您的回应,我想使用无服务器做所有这些,这就是为什么我发布这个问题。我认为大多数人不理解我的问题。 – ner
看起来你有一个由上传事件触发的lambda。这个lambda应该是发送电子邮件的,对吧?你是否检查过lambda的日志以查看是否有错误?我建议你记录事件以确保你正在接收它。 –
除非您需要通过编写代码提供的灵活性,否则您可以简单地配置S3事件以发布到SNS主题并通过电子邮件地址订阅该主题。 – jarmod