-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

相關問題