-1

如上面标题中所述,我希望每次将文件上传到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 
+0

看起来你有一个由上传事件触发的lambda。这个lambda应该是发送电子邮件的,对吧?你是否检查过lambda的日志以查看是否有错误?我建议你记录事件以确保你正在接收它。 –

+0

除非您需要通过编写代码提供的灵活性,否则您可以简单地配置S3事件以发布到SNS主题并通过电子邮件地址订阅该主题。 – jarmod

回答

0

如果你的座右铭是只接收在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)点击添加通知并输入数值。下面显示了一个示例。

enter image description here

选择您创建所需的S3事件监测和SNS的话题。

8)点击保存。现在你应该开始收到你的电子邮件通知。

+0

感谢您的回应,我想使用无服务器做所有这些,这就是为什么我发布这个问题。我认为大多数人不理解我的问题。 – ner

相关问题