-1

Ich möchte E-Mails erhalten, wenn eine Datei wie oben im Titel beschrieben in s3 Eimer hochgeladen wird, ich benutze Serverless, das Problem ist, dass das Ereignis, das ich erstellt habe auf s3 gibt mir nur eine benachrichtigung auf der s3-aws-konsole, und ich weiß nicht, wie man das cloudwatch-ereignis auf S3 konfiguriert, um lambda auszulösen. Also bitte, wenn jemand weiß, wie man Ereignisse auf S3 mit cloudwatch auslöst, bin ich ganz Ohr. Hier ist mein Code:E-Mails erhalten, wenn eine Datei auf s3 Bucket mit Serverless hochgeladen wird

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 

und hier ist meine serverless.yml Datei

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

Es sieht so aus, als ob Sie ein Lambda haben, das von einem Upload-Ereignis ausgelöst wird.Dieses Lambda soll eine E-Mail auslösen, oder? Haben Sie die Protokolle für Lambda überprüft, um festzustellen, ob ein Fehler vorliegt? Ich schlage vor, dass Sie das Ereignis protokollieren, um sicherzustellen, dass Sie es erhalten. –

+0

Sofern Sie nicht die Flexibilität benötigen, die Ihnen das Schreiben von Code bietet, können Sie einfach ein S3-Ereignis zur Veröffentlichung in einem SNS-Thema konfigurieren und dieses Thema per E-Mail-Adresse abonnieren. – jarmod

Antwort

0

Wenn Ihr Motto gerade ist E-Mail-Benachrichtigung von Operationen auf einem S3 Eimer zu empfangen, dann müssen Sie nicht Lambda-Funktionen benötigen dafür. Für den in der Frage genannten Anwendungsfall können Sie das mithilfe von SNS-Themen und S3-Ereignissen erreichen. Ich werde die Schritte erwähnen, die von der Konsole aus folgen (durch dasselbe kann man über SDK oder CLI erreichen).

1) Erstellen Sie eine Topic mithilfe der SNS-Konsole.

2) Abonnieren Sie das Thema. Verwenden Sie email als Kommunikationsprotokoll und geben Sie Ihre E-Mail-ID.

3) Sie erhalten eine E-Mail, in der Sie aufgefordert werden, Ihr Abonnement für das Thema zu bestätigen. Bestätigen Sie das Abonnement.

4) WICHTIG: Bringen Sie die Politik des Themas mit der untenen Politik:

{ 
    "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" 
     } 
     } 
    } 
    ] 
} 

Grundsätzlich Sie geben die Erlaubnis für Ihr s3-bucket zum SNS Thema zu veröffentlichen.

ersetzen SNS-Thema-arn mit ARN des Themas Sie oben angelegt. Replize s3-Bucket-Name mit Ihrem Bucket-Namen, für den Sie Benachrichtigungen erhalten möchten.

5) Gehen Sie zur S3-Konsole. Klicken Sie auf Ihren S3-Bucket und öffnen Sie die Registerkarte Properties.

6) Unter Erweiterte Einstellungen, Klicken Sie auf Events Card.

7) Klicken Sie auf Fügen Sie Benachrichtigungen hinzu und geben Sie Werte ein. Eine Probe wurde unten gezeigt.

enter image description here

Wählen Sie die s3-Ereignisse erforderlich zu überwachen und die SNS Thema, das Sie erstellt.

8) Klicken Sie auf Speichern Sie. Jetzt sollten Sie Benachrichtigungen an Ihre E-Mail erhalten.

+0

Vielen Dank für Ihre Antwort, ich möchte all dies mit Serverless tun, deshalb poste ich die Frage. Ich denke, die Mehrheit hat mein Problem nicht verstanden. – ner

Verwandte Themen