

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Erste Schritte: Erstellen Sie eine Amazon EventBridge Event Bus-Regel
<a name="event-bus-rule-get-started"></a>

Um uns mit EventBridge Regeln und ihren Funktionen vertraut zu machen, verwenden wir eine CloudFormation Vorlage zum Einrichten einer Event-Bus-Regel und der zugehörigen Komponenten, einschließlich einer Ereignisquelle, eines Ereignismusters und eines Ziels. Anschließend können wir untersuchen, wie Regeln funktionieren, um die gewünschten Ereignisse auszuwählen.

Die Vorlage erstellt eine Regel für den Standard-Event-Bus. Diese Regel verwendet ein Ereignismuster, um nach Ereignissen aus einem bestimmten Amazon S3 S3-Bucket zu filtern. Die Regel sendet passende Ereignisse an das angegebene Ziel, ein Amazon SNS SNS-Thema. Jedes Mal, wenn ein Objekt im Bucket erstellt wird, sendet die Regel eine Benachrichtigung an das Thema, das dann eine E-Mail an Ihre angegebene E-Mail-Adresse sendet.

Die bereitgestellten Ressourcen bestehen aus:
+ Ein Amazon S3 S3-Bucket mit aktivierten EventBridge Benachrichtigungen, der als Ereignisquelle fungiert.
+ Ein Amazon SNS SNS-Thema und ein E-Mail-Abonnement als Ziel für Benachrichtigungen.
+ Eine Ausführungsrolle, die EventBridge die erforderlichen Berechtigungen für die Veröffentlichung im Amazon SNS SNS-Thema gewährt.
+ Die Regel selbst, die: 
  + Definiert ein Ereignismuster, das nur `Object Created` Ereignissen aus dem spezifischen Amazon S3 S3-Bucket entspricht.
  + Gibt das Amazon SNS SNS-Thema als Ziel an, an das passende EventBridge Ereignisse gesendet werden.

Spezifische technische Details der Vorlage finden Sie unter[Details zur Vorlage](#event-bus-rule-get-started-template-details).

![\[Amazon S3 S3-Ereignisse werden dem Ereignismuster der Regel zugeordnet und an ein SNS-Thema gesendet, wenn sie übereinstimmen.\]](http://docs.aws.amazon.com/de_de/eventbridge/latest/userguide/images/rule-get-started_eventbridge_architectural.svg)


## Bevor Sie beginnen
<a name="event-bus-rule-get-started-create-prereqs"></a>

Um Amazon S3-Ereignisse empfangen zu können EventBridge, müssen Sie die Aktivierung EventBridge in Amazon S3 vornehmen. In diesem Thema EventBridge wird davon ausgegangen, dass es aktiviert ist. Weitere Informationen finden Sie unter [Enabling EventBridge](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications-eventbridge.html) im *Amazon S3 S3-Benutzerhandbuch*.

## Die Regel erstellen mit CloudFormation
<a name="event-bus-rule-get-started-create"></a>

Um die Regel und die zugehörigen Ressourcen zu erstellen, erstellen wir eine CloudFormation Vorlage und verwenden sie, um einen Stack zu erstellen, der eine Beispielregel mit Quelle und Ziel enthält.

**Wichtig**  
Wenn Sie einen Stack anhand dieser Vorlage erstellen, werden Ihnen die verwendeten Amazon-Ressourcen in Rechnung gestellt.

### Die Vorlage erstellen
<a name="event-bus-rule-get-started-file"></a>

Erstellen Sie zunächst die CloudFormation Vorlage.

1. Klicken Sie im Abschnitt „[Vorlage](#event-bus-rule-get-started-template)“ auf das Kopiersymbol auf der Registerkarte **JSON** oder **YAML**, um den Inhalt der Vorlage zu kopieren.

1. Fügen Sie den Inhalt der Vorlage in eine neue Datei ein.

1. Speichern Sie die Datei lokal.

### Erstellen des -Stacks
<a name="event-bus-rule-get-started-stack"></a>

Verwenden Sie als Nächstes die Vorlage, die Sie gespeichert haben, um einen CloudFormation Stack bereitzustellen.

**Erstellen Sie den Stack mit CloudFormation (Konsole)**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/).

1. Auf der Seite **Stacks** wählen Sie im Menü **Stack erstellen** die Option **Mit neuen Ressourcen (Standard)** aus.

1. Legen Sie die Vorlage fest:

   1. Wählen Sie unter **Voraussetzung** die Option **Vorhandene Vorlage wählen** aus.

   1. Wählen Sie unter **Vorlage angeben** die Option **Eine Vorlagendatei hochladen** aus.

   1. Klicken Sie auf **Datei auswählen**, navigieren Sie zur gewünschten Vorlagendatei und wählen Sie diese aus.

   1. Wählen Sie **Weiter** aus.

1. Geben Sie die Stack-Details ein:

   1. Geben Sie einen Stack-Namen ein.

   1. Geben Sie für **BucketName**einen weltweit eindeutigen Bucket-Namen ein. Amazon S3 S3-Bucket-Namen müssen für alle AWS Konten eindeutig sein.

   1. Für **SNSTopicDisplayName**, **SNSTopicName** und **RuleName**, akzeptieren Sie die Standardwerte oder geben Sie Ihre eigenen ein.

   1. Geben Sie für **EmailAddress**eine gültige E-Mail-Adresse ein, an die Sie Benachrichtigungen erhalten möchten.

   1. Wählen Sie **Weiter** aus.

1. Konfigurieren Sie die Stack-Optionen:

   1. Wählen Sie unter **Optionen für Stack-Fehler** die Option **Löschen aller neu erstellten Ressourcen** aus.
**Anmerkung**  
Durch Auswahl dieser Option vermeiden Sie möglicherweise anfallende Kosten für Ressourcen, deren Löschrichtlinie die Beibehaltung auch vorsieht, wenn die Stack-Erstellung fehlschlägt. Weitere Informationen finden Sie unter [`DeletionPolicy`-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-deletionpolicy.html) im *Benutzerhandbuch zu CloudFormation *.

   1. Akzeptieren Sie alle anderen Standardwerte.

   1. Markieren Sie unter **Funktionen** das Kästchen, um zu bestätigen, dass CloudFormation dadurch IAM-Ressourcen in Ihrem Konto erstellt werden könnten.

   1. Wählen Sie **Weiter** aus.

1. Überprüfen Sie die Stack-Details und klicken Sie auf **Absenden**.

**Erstellen Sie den Stack mit CloudFormation ()AWS CLI**

Sie können den Stack auch verwenden AWS CLI , um den Stack zu erstellen.
+ Verwenden Sie den Befehl [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html).
  +  Akzeptieren Sie die Standardwerte der Vorlagenparameter und geben Sie den Stacknamen, die E-Mail-Adresse und den Bucket-Namen an. Verwenden Sie den `template-body` Parameter, um den Inhalt der Vorlage zu übergeben oder `template-url` um einen URL-Speicherort anzugeben.

    ```
    aws cloudformation create-stack \
      --stack-name eventbridge-rule-tutorial \
      --template-body template-contents \
      --parameters \
        ParameterKey=EmailAddress,ParameterValue=your.email@example.com \
        ParameterKey=BucketName,ParameterValue=my-unique-bucket-name \
      --capabilities CAPABILITY_IAM
    ```
  + Überschreiben Sie die Standardwerte eines oder mehrerer Vorlagenparameter. Beispiel:

    ```
    aws cloudformation create-stack \
      --stack-name eventbridge-rule-tutorial \
      ----template-body template-contents \
      --parameters \
        ParameterKey=EmailAddress,ParameterValue=your.email@example.com \
        ParameterKey=BucketName,ParameterValue=my-custom-bucket-name \
        ParameterKey=RuleName,ParameterValue=my-custom-rule-name \
      --capabilities CAPABILITY_IAM
    ```

CloudFormation erstellt den Stapel. Sobald die Stack-Erstellung abgeschlossen ist, können die Stack-Ressourcen verwendet werden. Auf der Registerkarte **Ressourcen** der Stack-Detailseite können Sie die in Ihrem Konto bereitgestellten Ressourcen anzeigen.

Nachdem der Stack erstellt wurde, erhalten Sie eine Bestätigungs-E-Mail für das Abonnement an die von Ihnen angegebene Adresse. Sie müssen dieses Abonnement bestätigen, um Benachrichtigungen zu erhalten.

## Erkunden Sie die Funktionen von Regeln
<a name="event-bus-rule-get-started-using"></a>

Sobald die Regel erstellt wurde, können Sie die EventBridge Konsole verwenden, um die Regelausführung zu beobachten und die Übertragung von Testereignissen zu testen.

1. Die EventBridge Konsole zu [https://console.aws.amazon.com/events/Hause öffnen? \$1/Regeln](https://console.aws.amazon.com/events/home?#/rules).

1. Wählen Sie die Regel aus, die Sie erstellt haben.

   Auf der Regeldetailseite werden im Abschnitt **Regeldetails** Informationen über die Regel angezeigt, einschließlich ihres Ereignismusters und ihrer Ziele.

### Untersuchung des Ereignismusters
<a name="event-bus-rule-get-started-using-pattern"></a>

Bevor wir die Regeloperation testen, untersuchen wir das von uns angegebene Ereignismuster, um zu steuern, welche Ereignisse an das Ziel gesendet werden. Die Regel sendet nur Ereignisse an das Ziel, die den Musterkriterien entsprechen. In diesem Fall möchten wir nur das Ereignis, das Amazon S3 generiert, wenn ein Objekt in unserem speziellen Bucket erstellt wird.
+ Auf der Seite mit den Regeldetails können Sie unter **Ereignismuster** sehen, dass das Ereignismuster nur Ereignisse auswählt, bei denen:
  + Die Quelle ist der Amazon S3 S3-Service (`aws.s3`)
  + Der Detailtyp ist `Object Created`
  + Der Bucket-Name entspricht dem Namen des Buckets, den wir erstellt haben

  ```
  {
    "source": ["aws.s3"],
    "detail-type": ["Object Created"],
    "detail": {
      "bucket": {
        "name": ["eventbridge-rule-example-source"]
      }
    }
  }
  ```

### Ereignisse werden über die Regel gesendet
<a name="event-bus-rule-get-started-using-source"></a>

Als Nächstes generieren wir Ereignisse in der Ereignisquelle, um zu testen, ob der Regelabgleich und die Regelzustellung korrekt funktionieren. Dazu laden wir ein Objekt in den S3-Bucket hoch, den wir als Ereignisquelle angegeben haben.

1. Öffnen Sie die Amazon S3 S3-Konsole unter [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/).

1. Wählen Sie in der **Bucket-Liste den Bucket** aus, den Sie mit der Vorlage erstellt haben.

1. Klicken Sie auf **Upload**.

1. Laden Sie eine Testdatei hoch, um ein `Object Created` Ereignis zu generieren:

   1. Wählen Sie **Dateien hinzufügen** und wählen Sie eine Datei von Ihrem Computer aus.

   1. Klicken Sie auf **Upload**.

1. Warten Sie einen Moment, bis das Ereignis bearbeitet EventBridge und die Benachrichtigung gesendet wurde.

1. Suchen Sie in Ihrer E-Mail nach einer Benachrichtigung über das Ereignis zur Objekterstellung. Die E-Mail wird Details zum S3-Ereignis enthalten, einschließlich des Bucket-Namens und des Objektschlüssels.

### Regelmetriken anzeigen
<a name="event-bus-rule-get-started-using-metrics"></a>

Sie können Metriken für Ihre Regel einsehen, um zu überprüfen, ob Ereignisse korrekt verarbeitet werden.

1. Wählen Sie in der [EventBridge Konsole](https://console.aws.amazon.com/events/home?#/rules) Ihre Regel aus.

1. Wählen Sie die Registerkarte **Metriken** aus.

1. Sie können Metriken wie die folgenden anzeigen:
   + **Aufrufe**: die Häufigkeit, mit der die Regel ausgelöst wurde.
   + **TriggeredRules**: Die Anzahl der Regeln, die durch übereinstimmende Ereignisse ausgelöst wurden.

## Bereinigung: Löschen von Ressourcen
<a name="event-bus-rule-get-started-delete"></a>

Als letzten Schritt löschen wir den Stack und die darin enthaltenen Ressourcen.

**Wichtig**  
Ihnen werden die im Stapel enthaltenen Amazon-Ressourcen in Rechnung gestellt, solange sie existieren.

1. Öffnen Sie die CloudFormation Konsole unter. [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/)

1. Wählen Sie auf der Seite **Stacks** den aus der Vorlage erstellten Stack aus und klicken Sie auf **Löschen**. Bestätigen Sie dann **Löschen**.

   CloudFormation initiiert das Löschen des Stacks und aller darin enthaltenen Ressourcen.

## CloudFormation Details zur Vorlage
<a name="event-bus-rule-get-started-template-details"></a>

Diese Vorlage erstellt Ressourcen und gewährt Berechtigungen in Ihrem Konto.

### Ressourcen
<a name="event-bus-rule-get-started-template-resources"></a>

Mit der CloudFormation Vorlage für dieses Tutorial werden die folgenden Ressourcen in Ihrem Konto erstellt:

**Wichtig**  
Wenn Sie einen Stack anhand dieser Vorlage erstellen, werden Ihnen die verwendeten Amazon-Ressourcen in Rechnung gestellt.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html): Ein Amazon S3 S3-Bucket, der als Ereignisquelle für die Regel fungiert und EventBridge Benachrichtigungen aktiviert hat.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html): Ein Amazon SNS SNS-Thema, das als Ziel für die Ereignisse dient, auf die die Regel zutrifft.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html): Ein E-Mail-Abonnement für das SNS-Thema.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html): IAM-Ausführungsrollen, die Berechtigungen für den EventBridge Service und die Lambda-Bereinigungsfunktion gewähren.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-events-rule.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-events-rule.html): Die Regel, die die Amazon S3 S3-Bucket-Ereignisse mit dem Amazon SNS SNS-Thema verbindet.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html): Eine Lambda-Funktion, die den Amazon S3 S3-Bucket leert, wenn der Stack gelöscht wird, wodurch das saubere Löschen aller Ressourcen ermöglicht wird.

### Berechtigungen
<a name="event-bus-rule-get-started-template-perms"></a>

Die Vorlage enthält eine `AWS::IAM::Role` Ressource, die eine Ausführungsrolle darstellt. Diese Rolle gewährt dem EventBridge Dienst (`events.amazonaws.com`) die folgenden Berechtigungen in Ihrem Konto.

Die folgenden Berechtigungen werden über die verwaltete Richtlinie gewährt`AmazonSNSFullAccess`:
+ Voller Zugriff auf Ressourcen und Abläufe von Amazon SNS

## CloudFormation Vorlage
<a name="event-bus-rule-get-started-template"></a>

Speichern Sie den folgenden YAML-Code als separate Datei, um ihn als CloudFormation Vorlage für dieses Tutorial zu verwenden.

------
#### [ YAML ]

```
AWSTemplateFormatVersion: '2010-09-09'
Description: '[AWSDocs] EventBridge: event-bus-rule-get-started'

Parameters:
  BucketName:
    Type: String
    Description: Name of the S3 bucket (must be globally unique)

  SNSTopicDisplayName:
    Type: String
    Description: Display name for the SNS topic
    Default: eventbridge-rule-example-target

  SNSTopicName:
    Type: String
    Description: Name for the SNS topic
    Default: eventbridge-rule-example-target

  RuleName:
    Type: String
    Description: Name for the EventBridge rule
    Default: eventbridge-rule-example

  EmailAddress:
    Type: String
    Description: Email address to receive notifications
    AllowedPattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+[a-zA-Z0-9-]*(\\.[a-zA-Z0-9-]+)*$'

Resources:
  # S3 Bucket with notifications enabled
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      NotificationConfiguration:
        EventBridgeConfiguration:
          EventBridgeEnabled: true

  # Lambda function to empty the S3 bucket before deletion
  EmptyBucketFunction:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python3.12
      Handler: index.handler
      Timeout: 60
      Role: !GetAtt EmptyBucketRole.Arn
      Code:
        ZipFile: |
          import boto3
          import cfnresponse
          def handler(event, context):
              bucket = event['ResourceProperties']['BucketName']
              if event['RequestType'] == 'Delete':
                  s3 = boto3.resource('s3')
                  bucket_resource = s3.Bucket(bucket)
                  bucket_resource.objects.all().delete()
              cfnresponse.send(event, context, cfnresponse.SUCCESS, {})

  # IAM Role for the bucket cleanup Lambda function
  EmptyBucketRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
      Policies:
        - PolicyName: EmptyBucketPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:DeleteObject
                  - s3:ListBucket
                Resource:
                  - !Sub arn:aws:s3:::${BucketName}
                  - !Sub arn:aws:s3:::${BucketName}/*

  # Custom resource to trigger bucket cleanup on stack deletion
  EmptyBucketOnDelete:
    Type: Custom::EmptyBucket
    Properties:
      ServiceToken: !GetAtt EmptyBucketFunction.Arn
      BucketName: !Ref S3Bucket

  # SNS Topic for email notifications
  SNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Ref SNSTopicDisplayName
      TopicName: !Ref SNSTopicName

  # SNS Subscription for email
  SNSSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Protocol: email
      Endpoint: !Ref EmailAddress
      TopicArn: !Ref SNSTopic

  # EventBridge Rule to match S3 object creation events and send them to the SNS topic
  EventBridgeRule:
    Type: AWS::Events::Rule
    Properties:
      Name: !Ref RuleName
      Description: "Rule to detect S3 object creation and send email notification"
      EventPattern:
        source:
          - aws.s3
        detail-type:
          - "Object Created"
        detail:
          bucket:
            name:
              - !Ref BucketName
      State: ENABLED
      Targets:
        - Id: SendToSNS
          Arn: !Ref SNSTopic
          RoleArn: !GetAtt EventBridgeRole.Arn

  # IAM Role for EventBridge to publish to SNS
  EventBridgeRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSNSFullAccess

Outputs:
  BucketName:
    Description: Name of the S3 bucket
    Value: !Ref S3Bucket
  SNSTopicARN:
    Description: ARN of the SNS topic
    Value: !Ref SNSTopic
  EmailSubscription:
    Description: Email address for notifications
    Value: !Ref EmailAddress
```

------
#### [ JSON ]

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "[AWSDocs] EventBridge: event-bus-rule-get-started",
  "Parameters": {
    "BucketName": {
      "Type": "String",
      "Description": "Name of the S3 bucket (must be globally unique)"
    },
    "SNSTopicDisplayName": {
      "Type": "String",
      "Description": "Display name for the SNS topic",
      "Default": "eventbridge-rule-example-target"
    },
    "SNSTopicName": {
      "Type": "String",
      "Description": "Name for the SNS topic",
      "Default": "eventbridge-rule-example-target"
    },
    "RuleName": {
      "Type": "String",
      "Description": "Name for the EventBridge rule",
      "Default": "eventbridge-rule-example"
    },
    "EmailAddress": {
      "Type": "String",
      "Description": "Email address to receive notifications",
      "AllowedPattern": "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+[a-zA-Z0-9-]*(\\.[a-zA-Z0-9-]+)*$"
    }
  },
  "Resources": {
    "S3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": {
          "Ref": "BucketName"
        },
        "NotificationConfiguration": {
          "EventBridgeConfiguration": {
            "EventBridgeEnabled": true
          }
        }
      }
    },
    "EmptyBucketFunction": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Runtime": "python3.12",
        "Handler": "index.handler",
        "Timeout": 60,
        "Role": {
          "Fn::GetAtt": ["EmptyBucketRole", "Arn"]
        },
        "Code": {
          "ZipFile": "import boto3\nimport cfnresponse\ndef handler(event, context):\n    bucket = event['ResourceProperties']['BucketName']\n    if event['RequestType'] == 'Delete':\n        s3 = boto3.resource('s3')\n        bucket_resource = s3.Bucket(bucket)\n        bucket_resource.objects.all().delete()\n    cfnresponse.send(event, context, cfnresponse.SUCCESS, {})"
        }
      }
    },
    "EmptyBucketRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "lambda.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
        ],
        "Policies": [
          {
            "PolicyName": "EmptyBucketPolicy",
            "PolicyDocument": {
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Effect": "Allow",
                  "Action": ["s3:DeleteObject", "s3:ListBucket"],
                  "Resource": [
                    {"Fn::Sub": "arn:aws:s3:::${BucketName}"},
                    {"Fn::Sub": "arn:aws:s3:::${BucketName}/*"}
                  ]
                }
              ]
            }
          }
        ]
      }
    },
    "EmptyBucketOnDelete": {
      "Type": "Custom::EmptyBucket",
      "Properties": {
        "ServiceToken": {
          "Fn::GetAtt": ["EmptyBucketFunction", "Arn"]
        },
        "BucketName": {
          "Ref": "S3Bucket"
        }
      }
    },
    "SNSTopic": {
      "Type": "AWS::SNS::Topic",
      "Properties": {
        "DisplayName": {
          "Ref": "SNSTopicDisplayName"
        },
        "TopicName": {
          "Ref": "SNSTopicName"
        }
      }
    },
    "SNSSubscription": {
      "Type": "AWS::SNS::Subscription",
      "Properties": {
        "Protocol": "email",
        "Endpoint": {
          "Ref": "EmailAddress"
        },
        "TopicArn": {
          "Ref": "SNSTopic"
        }
      }
    },
    "EventBridgeRule": {
      "Type": "AWS::Events::Rule",
      "Properties": {
        "Name": {
          "Ref": "RuleName"
        },
        "Description": "Rule to detect S3 object creation and send email notification",
        "EventPattern": {
          "source": [
            "aws.s3"
          ],
          "detail-type": [
            "Object Created"
          ],
          "detail": {
            "bucket": {
              "name": [
                {
                  "Ref": "BucketName"
                }
              ]
            }
          }
        },
        "State": "ENABLED",
        "Targets": [
          {
            "Id": "SendToSNS",
            "Arn": {
              "Ref": "SNSTopic"
            },
            "RoleArn": {
              "Fn::GetAtt": [
                "EventBridgeRole",
                "Arn"
              ]
            }
          }
        ]
      }
    },
    "EventBridgeRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "events.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns": [
          "arn:aws:iam::aws:policy/AmazonSNSFullAccess"
        ]
      }
    }
  },
  "Outputs": {
    "BucketName": {
      "Description": "Name of the S3 bucket",
      "Value": {
        "Ref": "S3Bucket"
      }
    },
    "SNSTopicARN": {
      "Description": "ARN of the SNS topic",
      "Value": {
        "Ref": "SNSTopic"
      }
    },
    "EmailSubscription": {
      "Description": "Email address for notifications",
      "Value": {
        "Ref": "EmailAddress"
      }
    }
  }
}
```

------