Blog

S3 Bucket Benachrichtigungen

Dennis Vriend

Aktualisiert Oktober 21, 2025
3 Minuten

Amazon Simple Storage Storage (S3) ist ein Dienst, der Objekte mit Hilfe eines Schlüssels und eines Wertes speichert. Auf die mit einem Schlüssel verbundenen Daten kann über eine Webservice-API einfach zugegriffen werden. S3 ist ein Kerndienst von AWS und eignet sich hervorragend für die Speicherung von Daten aller Art. S3 unterstützt eine Funktion namens 'Ereignisbenachrichtigungen', mit der Sie ereignisgesteuerte Systeme erstellen können. Wenn bestimmte Ereignisse in Ihrem Bucket eintreten, wie z.B. die Erstellung oder Löschung eines Objekts, kann ein Ereignis an SNS oder eine Lambda-Funktion gesendet werden. In diesem Blog sehen wir uns an, wie Sie einen Lambda als Event-Handler einrichten.

CloudFormation Konfiguration

Die CloudFormation-Konfiguration ist einfach. Wir müssen einen Namen für den Bucket mit Hilfe eines benutzerdefinierten Anbieters angeben, der eine zufällige Zeichenfolge generiert. Als nächstes müssen wir eine Berechtigung angeben, damit der Bucket den Lambda aufrufen kann.

  InputBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref '${RandomName}'
      NotificationConfiguration:
        LambdaConfigurations:
        - Function: !GetAtt NotificationLambda.Arn
          Event: s3:ObjectCreated:*

  LambdaInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt NotificationLambda.Arn
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceAccount: !Ref AWS::AccountId
      SourceArn: !Sub 'arn:aws:s3:::${RandomName}'

Benutzerdefinierter Anbieter

Um einen zufälligen Namen zu generieren, erstellen wir einen benutzerdefinierten Anbieter.

  RandomName:
    Type: Custom::RandomNameGenerator
    Properties:
      ServiceToken: !GetAtt 'RandomNameGenerator.Arn'

  RandomNameGenerator:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.lambda_handler
      Timeout: 30
      Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
      Runtime: python3.6
      Code:
        ZipFile: |
          import string
          import random
          import cfnresponse
          def lambda_handler(event, context):
              if event['RequestType'] == 'Create':
                  event['PhysicalResourceId'] = ''.join(random.choice(string.ascii_lowercase) for _ in range(16))
              cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, event['PhysicalResourceId'])

Der Eimersammler

Der Event-Handler für den Bucket ist eine Lambda-Funktion, die das empfangene Ereignis in die CloudWatch-Protokolle ausgibt.

def handler(event, ctx):
    print(event)

ObjectCreated Ereignis

Wenn wir eine Datei in den Bucket hochladen, wird das folgende Ereignis von der Lambda empfangen. Das Feld Records enthält nur einen einzigen Eintrag und die Details für das ObjectCreated-Ereignis wie den Bucket- und Schlüsselnamen sowie Ort und Zeitpunkt des Ereignisses.

{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventSource": "aws:s3",
      "awsRegion": "eu-west-1",
      "eventTime": "2018-11-18T12:42:15.922Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAJSZKO5A3SBJFMYXTE"
      },
      "requestParameters": {
        "sourceIPAddress": "217.19.26.243"
      },
      "responseElements": {
        "x-amz-request-id": "B9CC7E95824DAC64",
        "x-amz-id-2": "qufqqLvaJ4w7e9UwHdBply4jPEJhwJXbL5qYr0fbhAtZPn0+lfixoN26JC/80uBGpHPxbvDL9XM="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "8450cff2-771d-4a5f-9599-255bc97cbd47",
        "bucket": {
          "name": "qmuixbpinyhhlwpd",
          "ownerIdentity": {
            "principalId": "A97CX0CDO58US"
          },
          "arn": "arn:aws:s3:::qmuixbpinyhhlwpd"
        },
        "object": {
          "key": "README.md",
          "size": 215,
          "eTag": "2e59fd3b13286947aa9d4dcaa03bf568",
          "sequencer": "005BF15E27DB726B35"
        }
      }
    }
  ]
}

Fazit

Es ist einfach, S3 Event Notifications einzurichten. Der s3-Bucket muss die Erlaubnis haben, das Lambda aufzurufen. Das Lambda kann eine beliebige Logik enthalten, die ausgeführt wird, wenn etwas mit dem Bucket passiert. Nächstes Mal sehen wir uns an, wie man empfangene CloudFront-Protokolldateien von einem S3-Bucket an den AWS Elasticsearch-Service sendet.

Verfasst von

Dennis Vriend

Contact

Let’s discuss how we can support your journey.